From 8b2bf85a000a7bb2cb3c2a8ffb69176b3548b0cc Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 30 Sep 2021 22:48:02 +0200 Subject: [PATCH 001/192] Update app with current skeleton --- .babelrc | 33 - .browserslistrc | 5 + .env | 8 + .env.production | 1 + .eslintignore | 2 + .eslintrc.js | 54 + .githooks/dep-check | 10 + .github/pull_request_template.md | 9 + .gitignore | 54 +- .husky/.gitignore | 1 + .husky/post-merge | 4 + .husky/pre-push | 4 + .prettierignore | 4 + .prettierrc.js | 10 +- .travis.yml | 41 + LICENSE | 674 + README.md | 95 +- app-favicon.ico | Bin 1150 -> 0 bytes babel.config.js | 3 + config/fileMock.js | 3 + config/styleMock.js | 3 + config/testHelpers.js | 8 + config/testSetup.ts | 13 + craco.config.js | 30 + css/font-awesome/css/font-awesome.min.css | 4 - css/font-awesome/fonts/FontAwesome.otf | Bin 85908 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 56006 -> 0 bytes .../fonts/fontawesome-webfont.svg | 520 - .../fonts/fontawesome-webfont.ttf | Bin 112160 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 65452 -> 0 bytes css/fonts/LiberationSans-Bold-webfont.eot | Bin 32630 -> 0 bytes css/fonts/LiberationSans-Bold-webfont.svg | 154 - css/fonts/LiberationSans-Bold-webfont.ttf | Bin 32428 -> 0 bytes css/fonts/LiberationSans-Bold-webfont.woff | Bin 20808 -> 0 bytes css/fonts/LiberationSans-Regular-webfont.eot | Bin 47622 -> 0 bytes css/fonts/LiberationSans-Regular-webfont.svg | 262 - css/fonts/LiberationSans-Regular-webfont.ttf | Bin 47408 -> 0 bytes css/fonts/LiberationSans-Regular-webfont.woff | Bin 29356 -> 0 bytes css/fonts/padauk-bold-webfont.eot | Bin 16429 -> 0 bytes css/fonts/padauk-bold-webfont.svg | 134 - css/fonts/padauk-bold-webfont.ttf | Bin 45896 -> 0 bytes css/fonts/padauk-bold-webfont.woff | Bin 18128 -> 0 bytes css/fonts/padauk-webfont.eot | Bin 16581 -> 0 bytes css/fonts/padauk-webfont.svg | 134 - css/fonts/padauk-webfont.ttf | Bin 46292 -> 0 bytes css/fonts/padauk-webfont.woff | Bin 18192 -> 0 bytes .../roboto-v15-latin-ext_latin-100.eot | Bin 23332 -> 0 bytes .../roboto-v15-latin-ext_latin-100.svg | 313 - .../roboto-v15-latin-ext_latin-100.ttf | Bin 51608 -> 0 bytes .../roboto-v15-latin-ext_latin-100.woff | Bin 26372 -> 0 bytes .../roboto-v15-latin-ext_latin-100.woff2 | Bin 20944 -> 0 bytes .../roboto-v15-latin-ext_latin-300.eot | Bin 23490 -> 0 bytes .../roboto-v15-latin-ext_latin-300.svg | 314 - .../roboto-v15-latin-ext_latin-300.ttf | Bin 50880 -> 0 bytes .../roboto-v15-latin-ext_latin-300.woff | Bin 26528 -> 0 bytes .../roboto-v15-latin-ext_latin-300.woff2 | Bin 21008 -> 0 bytes .../roboto-v15-latin-ext_latin-500.eot | Bin 23631 -> 0 bytes .../roboto-v15-latin-ext_latin-500.svg | 305 - .../roboto-v15-latin-ext_latin-500.ttf | Bin 50764 -> 0 bytes .../roboto-v15-latin-ext_latin-500.woff | Bin 26516 -> 0 bytes .../roboto-v15-latin-ext_latin-500.woff2 | Bin 21116 -> 0 bytes .../roboto-v15-latin-ext_latin-700.eot | Bin 23564 -> 0 bytes .../roboto-v15-latin-ext_latin-700.svg | 310 - .../roboto-v15-latin-ext_latin-700.ttf | Bin 50724 -> 0 bytes .../roboto-v15-latin-ext_latin-700.woff | Bin 26572 -> 0 bytes .../roboto-v15-latin-ext_latin-700.woff2 | Bin 21128 -> 0 bytes .../roboto-v15-latin-ext_latin-900.eot | Bin 23485 -> 0 bytes .../roboto-v15-latin-ext_latin-900.svg | 304 - .../roboto-v15-latin-ext_latin-900.ttf | Bin 50820 -> 0 bytes .../roboto-v15-latin-ext_latin-900.woff | Bin 26540 -> 0 bytes .../roboto-v15-latin-ext_latin-900.woff2 | Bin 21024 -> 0 bytes .../roboto-v15-latin-ext_latin-regular.eot | Bin 23615 -> 0 bytes .../roboto-v15-latin-ext_latin-regular.svg | 308 - .../roboto-v15-latin-ext_latin-regular.ttf | Bin 51100 -> 0 bytes .../roboto-v15-latin-ext_latin-regular.woff | Bin 26588 -> 0 bytes .../roboto-v15-latin-ext_latin-regular.woff2 | Bin 21076 -> 0 bytes css/fonts/roboto.css | 72 - css/material-design-icons/material-icons.css | 38 - cypress.json | 4 + cypress/fixtures/example.json | 5 + cypress/integration/landing-page.spec.ts | 19 + cypress/plugins/index.js | 11 + cypress/support/App.ts | 57 + cypress/support/commands.ts | 28 + cypress/support/index.js | 2 + cypress/support/utils.ts | 35 + cypress/tsconfig.json | 10 + i18n/en.pot | 93 + i18n/es.po | 102 + includes/feedback-tool/feedback-dhis2.js | 135 - includes/feedback-tool/feedback-github.js | 161 - includes/feedback-tool/feedback.css | 369 - includes/feedback-tool/feedback.js | 4427 ---- index.html | 31 - jest.config.js | 23 + package.json | 247 +- .../app-config}/app-config-default.json | 0 .../app-config}/app-config-nrc.json | 0 .../app-config}/app-config-who.json | 0 .../app-config}/app-config.example.json | 0 public/favicon.ico | Bin 0 -> 4286 bytes public/feedback-tool/feedback-dhis2.min.js | 1 + public/feedback-tool/feedback-github.min.js | 1 + public/feedback-tool/feedback.min.css | 1 + public/feedback-tool/feedback.min.js | 6 + .../feedback-tool/i18n/en.properties | 0 .../feedback-tool/i18n/es.properties | 0 {includes => public}/feedback-tool/icons.png | Bin .../feedback-tool/spinner.gif | Bin .../MaterialIcons-Regular.eot | Bin .../MaterialIcons-Regular.ttf | Bin .../MaterialIcons-Regular.woff | Bin .../MaterialIcons-Regular.woff2 | Bin .../material-design-icons/material-icons.css | 35 + public/includes/roboto-font.css | 42 + public/index.html | 53 + public/manifest.json | 15 + .../old-i18n}/i18n_module_ar.properties | 0 .../old-i18n}/i18n_module_en.properties | 0 .../old-i18n}/i18n_module_es.properties | 0 .../old-i18n}/i18n_module_fr.properties | 0 resources/scripts/clean-i18n-translations.js | 82 - scss/DataTable/DataTable.scss | 41 - scss/HeaderBar/HeaderBar.scss | 3 - scss/List/DetailsBox.scss | 30 - scss/List/List.scss | 103 - scss/app.scss | 28 - scss/variables.scss | 2 - src/App/App.component.js | 125 - src/CompositionRoot.ts | 43 + src/List/LoadingStatus.component.js | 23 - src/List/SearchBox.component.js | 74 - src/List/context.actions.js | 184 - src/app-config.ts | 43 + src/app.js | 72 - src/components/Share.component.js | 139 - .../DataTableHeader.component.js | 57 - .../MultipleDataTable.component.js | 388 - .../MultipleDataTableContextMenu.component.js | 104 - .../MultipleDataTableRow.component.js | 214 - .../MultipleDataTableRow.scss | 38 - src/data-table/DataTable.component.js | 114 - .../DataTableContextMenu.component.js | 69 - src/data-table/DataTableHeader.component.js | 55 - src/data-table/DataTableRow.component.js | 86 - src/data-table/data-value/Color.component.js | 19 - src/data-table/data-value/valueRenderers.js | 165 - src/data/entities/Instance.ts | 21 + .../repositories/InstanceD2ApiRepository.ts | 24 + src/data/repositories/UserD2ApiRepository.ts | 107 + src/domain/entities/Either.ts | 68 + src/domain/entities/Future.ts | 118 + src/domain/entities/PaginatedResponse.ts | 11 + src/domain/entities/Ref.ts | 9 + src/domain/entities/User.ts | 41 + src/domain/repositories/InstanceRepository.ts | 6 + src/domain/repositories/UserRepository.ts | 9 + src/domain/usecases/GetCurrentUserUseCase.ts | 12 + .../usecases/GetInstanceVersionUseCase.ts | 11 + src/domain/usecases/GetUserByIdUseCase.ts | 12 + src/domain/usecases/ListUsersUseCase.ts | 13 + src/index.tsx | 98 + src/legacy/App/App.component.js | 84 + src/{ => legacy}/App/app.theme.js | 0 src/{ => legacy}/App/appStateStore.js | 32 +- src/legacy/LegacyApp.jsx | 31 + src/{ => legacy}/List/DetailsBox.component.js | 95 +- .../List/DetailsBoxWithScroll.component.js | 12 +- src/{ => legacy}/List/Filters.component.js | 86 +- src/{ => legacy}/List/List.component.js | 433 +- src/legacy/List/context.actions.js | 45 + src/{ => legacy}/List/copyInUser.store.js | 0 src/{ => legacy}/List/deleteUser.store.js | 7 +- src/{ => legacy}/List/details.store.js | 0 src/{ => legacy}/List/enable.store.js | 0 src/{ => legacy}/List/list.actions.js | 1 - src/{ => legacy}/List/list.store.js | 13 +- .../OrgUnitDialog.component.js | 72 +- .../organisationUnitDialogStore.js | 0 src/{ => legacy}/List/replicateUser.store.js | 0 src/{ => legacy}/List/userGroups.store.js | 0 src/{ => legacy}/List/userRoles.store.js | 0 .../Snackbar/SnackbarContainer.component.js | 40 +- src/{ => legacy}/Snackbar/snack.actions.js | 0 src/{ => legacy}/Snackbar/snack.store.js | 0 .../components/CopyInUserDialog.component.js | 2 +- .../components/Dropdown.component.js | 125 +- .../FilteredMultiSelect.component.js | 4 +- .../components/ImportExport.component.js | 37 +- .../components/ImportTable.component.js | 268 +- src/{ => legacy}/components/InfoDialog.js | 28 +- .../components/ModalLoadingMask.component.js | 0 .../components/MultiSelect.component.js | 85 +- .../components/MultipleFilter.component.js | 65 +- .../components/MultipleSelector.component.js | 53 +- src/{ => legacy}/components/OrgUnitForm.js | 42 +- .../components/OrgUnitsFilter.component.js | 68 +- .../ReplicateUserFromTable.component.js | 21 +- .../ReplicateUserFromTemplate.component.js | 71 +- .../components/SettingsDialog.component.js | 99 +- .../components/TableLayout.component.js | 37 +- .../components/UserGroupsDialog.component.js | 20 +- .../components/UserRolesDialog.component.js | 0 .../BatchModelsMultiSelect.component.js | 73 +- .../BatchModelsMultiSelect.model.js | 32 +- ...yInUserBatchModelsMultiSelect.component.js | 96 +- .../CopyInUserBatchModelsMultiSelect.model.js | 18 +- src/{ => legacy}/images/logo-eyeseetea.png | Bin .../loading-mask/LoadingMask.component.js | 8 +- src/{ => legacy}/models/settings.js | 10 +- src/{ => legacy}/models/user.js | 6 +- src/{ => legacy}/models/userHelpers.js | 169 +- src/{ => legacy}/models/userList.js | 13 - src/{ => legacy}/utils/dhis2Helpers.js | 26 +- src/{ => legacy}/utils/i18n.js | 9 +- src/{ => legacy}/utils/lodash-mixins.js | 9 +- src/{ => legacy}/utils/template.js | 2 + src/{ => legacy}/utils/validators.js | 1 + src/router.js | 43 - src/setupProxy.js | 48 + src/types/d2-api.ts | 5 + src/types/d2-ui.d.ts | 3 + src/types/d2.d.ts | 6 + src/types/i18n.d.ts | 4 + src/types/utils.ts | 66 + src/utils/ObservedEvents.mixin.js | 45 - src/utils/ObserverRegistry.mixin.js | 15 - src/utils/Translate.mixin.js | 13 - src/utils/cache.ts | 104 + src/utils/codec.ts | 137 + src/utils/d2-api.ts | 13 + src/utils/futures.ts | 11 + src/utils/tests.tsx | 50 + src/utils/uid.ts | 59 + .../components/page-header/PageHeader.tsx | 66 + src/webapp/components/share/Share.tsx | 133 + .../components/share/logo-eyeseetea.png | Bin 0 -> 16196 bytes .../user-list-table/UserListTable.tsx | 220 + src/webapp/contexts/app-context.ts | 22 + src/webapp/pages/Router.tsx | 21 + src/webapp/pages/app/App.css | 16 + src/webapp/pages/app/App.tsx | 81 + src/webapp/pages/app/AppConfig.ts | 21 + .../pages/app/themes/dhis2-legacy.theme.ts | 63 + src/webapp/pages/app/themes/dhis2.theme.ts | 91 + src/webapp/utils/wdyr.ts | 11 + test/App/App.component.test.js | 19 - test/HeaderBar/HeaderBar.component.test.js | 19 - test/List/DetailsBox.component.test.js | 182 - test/List/List.component.test.js | 19 - test/List/dataElementObject.fixture.js | 153 - test/List/list.store.test.js | 3 - .../MainContent/MainContent.component.test.js | 19 - test/config/inject-theme.js | 12 - test/config/karma.config.js | 64 - test/config/testSetup.js | 13 - test/index.js | 2 - tsconfig.json | 26 + webpack.config.js | 154 - yarn.lock | 18235 +++++++++++----- 260 files changed, 17736 insertions(+), 18014 deletions(-) delete mode 100644 .babelrc create mode 100644 .browserslistrc create mode 100644 .env create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100755 .githooks/dep-check create mode 100644 .github/pull_request_template.md create mode 100644 .husky/.gitignore create mode 100755 .husky/post-merge create mode 100755 .husky/pre-push create mode 100644 .prettierignore create mode 100644 .travis.yml create mode 100644 LICENSE delete mode 100644 app-favicon.ico create mode 100644 babel.config.js create mode 100644 config/fileMock.js create mode 100644 config/styleMock.js create mode 100644 config/testHelpers.js create mode 100644 config/testSetup.ts create mode 100644 craco.config.js delete mode 100644 css/font-awesome/css/font-awesome.min.css delete mode 100644 css/font-awesome/fonts/FontAwesome.otf delete mode 100644 css/font-awesome/fonts/fontawesome-webfont.eot delete mode 100644 css/font-awesome/fonts/fontawesome-webfont.svg delete mode 100644 css/font-awesome/fonts/fontawesome-webfont.ttf delete mode 100644 css/font-awesome/fonts/fontawesome-webfont.woff delete mode 100644 css/fonts/LiberationSans-Bold-webfont.eot delete mode 100644 css/fonts/LiberationSans-Bold-webfont.svg delete mode 100644 css/fonts/LiberationSans-Bold-webfont.ttf delete mode 100644 css/fonts/LiberationSans-Bold-webfont.woff delete mode 100644 css/fonts/LiberationSans-Regular-webfont.eot delete mode 100644 css/fonts/LiberationSans-Regular-webfont.svg delete mode 100644 css/fonts/LiberationSans-Regular-webfont.ttf delete mode 100644 css/fonts/LiberationSans-Regular-webfont.woff delete mode 100644 css/fonts/padauk-bold-webfont.eot delete mode 100644 css/fonts/padauk-bold-webfont.svg delete mode 100644 css/fonts/padauk-bold-webfont.ttf delete mode 100644 css/fonts/padauk-bold-webfont.woff delete mode 100644 css/fonts/padauk-webfont.eot delete mode 100644 css/fonts/padauk-webfont.svg delete mode 100644 css/fonts/padauk-webfont.ttf delete mode 100644 css/fonts/padauk-webfont.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff2 delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff2 delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.svg delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff delete mode 100644 css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 delete mode 100644 css/fonts/roboto.css delete mode 100644 css/material-design-icons/material-icons.css create mode 100644 cypress.json create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/integration/landing-page.spec.ts create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/App.ts create mode 100644 cypress/support/commands.ts create mode 100644 cypress/support/index.js create mode 100644 cypress/support/utils.ts create mode 100644 cypress/tsconfig.json create mode 100644 i18n/en.pot create mode 100644 i18n/es.po delete mode 100644 includes/feedback-tool/feedback-dhis2.js delete mode 100644 includes/feedback-tool/feedback-github.js delete mode 100644 includes/feedback-tool/feedback.css delete mode 100644 includes/feedback-tool/feedback.js delete mode 100644 index.html create mode 100644 jest.config.js rename {app-config => public/app-config}/app-config-default.json (100%) rename {app-config => public/app-config}/app-config-nrc.json (100%) rename {app-config => public/app-config}/app-config-who.json (100%) rename {app-config => public/app-config}/app-config.example.json (100%) create mode 100644 public/favicon.ico create mode 100644 public/feedback-tool/feedback-dhis2.min.js create mode 100644 public/feedback-tool/feedback-github.min.js create mode 100644 public/feedback-tool/feedback.min.css create mode 100644 public/feedback-tool/feedback.min.js rename {includes => public}/feedback-tool/i18n/en.properties (100%) rename {includes => public}/feedback-tool/i18n/es.properties (100%) rename {includes => public}/feedback-tool/icons.png (100%) rename {includes => public}/feedback-tool/spinner.gif (100%) rename {css => public/includes}/material-design-icons/MaterialIcons-Regular.eot (100%) rename {css => public/includes}/material-design-icons/MaterialIcons-Regular.ttf (100%) rename {css => public/includes}/material-design-icons/MaterialIcons-Regular.woff (100%) rename {css => public/includes}/material-design-icons/MaterialIcons-Regular.woff2 (100%) create mode 100644 public/includes/material-design-icons/material-icons.css create mode 100644 public/includes/roboto-font.css create mode 100644 public/index.html create mode 100644 public/manifest.json rename {src/i18n => public/old-i18n}/i18n_module_ar.properties (100%) rename {src/i18n => public/old-i18n}/i18n_module_en.properties (100%) rename {src/i18n => public/old-i18n}/i18n_module_es.properties (100%) rename {src/i18n => public/old-i18n}/i18n_module_fr.properties (100%) delete mode 100755 resources/scripts/clean-i18n-translations.js delete mode 100644 scss/DataTable/DataTable.scss delete mode 100644 scss/HeaderBar/HeaderBar.scss delete mode 100644 scss/List/DetailsBox.scss delete mode 100644 scss/List/List.scss delete mode 100644 scss/app.scss delete mode 100644 scss/variables.scss delete mode 100644 src/App/App.component.js create mode 100644 src/CompositionRoot.ts delete mode 100644 src/List/LoadingStatus.component.js delete mode 100644 src/List/SearchBox.component.js delete mode 100644 src/List/context.actions.js create mode 100644 src/app-config.ts delete mode 100644 src/app.js delete mode 100644 src/components/Share.component.js delete mode 100644 src/components/multiple-data-table/DataTableHeader.component.js delete mode 100644 src/components/multiple-data-table/MultipleDataTable.component.js delete mode 100644 src/components/multiple-data-table/MultipleDataTableContextMenu.component.js delete mode 100644 src/components/multiple-data-table/MultipleDataTableRow.component.js delete mode 100644 src/components/multiple-data-table/MultipleDataTableRow.scss delete mode 100644 src/data-table/DataTable.component.js delete mode 100644 src/data-table/DataTableContextMenu.component.js delete mode 100644 src/data-table/DataTableHeader.component.js delete mode 100644 src/data-table/DataTableRow.component.js delete mode 100644 src/data-table/data-value/Color.component.js delete mode 100644 src/data-table/data-value/valueRenderers.js create mode 100644 src/data/entities/Instance.ts create mode 100644 src/data/repositories/InstanceD2ApiRepository.ts create mode 100644 src/data/repositories/UserD2ApiRepository.ts create mode 100644 src/domain/entities/Either.ts create mode 100644 src/domain/entities/Future.ts create mode 100644 src/domain/entities/PaginatedResponse.ts create mode 100644 src/domain/entities/Ref.ts create mode 100644 src/domain/entities/User.ts create mode 100644 src/domain/repositories/InstanceRepository.ts create mode 100644 src/domain/repositories/UserRepository.ts create mode 100644 src/domain/usecases/GetCurrentUserUseCase.ts create mode 100644 src/domain/usecases/GetInstanceVersionUseCase.ts create mode 100644 src/domain/usecases/GetUserByIdUseCase.ts create mode 100644 src/domain/usecases/ListUsersUseCase.ts create mode 100644 src/index.tsx create mode 100644 src/legacy/App/App.component.js rename src/{ => legacy}/App/app.theme.js (100%) rename src/{ => legacy}/App/appStateStore.js (85%) create mode 100644 src/legacy/LegacyApp.jsx rename src/{ => legacy}/List/DetailsBox.component.js (65%) rename src/{ => legacy}/List/DetailsBoxWithScroll.component.js (91%) rename src/{ => legacy}/List/Filters.component.js (83%) rename src/{ => legacy}/List/List.component.js (61%) create mode 100644 src/legacy/List/context.actions.js rename src/{ => legacy}/List/copyInUser.store.js (100%) rename src/{ => legacy}/List/deleteUser.store.js (88%) rename src/{ => legacy}/List/details.store.js (100%) rename src/{ => legacy}/List/enable.store.js (100%) rename src/{ => legacy}/List/list.actions.js (96%) rename src/{ => legacy}/List/list.store.js (93%) rename src/{ => legacy}/List/organisation-unit-dialog/OrgUnitDialog.component.js (79%) rename src/{ => legacy}/List/organisation-unit-dialog/organisationUnitDialogStore.js (100%) rename src/{ => legacy}/List/replicateUser.store.js (100%) rename src/{ => legacy}/List/userGroups.store.js (100%) rename src/{ => legacy}/List/userRoles.store.js (100%) rename src/{ => legacy}/Snackbar/SnackbarContainer.component.js (72%) rename src/{ => legacy}/Snackbar/snack.actions.js (100%) rename src/{ => legacy}/Snackbar/snack.store.js (100%) rename src/{ => legacy}/components/CopyInUserDialog.component.js (98%) rename src/{ => legacy}/components/Dropdown.component.js (64%) rename src/{ => legacy}/components/FilteredMultiSelect.component.js (98%) rename src/{ => legacy}/components/ImportExport.component.js (82%) rename src/{ => legacy}/components/ImportTable.component.js (83%) rename src/{ => legacy}/components/InfoDialog.js (77%) rename src/{ => legacy}/components/ModalLoadingMask.component.js (100%) rename src/{ => legacy}/components/MultiSelect.component.js (69%) rename src/{ => legacy}/components/MultipleFilter.component.js (81%) rename src/{ => legacy}/components/MultipleSelector.component.js (83%) rename src/{ => legacy}/components/OrgUnitForm.js (90%) rename src/{ => legacy}/components/OrgUnitsFilter.component.js (81%) rename src/{ => legacy}/components/ReplicateUserFromTable.component.js (89%) rename src/{ => legacy}/components/ReplicateUserFromTemplate.component.js (83%) rename src/{ => legacy}/components/SettingsDialog.component.js (58%) rename src/{ => legacy}/components/TableLayout.component.js (81%) rename src/{ => legacy}/components/UserGroupsDialog.component.js (89%) rename src/{ => legacy}/components/UserRolesDialog.component.js (100%) rename src/{ => legacy}/components/batch-models-multi-select/BatchModelsMultiSelect.component.js (82%) rename src/{ => legacy}/components/batch-models-multi-select/BatchModelsMultiSelect.model.js (76%) rename src/{ => legacy}/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js (84%) rename src/{ => legacy}/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js (84%) rename src/{ => legacy}/images/logo-eyeseetea.png (100%) rename src/{ => legacy}/loading-mask/LoadingMask.component.js (80%) rename src/{ => legacy}/models/settings.js (92%) rename src/{ => legacy}/models/user.js (96%) rename src/{ => legacy}/models/userHelpers.js (79%) rename src/{ => legacy}/models/userList.js (93%) rename src/{ => legacy}/utils/dhis2Helpers.js (79%) rename src/{ => legacy}/utils/i18n.js (69%) rename src/{ => legacy}/utils/lodash-mixins.js (92%) rename src/{ => legacy}/utils/template.js (89%) rename src/{ => legacy}/utils/validators.js (98%) delete mode 100644 src/router.js create mode 100644 src/setupProxy.js create mode 100644 src/types/d2-api.ts create mode 100644 src/types/d2-ui.d.ts create mode 100644 src/types/d2.d.ts create mode 100644 src/types/i18n.d.ts create mode 100644 src/types/utils.ts delete mode 100644 src/utils/ObservedEvents.mixin.js delete mode 100644 src/utils/ObserverRegistry.mixin.js delete mode 100644 src/utils/Translate.mixin.js create mode 100644 src/utils/cache.ts create mode 100644 src/utils/codec.ts create mode 100644 src/utils/d2-api.ts create mode 100644 src/utils/futures.ts create mode 100644 src/utils/tests.tsx create mode 100644 src/utils/uid.ts create mode 100644 src/webapp/components/page-header/PageHeader.tsx create mode 100644 src/webapp/components/share/Share.tsx create mode 100644 src/webapp/components/share/logo-eyeseetea.png create mode 100644 src/webapp/components/user-list-table/UserListTable.tsx create mode 100644 src/webapp/contexts/app-context.ts create mode 100644 src/webapp/pages/Router.tsx create mode 100644 src/webapp/pages/app/App.css create mode 100644 src/webapp/pages/app/App.tsx create mode 100644 src/webapp/pages/app/AppConfig.ts create mode 100644 src/webapp/pages/app/themes/dhis2-legacy.theme.ts create mode 100644 src/webapp/pages/app/themes/dhis2.theme.ts create mode 100644 src/webapp/utils/wdyr.ts delete mode 100644 test/App/App.component.test.js delete mode 100644 test/HeaderBar/HeaderBar.component.test.js delete mode 100644 test/List/DetailsBox.component.test.js delete mode 100644 test/List/List.component.test.js delete mode 100644 test/List/dataElementObject.fixture.js delete mode 100644 test/List/list.store.test.js delete mode 100644 test/MainContent/MainContent.component.test.js delete mode 100644 test/config/inject-theme.js delete mode 100644 test/config/karma.config.js delete mode 100644 test/config/testSetup.js delete mode 100644 test/index.js create mode 100644 tsconfig.json delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 2a6c007..0000000 --- a/.babelrc +++ /dev/null @@ -1,33 +0,0 @@ -{ - "presets": ["stage-0", "react"], - "plugins": [ - "transform-class-properties", - "transform-es2015-template-literals", - "transform-es2015-literals", - "transform-es2015-function-name", - "transform-es2015-arrow-functions", - "transform-es2015-block-scoped-functions", - "transform-es2015-classes", - "transform-es2015-object-super", - "transform-es2015-shorthand-properties", - "transform-es2015-computed-properties", - "transform-es2015-for-of", - "transform-es2015-sticky-regex", - "transform-es2015-unicode-regex", - "check-es2015-constants", - "transform-es2015-spread", - "transform-es2015-parameters", - "transform-es2015-destructuring", - "transform-es2015-block-scoping", - "transform-es2015-typeof-symbol", - ["transform-regenerator", { "async": false, "asyncGenerators": false }] - ], - "env": { - "test": { - "presets": ["stage-0", "react", "es2015"], - "plugins": [ - "transform-class-properties" - ] - } - } -} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..cedbd17 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,5 @@ +> 0.5% +last 2 versions +Firefox ESR +ie 11 +not dead diff --git a/.env b/.env new file mode 100644 index 0000000..e99a73e --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +BROWSER=false +PORT=8081 +SKIP_PREFLIGHT_CHECK=true +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play + +CYPRESS_DHIS2_AUTH='admin:district' +CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" +CYPRESS_ROOT_URL=http://localhost:8081 diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..ba7cc18 --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +GENERATE_SOURCEMAP=false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..f00f19e --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +/**/*.d.ts +/src/locales diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..40478c0 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,54 @@ +/** @format */ + +module.exports = { + extends: [ + "react-app", + "eslint:recommended", + "plugin:react/recommended", + "plugin:cypress/recommended", + "plugin:@typescript-eslint/recommended", + ], + parser: "@typescript-eslint/parser", + rules: { + "no-console": ["warn", { allow: ["debug", "warn", "error"] }], + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/explicit-function-return-type": ["off"], + "unused-imports/no-unused-imports": "warn", + "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }], + "react/prop-types": "off", + "react/display-name": "off", + "react/react-in-jsx-scope": "off", + "no-unused-expressions": "off", + "no-useless-concat": "off", + "no-useless-constructor": "off", + "no-unexpected-multiline": "off", + "default-case": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/indent": "off", + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/type-annotation-spacing": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "no-use-before-define": "off", + "no-debugger": "warn", + "no-extra-semi": "off", + "no-mixed-spaces-and-tabs": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + }, + plugins: ["cypress", "@typescript-eslint", "react-hooks", "unused-imports"], + env: { "cypress/globals": true }, + settings: { + react: { + pragma: "React", + version: "16.6.0", + }, + }, +}; diff --git a/.githooks/dep-check b/.githooks/dep-check new file mode 100755 index 0000000..fcfd4ba --- /dev/null +++ b/.githooks/dep-check @@ -0,0 +1,10 @@ +#!/bin/sh + +function changed { + git diff --name-only HEAD@{1} HEAD | grep "^$1" > /dev/null 2>&1 +} + +if changed 'yarn.lock'; then + echo "Lockfile changes detected. Installing updates..." + yarn install +fi diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7b3ce9d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,9 @@ +### :pushpin: References + +- **Issue:** Closes #? + +### :memo: Implementation + +### :art: Screenshots + +### :fire: Testing diff --git a/.gitignore b/.gitignore index b1b36af..f93cc1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,40 @@ -*.iml -.idea/* -package-lock.json -node_modules* -.sass-cache -src/css/* -coverage/* +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# testing +/coverage + +# production manifest.webapp -*.zip +/build -# TODO: Jshint is a dependency of the git hook which installs these files on install... -.jshintignore -.jshintrc +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +*.sublime-project +*.sublime-workspace +*.code-workspace +*.zip -# Build folders 'build' for building the project 'target' being for the Maven deploy -build/* -target/* +npm-debug.log* +yarn-debug.log* +yarn-error.log* -npm-debug.log -stats.json +src/locales/ +src/react-app.d.ts +src/react-app-env.d.ts +bak +.eslintcache -.vscode* +# cypress +cypress/screenshots/ +cypress/videos/ +cypress/fixtures/ -# Ignore config.js -config.js -app-config.json +# IntelliJ +.idea/* diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/post-merge b/.husky/post-merge new file mode 100755 index 0000000..d3b6c10 --- /dev/null +++ b/.husky/post-merge @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +./.githooks/dep-check diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..085ecbb --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn prettify && yarn lint && yarn update-po && yarn test diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b6fcbef --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +build +node_modules +*.min.js +*.min.css diff --git a/.prettierrc.js b/.prettierrc.js index 9ba9d26..b54667b 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,18 +1,18 @@ /** @format */ module.exports = { - printWidth: 100, + printWidth: 120, tabWidth: 4, useTabs: false, semi: true, singleQuote: false, - trailingComma: 'es5', + trailingComma: "es5", bracketSpacing: true, jsxBracketSameLine: false, - arrowParens: 'avoid', + arrowParens: "avoid", rangeStart: 0, rangeEnd: Infinity, - proseWrap: 'preserve', + proseWrap: "preserve", requirePragma: false, insertPragma: false, -} \ No newline at end of file +}; diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3a97d81 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ +language: node_js +node_js: + - 12.13.0 +dist: bionic +cache: + directories: + - "$HOME/.cache" +before_install: + - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p + # Install python dependencies + - sudo apt-get update + - sudo apt-get install python3 python python3-setuptools docker.io docker-compose + # Install d2-docker + - git clone https://github.com/EyeSeeTea/d2-docker.git + - cd d2-docker/ + - sudo python3 setup.py install + - d2-docker --help + # Hack to not be prompted in the terminal + - sudo apt-get remove golang-docker-credential-helpers + # Start docker service + - sudo systemctl unmask docker.service + - sudo systemctl unmask docker.socket + - sudo systemctl start docker.service + # Login to docker + - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + # Start docker service + - d2-docker start eyeseetea/dhis2-data:2.30-sierra-leone -d --port 8080 +install: + - yarn install --frozen-lockfile + - yarn cy:verify + - yarn build +script: + - PORT=8081 REACT_APP_DHIS2_BASE_URL=http://localhost:8080 REACT_APP_CYPRESS=true yarn start & + - yarn wait-on http-get://localhost:8081 + - yarn wait-on http-get://localhost:8080 + - CYPRESS_EXTERNAL_API=http://localhost:8080 CYPRESS_ROOT_URL=http://localhost:8081 yarn cy:e2e:run --record --key $CYPRESS_KEY + - kill $(jobs -p) || true +addons: + apt: + packages: + - libgconf-2-4 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index ba2e7d3..bf0314e 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,87 @@ -# User App +## Setup -User App is a Dhis2 Web Application that provides an easy and integrated way to do common operations on Dhis2 users which would be burdensome to perform using the in-built Dhis2 User management application. +Install dependencies: -## Features +``` +$ yarn install +``` -- Landing page: it displays a list of users with some attributes information. The list allows sorting by some fields (click the column header) and single/multiple selections. You can also filter by name, role, groups and see only users you can manage. -- Show details: it behaves as the regular show details in any Dhis2 instance. It shows a right side panel with some information about the user. This is also the action by default when clicking a row. -- Assign to organisation units capture: Implemented for single and multiple selections\* allows setting Data capture and maintenance organisation units. -- Assign to organisation units output: Implemented for single and multiple selections\* allows setting Data output and analysis organisation units. -- Assign roles: Implemented for single and multiple selections\* allows assigning the roles to a user/s. -- Assign to groups: Implemented for single and multiple selections\* allows assigning the user groups for a user/s. -- Shortcut to regular dhis2 user management app -- Replicate user: Implemented for single mode allows creating multiple users using a single users as starting point. Currently, two modes are available: 'From Template' and 'From table'. +## Development -\*In single mode, it works as the regular Dhis2 vanilla feature. For multiple selections, the changes can be saved using one of two strategies: merge or replace. The merge strategy will add the selected entities (organisation units, roles, etc) to the current values each user had, no values will be removed. Replace on the other hand overwrites any previous values and keep only those selected in this dialog. +Start the development server: -## Installation +``` +$ PORT=8081 REACT_APP_DHIS2_BASE_URL="http://localhost:8080" yarn start +``` -Just download the [zip file available for each release](https://github.com/EyeSeeTea/user-extended-app/releases) and install it in your Dhis2 instance using the App management application. +Now in your browser, go to `http://localhost:8081`. -## Documentation +Notes: -You can find a detailed user and developer guide [here](https://docs.google.com/document/d/1XdU57_WvAEJv-grdnXkpqh1K9DY5QUYl-8Bl0vEuboM/edit#). +- Requests to DHIS2 will be transparently proxied (see `src/setupProxy.js`) from `http://localhost:8081/dhis2/path` to `http://localhost:8080/path` to avoid CORS and cross-domain problems. -## Feedback +- The optional environment variable `REACT_APP_DHIS2_AUTH=USERNAME:PASSWORD` forces some credentials to be used by the proxy. This variable is usually not set, so the app has the same user logged in at `REACT_APP_DHIS2_BASE_URL`. -We’d like to hear your thoughts on the app in general, improvements, new features or any of the technologies being used. Just drop as a line at hello@eyeseetea.com and let us know! If you prefer, you can also create a new issue on our GitHub repository. Note that you will have to register and be logged in to GitHub to create a new issue. +- The optional environment variable `REACT_APP_PROXY_LOG_LEVEL` can be helpful to debug the proxyfied requests (accepts: "warn" | "debug" | "info" | "error" | "silent") -## License +- Create a file `.env.local` (copy it from `.env`) to customize environment variables so you can simply run `yarn start`. -This app is licensed under GPLv3. Please respect the terms of that license. +- [why-did-you-render](https://github.com/welldone-software/why-did-you-render) is installed, but it does not work when using standard react scripts (`yarn start`). Instead, use `yarn craco-start` to debug re-renders with WDYR. Note that hot reloading does not work out-of-the-box with [craco](https://github.com/gsoft-inc/craco). + +## Tests + +### Unit tests + +``` +$ yarn test +``` + +### Integration tests (Cypress) + +Create the required users for testing (`cypress/support/App.ts`) in your instance and run: + +``` +$ export CYPRESS_EXTERNAL_API="http://localhost:8080" +$ export CYPRESS_ROOT_URL=http://localhost:8081 + +# non-interactive +$ yarn cy:e2e:run + +# interactive UI +$ yarn cy:e2e:open +``` + +## Build app ZIP + +``` +$ yarn build +``` + +## Some development tips + +### Structure + +- `i18n/`: Contains literal translations (gettext format) +- `public/`: Main app folder with a `index.html`, exposes the APP, contains the feedback-tool. +- `src/pages`: Main React components. +- `src/domain`: Domain layer of the app (clean architecture) +- `src/data`: Data of the app (clean architecture) +- `src/components`: Reusable React components. +- `src/types`: `.d.ts` file types for modules without TS definitions. +- `src/utils`: Misc utilities. +- `src/locales`: Auto-generated, do not update or add to the version control. +- `cypress/integration/`: Cypress integration tests. + +### i18n + +``` +$ yarn localize +``` + +### App context + +The file `src/contexts/app-context.ts` holds some general context so typical infrastructure objects (`api`, `d2`, ...) are readily available. Add your own global objects if necessary. + +### Scripts + +Check the example script, entry `"script-example"`in `package.json`->scripts and `src/scripts/example.ts`. diff --git a/app-favicon.ico b/app-favicon.ico deleted file mode 100644 index 4488d8e1eb66455ddf98c8f0fd21be6164db8e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb8u%PWLY7{~FWLCS5Kgb*eh3wAc-GAozDLPjnzR#Fx$D5S<^<0`@!-iN~ORKj4R+VLk@Xk8{*O z_fucxu=UZzGqCrcB#wd3tRCY~eKS<6bzQLaS;U&R^{2#n&~s{ndeEHK==|ofig@T6 zDL90!*O|MadLQ(D>CCI3_1ec1G;e!oBR+=S$Cg08opAzhXbj}EzBiD&W*meI$|nUV z)|n1N@2BcVpuFf^EJHhPp#Daoy?NosHtx^?4>Dov?WpT$-|AcYdxoC<683R|EZFto f|3e3JCCG)&as`{vesZ85qY$iHcLc+K2de!BUh4WL diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..5824cd5 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ["@babel/typescript", ["babel-preset-react-app", { runtime: "automatic" }]], +}; diff --git a/config/fileMock.js b/config/fileMock.js new file mode 100644 index 0000000..e929565 --- /dev/null +++ b/config/fileMock.js @@ -0,0 +1,3 @@ +// Turns file imports into dummy objects + +module.exports = "test-file-stub"; diff --git a/config/styleMock.js b/config/styleMock.js new file mode 100644 index 0000000..efa0d3c --- /dev/null +++ b/config/styleMock.js @@ -0,0 +1,3 @@ +// Turns style imports into empty objects + +module.exports = {}; diff --git a/config/testHelpers.js b/config/testHelpers.js new file mode 100644 index 0000000..6735d32 --- /dev/null +++ b/config/testHelpers.js @@ -0,0 +1,8 @@ +export function getD2Stub() { + return { + system: { + systemInfo: {}, + }, + currentUser: {}, + }; +} diff --git a/config/testSetup.ts b/config/testSetup.ts new file mode 100644 index 0000000..16018ff --- /dev/null +++ b/config/testSetup.ts @@ -0,0 +1,13 @@ +import { TextDecoder, TextEncoder } from "util"; + +global.console = { + error: console.error, + info: console.info, + log: jest.fn(), + warn: jest.fn(), + debug: jest.fn(), +}; + +// Polyfill for encoding which isn't present globally in jsdom +global.TextEncoder = TextEncoder; +global.TextDecoder = TextDecoder; diff --git a/craco.config.js b/craco.config.js new file mode 100644 index 0000000..65d0311 --- /dev/null +++ b/craco.config.js @@ -0,0 +1,30 @@ +/* Required for CRA 4, see https://github.com/welldone-software/why-did-you-render/issues/154#issuecomment-773905769 */ + +module.exports = { + babel: { + loaderOptions: babelLoaderOptions => { + const origBabelPresetCRAIndex = babelLoaderOptions.presets.findIndex(preset => { + return preset[0].includes("babel-preset-react-app"); + }); + + const origBabelPresetCRA = babelLoaderOptions.presets[origBabelPresetCRAIndex]; + + babelLoaderOptions.presets[origBabelPresetCRAIndex] = function overridenPresetCRA(api, opts, env) { + const babelPresetCRAResult = require(origBabelPresetCRA[0])(api, origBabelPresetCRA[1], env); + + babelPresetCRAResult.presets.forEach(preset => { + // detect @babel/preset-react with {development: true, runtime: 'automatic'} + const isReactPreset = + preset && preset[1] && preset[1].runtime === "automatic" && preset[1].development === true; + if (isReactPreset) { + preset[1].importSource = "@welldone-software/why-did-you-render"; + } + }); + + return babelPresetCRAResult; + }; + + return babelLoaderOptions; + }, + }, +}; diff --git a/css/font-awesome/css/font-awesome.min.css b/css/font-awesome/css/font-awesome.min.css deleted file mode 100644 index ec53d4d..0000000 --- a/css/font-awesome/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/css/font-awesome/fonts/FontAwesome.otf b/css/font-awesome/fonts/FontAwesome.otf deleted file mode 100644 index 81c9ad949b47f64afeca5642ee2494b6e3147f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85908 zcmd42d3;kv*El|Da+CDlBt>YTO?s2E$Rax}J7^UU6am4?E~QJ_bWKUpmhSt$x9Q%} z(z0)&Ae*3d1;s~Es*l^_qYvT&E-eo@NhgKhnVS~zdEfW@c|X6;_m6LHCo^;InKNf* z&YU@OX6~B6z%|GnWg#&dw&cktecin_971T=FeG{`Z_RVlXVpYy%MlVG_}d;D8yue; za4rKOCJQ0AlSV^un7FdI3Es6rm}3NhhuHl$NcTV(XNJ|FvDWcH9*gcEu?)Zn zU4Cv%2aT_c;WO^tyL-=FB&7_BksF1=ALOLy9wgk+J@|7M36z9at{)Nb_$(6r4mq)O zo~Q}|50Wy8ALI*Mv6}^L7V;02`fD;i*=#`p$oI}*T}+m!5-=zyNCpq^?@QBYlt|-( zLV7v`0Rw(H$hp#DGzu*kOiLbsGiW$kI|!FP0G9zYbPz5_3UqQX?T%Q~J(%W@8ofW5 zRv{hwC-jd<;tut1Lj!|p5gIAlGMIKlD$$O?v=~hjWe%n#58yCpoapEvT>1c9hB`$b z55nch3;NDgmpk%wD;-R8=n=Q}!L$l3a(i!y33@Ox!f5qf8k}hGT^<}4mh3xg#!UZd zzK_Sm_zJHqzGj2PU`{lIO?%Q5XMH@$U@^rSXwNV3eE_h4mYcQSV75e>;(Yz5&6+lY zLj0bMF$7x-KqK5>_O+UPtww|IpVe9np;n3?Zi1KaCLC(;wVH#&46(uHXy0I~)f^d; zAfUvVtdXGx3ov1}`VMmOC)Y-+HGaYL>9l;Xi^FM=rvDZ=JqF0cSq#(B5@bU0C>fbi zB#J;rWCdYaih@xhGC*oMq~cH*y!S=3&jN8c?`U$`?2>0iG4wNn7{dwVm=G3K&E5!=Z%vfig5tTSTdtp^h-X zj}_Vx4X|KCi(iZsLSqqUr$Vgb+ky24|}eoh6_q#z2r#guy?64Pp#IgqVW=U-)Ac z?u_(hnf%26ZDu5*8X&n1bS(pV%oiO*$3Ww~i#{JcW{hsk_Fh%5uJ_U2)xFz#!+Rrp z<9aiCD|&bJ9_xL%_ru$`hPbqCf8sK*x__z(K1cUbS}-hkd`d$;#S^hWi@_h$80^>*|g@9plr()(?1 zZy)L#*5?cKC-u$f3+Q{cZ+l;SUshjLUq|2ZzV5y&ec$%=-a?fAz3&jZxAorIdyn6n z@y(Cl)P1vVm~xn67(2{;n0y#48N(#Q#KYW%iH0GMdmeW@ZhQROQK|A)?B`hR%$zj-Bvl|~G! zkefIQ#f!ROjm<)dOct!12n7N2bj|xOfxaJvzd(f<$_(X&G|dY*5I^`1$|M6kj>3e1 zT;(VYiVrZ2K##(+(5xYxA=ra4tzVKQlnrs*O6C_c~u*u8sT3<&RBc^3|} zQQ%v^8%+Oq?G<2@4&cx-LotO5JiQU_fj{3muBE+Go|yt3;_aO z7McyTW(#$=$|{G-Q`k_uX?iF>RQFIBh&Kx%>jB;&4gD8DalkOV&lAlH0p8Pis4nqP z9%2fUKz#o_qz8EwV#<>c(0%w6DqBN1bUcRoN~jC?06XvAVA@4%sO*2nSx8OshT2VO z4wVz)ET}UJ4I3Qu@S%5rFA?e=q&Eonpz#o2P)-YZ;AId-<1FM$X;B%V!7U2~K%nsZ zFbcm<$CaKqNMC@90atiG7!To7xYK7=lqgC|r04^$Ij04|U(?5ok??pp;~x zRWtx^Qz6{X57hzh=y)SalkzSEUsryJHwqK*0Y`vAEa21ppYJFi0f4In*wmr2lt)^g zwvEQX0}UZio}q!37v4h*xXPiqIatp3KkI`su684&pzkDEE?y|UXfRE2;N9#YTw1qK zKg1OFKZPMYh^LBkpo|#ma?zsky!+*{kREu}Lmff@xLycZuC@%~X@xcnmIvH`q5Ke? zp*+;Ll)|7oAy8ZhLOW^S4B|=emqTa@O;g^6+6DNJP#7%>Wqf6z=O_&UFH68x50$?k z1DvKM5Ysy35NLfAM$6JbbpYK|04x^jGs(JL?**JJS9(ZK$o@c+D10c~uiwQJZJW?8 zO7DJ|L43d+Mqz_+-ys@F8s1pgo62}3;7crXm7F~x^i=x1ohd`J(cb-8fv-5a6@ z`A6Zs*HC`2+z_n?W4fS+!TaY2`F_Mj3q1qz4$Aj`7XVj9!_e6OC;cIwhGP1jrfC@J z3z`NVIU3XVLo^`i5+I1~rOHUO4<})tO!)M&VhxYPFH09QC(f4jh1l(}wA><9F z+!!Ah6YqVB7D2-A_8oM&+muwV)1k7`=qfpl|x83Y+PO(I+6nl$x;_>1sVn6YG@e=VG@p^Hn*d$I7 z7mJ(4UE&wT=f#)Am&G56|1SPs{BN;SB9o{jTFDs6bjfVVLdlboXC==|HcJc=izHo= z2d;-2Nu#7ovQKhQ@{;5gNw?&E$yLdhl53LNjFeF`{r<>nNzNiYvm8i zXUgZu7s?-%FO#p5KQ9lJN6Ss}o$^9?oxDljDL)`TB0nvEQ+`?gk^C$9b@{*L4tJTm zm%Gk=ocnC|O{GA7Q7mGgv=%4m+P+#6HG8!9K~ZVT0IEHi0c=8`*>GQT8SF0{b?5iT#-U2m3wS z$M$oG6LT_7&1t#u+-&X%ZY>wgg>$i-l}qNbxO}dXtK(X@c5W|sfIGsS;7)O8xC`7{ z+(qtF?hEcW?v?^6B#L1QPsM1(!-`3YsfwA3*^2p!#frxjD-_Qto>c@YHY&C%wkyIE zMn#MwUSU=2RHP}g6oraXMWv!v(V%Eiv@5z4`xS>3FDgzbPAgtjysmgx@i)cCicb|^ zDE^`NPH|oFv*K4ppW=?fp%_q#lyaqqa->qD)F~fUPEq&l;%zbgBbca#q0fJ&rdRPL&IswELI!4^wwf+aH4VhA>e z8VzxYh8R=40epaFtHl~@rXk1>8*fcc02fYpWK68p7!(t1jxbn_G!<#Fnxf5ySW}`Q z#bk;Nii{H?Q-akL9&U+@hzpJhHAR3w#$q&r(+3C`f`VhL*2q|c*%TZWW=e{SftbRE z(h2bt5*Zg_+8G}coE#JyX%3Asm<{oUU@JI*z?WpC)zTs{rqJl{nBWNN!;CkY;tZBV zQ%pjvAqXlTOi`+X$%ObF=1^0ZAp}|qku^91{w*OUQ#1|KT@-JQjI)M}VK0hqEFgUtpQ zuh3}P^%kokJ}4wOG&(8R92Oo7oimgfifK>A2g4Y`c*TRS>^|aPTA(nPHbj9>4QMBt zO|Iq*r3Gf=V-hSubYx>A;|5c%@fU!mXd&8>02P5-PRK;Yg`0$gCDd#H$C=Rt<4D;a z99k&j8sm^)=tN<(gUx1BlB;Wll&d?1WJ0{_B^_9y7pNeBP(-E}g2EGGVg{3z*x;BL z!_Lr{;Mm~%oJ2&1Tfv(c9v%sdB!iehC(}4I#$+)-m&8TJMF^Zicf}b(gJTSFVNe@5 zHBGUhrr1~*yx8D~IK%zkNr)fn8_JH^U`;X@U~EkB@sv_1Ormg*A%odf!(f`$I>=?B z!3;jh;31}sCUay8bwI{|j0T0m7+bALksxwrfh#H}R8)nGOH6~HPO~Z6kPNfTGRUIE zYD|a?u>>W=3scRNq5RRTFrh(o!-XmCn%ZoVX^eFdt!9Vph(~0+1sv$Khl4^u z_&}$c%pf=kF{T&`xUi!^-vW^cV*;oUGmrxH6%qqJ?g-Ep=7i8_7%N~3X5IaS(8&=d zQv|5o`;+#8JPZ|x4X6=okkC;=3Yss(v@2aHR~J#W8fUS9=bQ$ifRIQ4S#~WM!uStL z5HM+qF+>E%gn`}~BAhKo{-QajoUk1>jMo?l2F(EL8 zVJssILeB~H($&G0a|s?@n1W)%pp?~Uf;kXxup~qR^A-b@7FUho;RZvv$rL86KY|9Q zl_x}kevgZQQt?#H2ggE%!EvF6SVLHJq&1xK0HmV~))0fiY!v!4d`7q-%#;9K9|T;% zFYTzm0EGVf3nU@_FIn2zf0lKnghH+)=r@5dMGG@nqCsCnr@*f;;MQ1E2wg*6lguTl zg1qcV0O1q3ais)`(5|>R5VfHdG-hbpLhBz?Oth08P);;!*a>_H>vE`xj*3NCw=J?l#7hFS`tEBiJ)2Y{NfW*QfS{q z8ej|~DIIDP{F$O=fyEeUhzT1~?XLRiau5WX4rC!A(qc5gIui;L4o*5l!(h_87D8ca z3e)02fNOR<2>EkK5K7QtG+JY0W`|lVejr?+#aud$b`@1?7Fd8lPGSB>T7v#u0Pcf^ zmWUv~8GeF2M9IRUK^eTi0#jlxl`Ftv3@|4_|GQ#gc2iS9kYGWx3at6foaI_TX%1#3 z%siMruE8FPgFx_t{ASKIB$y*YU`>GeVvd5NyM&Nvb5e*kluoGolSC4?A+h76{6!l=>kAPn?f zaB>)oKiH5UYtUDNS|lZv491nUa!EAwL zgRbN->ZWkehE%hI0)?d?$z8T21z4qnU&Gr_VtxWLhFojWfP3{No61O|fq=FM;|6|Sra0J9+YL4f|B zHygqn2y-FKgD^iKF7nBlkIx9789Xz{Z$6;T_k%Q`&Ii=_fI1&g=L72e`9c0OC|(G} zvmp3E@E3|dF%yz=Ak2j@4+5ahoB;vgGXZrbpw9G%FdG8k%>=xefH%`s`;r*~l_h{Z z3$SMa_AJ1j1=zCydlq2N0_<5p)eorp0iGY=`2n7vi-Dys3QK1SgqG5mP{7Yce(7u% zbdDTE!r4XCpLbvB^R24>~} z-WFUA{KWh!^^uN~J_7EO$EC}`eG(!Km&Qu1(o|`Vv{w3&^h@b?GDfD9jgUhvhHJ-;!UFUy=V^{*C-!@*m_k-5+vSgJWc@`waKT-Iuwqb>HZ|%{{}t z&HaM=W%nQ5?W`LsWj$Cg_F-^>EMixKjHZ zD?5}2l*hr{a9;VQ@}lxXWsmZj@}{z1B~y)5d8>4)v8tJ>$5g9S&#Shof>lu}iz-=_ zp(<3Bsw!1B)o#@>)vKyYst;5jt3FqKt@=)NUDcz3*`?1$Cx`02Ui^mOPWmITgXxe2_UTf>r`i9GI^ z!*Vmgxx_8u9X4m+qrBZl0+;aEc3J%=Whv*+>Nqv-#zp)1Hg+HXG_MEjlb6_1Jc50T zT@3W1c@h}Nb3rWjT*qTif1X22XZ&Nw#8Kb9TUQ z8QKEhmHCa->rxt0ytv+>5-E$HAeh45u()R|49&wlC!Nc3 zOn$YkuvS}ZdzIxTvc|Xr$4>DFU@*C3aR-c?x-Gp4x;GHI7rK)KzRYrMY$997b8+mt zw?E;Mo6_5;hy{X(1%imV81-=kxL75DE?#}4-7aqJJrbcQcYFSd(BHG0rKM)@6cq+n zrC!c+6qTFIs&$HOpALz>)55#fm zh0wx5p_I}_QPH4XNk!urv`FdxY+XYIQ@M55MHneKc&6&Zgt&T z`fr~7d3*1UeR&584i>f)H#b(c$+0_Mxhta~t1;|!(94nE$T_VuveX&rjMQ+lB%Yhk zuAIZe7{CmSxf@p+qfJXI%1_q^rI+CLp`2;%E9?n!(SK4Yd9C?Gh`39Dg`FirGjEu&=5E-7xrm;Ee|^Aumpa!vf`?`Ge*^WArMblksw z!ox1$QCfTqr;rqK>;Mn^O}L6jOwt$B}^z7NA^-fP2;dde2_+=qM^>+Dg#1Cmw##(n~`K@fNDDc0dh zdY*zQNo;;Bu}xyX;Pu#sCqU1%>A52IZciT1eX{QDrJ*dB+0c^Ls^w&USC?GVaSM4L zN0zIMk2GsC%Z0BZBLfJljf$;q+@XJq$cWD+vQP^noJbxrtkmz!%uGzs45Y}c4TD~MDsc+tuXTSAs{v|D}93SCi{35r2y&LFSJNpCa;#mutZx+w_FbLMVVH18Q z!^p4+6X@^n6YwxR?DyaCFr5lSO~<9M6Jca=5$@(>6?v8U)%lLi1Dn0}nA>f~G+Zm5 z1T&%s_kf&M&}jqfZV#-xcV>S#nhq(jZ|(2FRxww{0|mb&OZ+%>7tdY0di5Hoev*Zm z0b|W$h-8m}RKS92h0*6)^I9?+IOuzh7)byQILBfm4uF|tLBb~N@`waCY2dZ-OyOtp4phukW`wHNo>UCm6=hR)Q}-R%GcIb zRM$`eu`%327C*{!`8BmgwOWpN5t|Hq^DB6|)_6(r$-}^95k9Yhs;EllerCySV#N>f zpucbri1r#V3^s1v7YVDd{>L7;mQ9vdRbpnSzS?CF7K#s+TEp5HPn@r*XpY)%PO@+ zvaFnfg52!fOm8RS+{?_ge=P%1^Xc!Vs~8gil14@n)f6&3MnA?mmoZ6QQU>!J10$ul zid2QMqzYG!2=HMfTt_MP41>NBbERP{HxRg;cLWx*Ts_e0#xhp5e*39zx`I>P0HSpD z+AjXuRS>8J&^)LSQ_&`Y_MV|78%(i4DW{J8HFnY@_&GS~;IF?Pgt6tFFe+f5Jw`=h*Dn z3~IW%qQ;wR%xEudZ1m>vBP>`g86aDY8JsT_D*GsWf;^8ExDlTu;aEB1fRAK9Hw)}s zuo@<@b{o{94(3PL?^_`HJb-+U9ZY>idrO1XVUsqrr)E{?zb6icG6X}4J?)-*d2Si6 zGMh_7_n5godrD83_i*WWJ=??;us$Rp4-ATcJv=mG_0$EN*#|IRGOMkBfO`yhB84OSls2^f=!lXEHCqQ}*k7ID5^c)$-1dPTf zrQF&pOXIBhSzu@#lx4Sd797xi^3D~Q9V}N}Q(0@%aAq@1o;{rUxxlcer@V0K>ZhmQ z{`jj8{pahPf6yjnckR{esq1P3!*>E6&$PC2L|c>89Mlrj8QNLVS+l!VUVW^DySC)2 zA1D3r(wgO94V9^}jFkU0(R>qdJVFNB8YJs^?1Uw0LGT%hgub*XZk8ZEX#$^3UGje5*lk(nnkkcCGQGKK5wm z&eycB?cQ~et7TQC@COq!OHG#*yFbh+e{A*q78Hk%^q$y9`n?ZxN6qES^Ye2HbF{D} zN=fHHGI1d6(H;RsI3Ie8P8T)turt_0N+*%|gHj%6>ugHVukHFanaDxU9Uw4hu zOa*Pb7~}@q9G=+5?dGAzaZo;wg_{heGAzZCS5JKf7Q$k_16DBgYj3n&JhQzrGBFK$ z(3ii==_+z_%5$_6VcNEpwZJODF_z9F=|{EP9R4O(Sep-vLoV2D`5c%>u%y_e$2i?U z53HZs))tt+O)RJLk#tkNDF2m=!u}iaYtRKk58FLQauOf%2&wgvd?w{U_dy2)VK4F& z4k7Lwd6?X?lD(RYa?TD)21)^KP$yDO_*@5meGzzpP%c6x2yOu(_|9mr2pvMA!h3Fo z--&*Q>tZ6f>4xAA5ju_FK9DFK!DlO?Y$VD>qI|$ZqGBX!MWS6u^c`|jBe#jj?G@zq zCUWaV;-yHOhQx0o@jsAcJd&7@N&mb-aapw?s3n>!l?L?&tDOV!Ze5Cp(^0T68XH1V7tX@5q}o( z_mIwtbSIF0J<=aW`freL0P@|9Mzd&i92$KQjhTwZEJ9;eqcQu@*v)911dZE*#@$8_ z+tK(OG+{oPa05*&MH62{6Yrr(kD^Iw=#lB@ktX!W2{d^Wn!E)~PDGQ>pefIyDJ^I! zkEUKh)90e;+t7^VXr>j-EJ8ECLbJTktSU6?F7kT<`DGyg(P%dOr=U5hXs#a3U5(}@ zqq%p{ygg{%bu`}_&0mJ*A3zJXq6Oceh1<}=KD6jITKq10^mFvsrzqeCdOQF>ub>l9oq0P+AsxeSdBKs zq74VphLdQ+t7yZUXyY2R@ety;A85_(}S+BOAkOF`S- zK|x9sbQZpzL)-Vlhbky|H3~k8fVDQQirZH-Pd-qI^G;e;XB?LPfVw=|WWc6)MX|<&#nQ zF;p=hRop|BT2%QAs@j06H=*idsKyP|tVT7>sOAS$I}6qJBbz^}n~Iu3P;(w?S%zAb zsP!4t`YCD~joP-LT^rD@f1-9CwO>LV=TPS|)cGdribGwmp{}pco?&Ru60~P6+VgL; zw;1icg7%F?`$wVux6y%kbg%;*8io!PqQmRa;Y;X94m$QUda)WE_d&C;>L@yskIp#J*>-gHHad3@o%;>FYCz{z==}HSLKk|i2)!PKx`R>oS@eb; zy^)FD+>G7|M(--oyUWl;aD}f#mp(-A`J?yZ(ECrI%W`zth(6Gu4-TTg?LZ%{Kp&~m zM`m=z4}G!{T`fXAU!zZlp-(?YpIt(KKY;#@(dW;h&x_FKuc0qKKwmCIUpAtz#OSL6 z^z~`i9HZY#IXI5sC^h;d!SGMx6VKrc!DHqhkqD5;P2Cq zq$;2OPgTB{^K#EV(EH ztf{MyElM=5_FhTcjH^2qT{3#(U1S;Je46Ai@;=v zVev&7AWpqx{IcWNCGX4F?bxNnFIOM)R@uO6a-6)wI{oc*M??Y(A?ftTbWb#kwL`K> zaNOD9z3d5IHIQld#64n1AU>kro!pk7BYDz<Od=$rOLGoFH9Ra%Dnm2A)SA@+zpUEwX_Zpt`PB|L&(NP%`|>)ze^QrUsySKd9UyU~r+J$Ri))$zbH)FN1n zC-Shm&td6H@XSDGOS^oSC)MXy*}`?OH5V#~8ACLq ziT7yv_VtseFVmJtOQg#t|9EP>o_OCO8u-60pZUqU->_7(6uc1|*q8Ey%wXUjzrcq= zTZyL{i`a5jb)DVK_bb&0qZ=%hI%i1_Nw9BWcIBk(wrV%9_UB0!lh@Ex(4;-k(6zUh zz0UebcGwT7uR7;Dm3WI&MYi>JAIL$!6;5lG!_dk@%s&F89cCjb) z^cdFexpEWVZyT^(VDH*|Bw4TVnXt`+$m!_-nBCLqxrtiQ{@@mHbQjU>xUdEM4qD`} z*=_1@HjkBrv;BZLlvahpX$U?E9Qw*r%Hv7&q`RIfq~EW{D5+`I*Oe$z2SopLh)K9Y%){uVq!_9(MDQ>;d&N z97he6KZjkDrg0+O7M6V z7sBkZk_~vg?zvM7vVzxbf39J{TfyLVp7a@+MCNF~qYLgXaFXIVpW#V(yE{E$aiHvmGT{&?*>u&sp+?SQA?p{!zc;4G&S_bHr@ z-FymsuDIuGmh@a~qqnB#G3mnJp<5IDTlp}o;!Z}=vjGHO+}4OQ(IhHP^}AociDUE&&#Xx!2PVH-sgNh8RHw*9NQ36 z=WW8zFs;R@jmcVKhOK30YN0-LP5#q)t7EcbGUC#R?hmi(Tv{-aXvz2}i@qSQFfT^~ z=RMVVy5rkk+;((JYHUVqb~IUS@=7bpOok&WvkVTVT8ngeWqe&^Q&elTcjVUapvV{G z1$jkKHn%*tDo^*y+K*RtZ;|KK*a~f0n@w;Dj{f67+QH02+1~rfGfYZ(OGcX(o52Or z&{C;yxmf){&80(ihZ+wwgFgX*)~6+pVlAF1w;X6VSbrF= z+V9m;(a_ec0a1O4729o&lj>NQ<=`RsGx8)8)m!3C1$YBr5WoLbegBGn&$}yR1OEM& zHnP5XfG*Bt?I+dcrR62%I_Fh;ob#$PjwvoFF4j1$;CBp$@pF3G!TpFW_Ot5x#^R2Q zdSb#)d)cSN@MMFG6yfc`$Cj4{8@&fYoi{VGiWBQIyx)7gD!;a{w#3_3Qd?0|tke8l}X?Z?%rWoemdT2drUOKWH;(^ty6z=QlOk5}Vo*)H%r6v`Z>&It91 ztP^Q3>YTIt4={VO<9Ekv$&Y~0OahtYvW#>Pj0Mu|p$_6FSbLx| z&Z*pK#+*6=9(FG{K&i;p=H?2=G*`)0CO?n5B<8`8!-5@OYWBKgZnNIg9X0m0~D+Uw!iPJ=y1js?DLqrl($82{I-6I(bqH=Q9soxHeUfdCZsa;35w6W5KW;k=4l3dj$-Lz!<#tQM^G5o})8x zlK;oI`m*xUigL{!n7BuT1~6Dd#*pW}ARDz#hP+Bj2%fDkE~O{tO=;kn+#+qRvo%%e zTTe8+)b+9)Px%SY{}Df_g$f?p>~}*?c{U0>Q%^X3s5?vy%J=qII98C1asA{0W9kZ; z9{TYd@EkI@dYV}0MU|Cahrz0(EI<($p&b5&Js~e!bv{HT+`sUV+>*WAx##3rIA!f#xseYd zi(%Hx)W*bBHJS7ufK}u1I%J_crarfl4A<|-h)cJm%6Fz`rdTv^OypsOg zyznYmJ8{>DFMdV~1NhLJmoTG0(A?Q{TtgSiK-{wz8Vk(t<{dhO%@x@zcdpVc&t$#`n%6y9dsr6B9+qM5x3972fF7?p(te&f@mu>H zEYhg%W|lf^;^$eF^ByeSo{$3P*h%&8tACw(TvwT!Q4%0x@KDJ9e58-r0W|<^Goa~Sd7$gL1q>!?e~U5NotVp9)*q=T0m4Lt@kw`~4 zF~A`KTcD@GVim|Zz+4$33HHwWhYr7g2oFDW!><7ddeKkEIF z_Gs5Bd}3m0qHuK~3a&16w3qJIzF($};G=>-tskr=T9L5^+A zYa1Uqu~Z9o>nFd2ZhTGe2pZVNbXuCCA~lieQC6$Y8Rd*(j7RrcUe_Ky($v|dw`bb3 zeibZYi4SxBpJ1;?^q*3vwI?=NZDq-&N%=cT_g#}$MAr7iaP8gc(!eJh-bvEu?k=;{ zHpm-nEftMgheL`->^+L7ozvre{ko=e`R8`L=zYu_+_637%u_U#@$-VaQi z%{ym)(fjWC;xqg_VmrgDoSCK7yx2!l=EG!#@bpBFZpXHQeFZyAo9r&grP={M#D5lx z{ozIfwyk`LA9>sVUt@GD!7<+*+hcf1N2cH@%u9wR4zAY@_=6|n;3?ND{cg?xD8!(!vF^eY#0OW{%RPsjbNty&Aj-H zWm>0Ax@__DPnq=_!IXhFrL6w0rwprjT_!7qBhG$LSvIR12*k7azg$m)^S(_y-Jk5{ zM>!(<4eAkDpOA+yk?F6KDe{t?J4<$ICr+#=o2YlbJ}_4O{(BYm@9WE(+N+yj2k)MQ z<=Qe^na!qYFWptLOSi6;OsM!=^HMKv-usTuzP^}g2?2gDL}UPU#9@W|Io1El20fRSW7oxub>+&(qVyLb^pH-Z-Yu{{+3oz&v%Bf9OcH>)l0 z*zlSwx6AI_(bVlfReDg1XJbt+dE_Vkk@dAtuhPIRf{8Q8&MjLScLnLv9U1Bo9VMNm z^yx0^?p8cJqPsV@w^vhh>QwbL35f_VtB%k+U%IPQ*Wf4dQ!RM; zwQKp;wD>Ik8=Uw2g2TyT=!12q^mz1T?DHXBuEC9@93zqlcW1V}P_|7=vPn)#A<5BK z&SOS&A1TBW@|xr1U0aLqKAWIfQ8m{1tZvngr%P6*7Ekp8cNLt?jv~V)RoDL2{JnNW z)<;)LO0MWj-hOxI+q*j|c57>oR39lnvZ`)X&FZF-Hm|~0&f_h0uXf|Q%ediH+)(#+ z)w{dj_-J2G{gtlT12qRL56bgLkIo*g1&eG{T{ThbcaFQ5{bB8!vEF7`#X=HyH!@>+ zo-r%j8n-6q$=sDm@{~CY-7Io;FI?|vz@DRgq*p*GFYLE{B|Y7=|5&_!#J6NPo)dp8 zs5BlNe#6Ne#u(pZI<5Wcu5F<-DBWb-r^f)@XFOfH58Qfy%N*O6zCTFoPRS#gA!$`<=^DQpXRP@-sBlg(o>PM7>Ndzq z@Dx|A-c7Isj>*Fw+PYWEifZ-sbPt$QR=fwQf9XZ2J|j6XJ)z9oM%qY6K52vceIyM& z#9RGBi*K_2u1(t3^2ZBC;!U{3cwJg%R!Wj4sXnDSQ@n<(xsH9h=7###c1?R$Yg&V@Bc1@zs8tzYExZX%A~aLD%m7<@*s?<=jGa9ACTk`* zh1T*e#Jip|!8-(7MjLpGwhI^o0CIRz1iMWFx1)wgxpG6a2H)K$2KmLbz~GPIQxJpZ zw5mS@<4hv_q=Kgq!DSJ3Dh0jc`k`(l&wi^Kc5C!F`Xo6?kE7{@y$X6^j~+kMTbpn> zXD)cZNZ@L4^x@l%K(%n&434Mi)lb+gMf1*{AYQnmBmjjwNJhie~>W#Bfe{C}h7c!*SKl%<|3NYCZ zRPMmezBkgB8YzEBfA|4sl1#?F)bWKnzc|03K<9kf`7%>b02ysYj;*n}yt=ANZ-3eT zGE-Fr8EvC2Cqw@{4pa~H4D>LR8=0fW(Zk?&Fr2~ZoryD;E=yEXq&6}t-D1^~1!O*T zed7gq0j%DjMCe$9H^Bj`SsJWqBk_wQ8JycMUS(I;JhL}YXBQ1LGePZV<6qUjdUoIG z4n3S5G&6hOta<;EhHmE4r6ACdnI;YAt5XhyZHf^~V0Z@hjcNuSgW`T7Wy{ zr!qr2qP5YXiQ6;u3rHvU+`Bd|l#j^Tv@mAsc%cmJSfC^Awwtig^c43i@NM;THz&U( zg|!JbTVx7@KezX)Z8;@rIXUDOx#g9UlU9;r%dwR;+idt2zU5`JHJ90Pv-U}{{)fLwl*X7xAD&?)= zp|zo~Z(hPq?)O&@_z(Cq1Y}R<@OSt#cm|%KK7PFPz3}7I67UK?zN$1leEM`RD$zgw z$k6?cCp;03H=qUJ+BvOm%yIFNUYL`UnwFfAlq1i|&&$fxkf>fBOQh9R<>giSmpae1 zUx4F(tKnvtwz9IUtWw`tZEGrSioq#e_>r%Fl7IgN_I(A% zYeCclr8`=zo!PpgT3c}~Tsfc@BEVdCwFBH!o})%|Lo03#_GWouVOb&dVC3cLSFWT} zn)YeU1ASUjQBhJMT*W?r-qo$%|D|7Xs^eAl;lrgDq7TENf}26SA;9fA?^Mcc#fADub z!B~ADKZJ6g_k|lXQt=rgQ~#YG0H%O5$L8;O?*WJy^PZ#}qh?_9Wwry{GqwlOGFS>8 z$fO-8z%!`x7s{(hI*@b|H`(7%o6WYQV_I-S9J96WG3zPKlhCegAEH!G2jv3yB8A(F z^hz$+)p%Ne2N>3H4dp5bDFKz_b&?-Q8A$QE#ye<)hk^P9C`j;r`+hGw{4h}NIuz^w z(J=uE4Wu|ypb)6F1yIPo-?`t*2|v)A7(h_o+W{C1D5@SX+Iyh3ZtMZ~;fPHN{_@9I z*-ydoXunk?N$J5~sp$jDnmXdV)EOkm=3fy>_ITNmL zLlV}Lnubh0+^2bpzyrWk3QVEEnb(=jhP>8RO>0d{LxTWD~s3eF(`h{v6h6VVACi)47* zc6u}P6d4DQnJgAb@sD^BOU6n!<7lwu7nA7oay%ADj+K$<&EN-HyqQGH$ymT0D?Lx5 z0b?qY@WXUc zoP+Z&m=yK}_5}z9Qn+fa}JLuBF)`Y^1AxD z@1pv!ScBhy`_IMjnUwfe)Y|WKcB6BP+P)Y*2KbeJ766|I{OVlnd=x$p_?3Ph@T>h% zo$4~ELopm=eYEZ364-f4VMlb9>FR1aa#RD~LRq?W0iS}650Ucw-az3il zs&nWEe6b(<+25J2&Y=?U_0(B>j&TG^ub#R1kzNIQvK#bdH@LiyW*o6}>IU=<{gBxc zoo=z{0|FR}6>f7zby;=zEIG#j8%wsqWzf^?@-u6$(vt#mmYiiQwAL<*?y~^K+I9Fk z4}K1ZK&z_}xK;Uf`$$KE=3Z%k4~(m!S{kWwl>x>TFs>I!M7u~>I?wW5oq9NXJPQ@d zmR#KS5&Z_|ql;&*!p>a=g8?;CoG$%mpD~?XO@|+>11=)0VFLg@WWHI!e1q|WcEhC! zphu4`nNI7Vac8yYABR>74RCcEV+Go-7Wjg#2dhz(*hhw7HjibUHoMJ6^`KQozIIMo z3to4A;N!Q0@<=ezlS8uJ4ZcdbE*VN=SY1~`Fa=WFX^ZOzT#D-V>mHl-!&i}5sddP!Oqoc64e?o6w1(x*5?44kRe zRO+g#Z51{xj+feOMFrLRn!<{_JdFyMVb7az5)2pNZ&EAJAFqJVpivd$k6h3U4%{10`wH?*c z%jbH#g4mX`&S#{qPbFNRP^?&G+8hR7Rl&DGo_IcUK5W(g71{^CtI#{2nGc7kaQB^F zI_dA311DxTU!iB_)nHYsC$ivwpZ+wNOPm*N9Auf98^3j9pbi}GUd|O?lHlcXa(pVOCQ0NIjj_U59jU8K z+PgkyE!n(atR}H0-KhpCqBYjJ$P?* zcq`s^8DEw+UatAzvPQT}L;T^YEWP6|oLPgxu>}OE|F#asZFem6a5gF^5(k zo3@P9Is+q}BQ)d(oJE%417w7*q^z=piN0j~>0?}L4?Jog0k>Q1fp{Fa_hIIOKmIXt zfILG!)sjzv*fSUaaF+wzRKjiaP3)J6UxdO0nz0a%B*Slz3G#t3*k0^NNZ3K7Q>PMX zAM5xYwq$#9;b=;S-vm6J23~35*||_dzO^e{gjq;J*5@GQ%dJa zOuST)ZcfeYeozaGxnzEY$Z0EdIfMt*+5MpA2oI{!mX)K54r@hw?2Pa?fRhgwQt29QLmSZkGxfPu$HSmn13|xAR{CafHPdNu8+iw9R?;FY3r~siO?j3)HG&FU=n$k& z4OlB5D1rhbjGVbjBvTyDtb*J^b5Onolqv)cxVv`?+%~Yef)SJ@V<~&27za?ZWUaKpuhj@G*J` zF292G*R=H|12mms@L4f*wE||3FWQCtFtYvV-&lj!cIp(uN?M@R@!Ivd|6dz*t?TWu zYr=IJ(pn1ITo+^?&Zn;PuXekd8zAhkKb~A(_rI+lEnTPa4)YySkY@(cr@s_(qdG8Y zbYc?PCZx2^afg0t{qf8l#^>uiq=-Wk5*iwgSl8d@a_gR7J4`!@p~Yk-3ExYOtAQ8- z%dbd-j8E5^pChhVO+B<17dtOzZq$5+_L%?Xi!|u3oqP_~LpAY`UR>ST`g1$aFr>$s zOW%_qHF0AEPby6-()1}rEJ{KC@IOlq`m?Y+OApcC33#wXEOo?Ir_@-FNd<2R0ilm! zP0|R%>eV#DO~NtnN|i_HZ;1;k zjxny^&kB4%ubdBCtO0W>3{fdbz2o3U7Emm(|FUgau+s%UUxau7P%S*#pqs1_lGfG{DMrjhBr^1cQQc}{coD(efp9WRxw1`bL{ zPlL%uXN!+!n!lI^I7N$wtQM0goo%ADsO96g;%G7WtkgUlDlV)l0dAnyP@h}F`gW2& zBH6?idtFnrsteW^M*2uQ!}L=6k6#Cpe+Z-pvKpWh@Rb(9+F8WkR2*6C*~C6<7muXU z1=Hqo^jm+3C?zR1HdeLrgnl3EYZre*q^CbR$B}RO5K&o0XpW+8NJ496j#N@Nm zhxj0AMBh6M9n9{C0@)=*gxsIvCZW$$w;wwbBR1;Bd#vvk`_R6k9caD4S4eLPKO^u+ z-2esR1AN|AbQ<3X#rD;kHm;3g@(mV)K}C0iSlRCHOP>Iq_WUr`R90>-SO5Ioo-?0t zFIdN4jQ)}_6&IU|)s-bSM+FyJIsW#26=nA}oxd6|kZKmA0Q3-86OJ-{AyAE{`qOIf;Q&8i)5I}dpdlruQBg(1Mwgdl8) z07ICCGAAXC0-%gJkI={gBjnnj`8S5D`^VoH;2qdE~? zN`@R}^1;^Z5pK?GHcH0`D{!0Xp~7KJ=?p z4Kyy?iYfEvPM$LN?A2~|o6p_*Ki?pDD^T7*-Sm%Dlw=mC0o*sV*3gvEnBExFba2o8tdL(6kQS>6t#Za#;6Sp=$Sd$swg52X^3S3T|>UWRbWNvoJhZ| z%c$2kWChg%ex7D6(U+*nEOALuVF|*W#~klDPBa$O7uFXO$#7+EV8fljC--Tr;v5dE z%cUyFb7BOJJg{y5_Cv+>p8A3Y@SH(EE;Q77B3C2C}=WYe!>7Zi! zgNRbfS~Ws^!>w2WsOC?uGb2%*Cmz;Xeu#(KQILFB`Td?b;}9>_ZIz-Ye|tmBQ_ zhc7p?)v+bZBUQ2oUrA}7aVx2arGG~crQ*E@Xiu(k!3+E5t0TSgX7LU31etK|2v@(m zZg(s&xxMLiEhA&{+-CD{dKOq>^`Qs_AfR5 zcEz+=v!}DPLrfpPJDN(7=F?528aDiL3weIX{p~wrcgO5z&aI?4#c}FLAU~QVXMWgM zd73*wdJ^$oB2~l3#-;1^=@Oi+>_MUlkOB5BUG2OTD%t(moY;(bc28vGy5*|KwB_-! ztn9(N=BD8rflMyD!);e4zR`>B6@6Su$CSOTZG)QVGlT>HO2;ZO51rEV`|*NES&&7D)hK z@0+NASu>N4&&y-|pZU-DKj+ViOjbIRj3?nLvWLt&4=Zyp8AnIWJjvEY9k)UWYJb*GSLu+T~IV_Q36V!zc{im*|sV^eS22 zEy0)ukTZI0K;}e{Vc`5QT$Ru~c#*yYP6R(leBGZUO0gB|%hZ_XEM>*TWmfhCpCIBV z2~#wY3keM&DboSEe>;*EAg6a~Ux&SjL?Vnuch@vOnNIEu=?r-!$Keg}h7f#5Uc^9v z?Xj*`o+N-ZJ0NoeT;|H+Y1=m*bO3kKDi-MM9AY}<0tYwnOM(Vg6{ffl?4NHJ;K4*L zzs;}o_EXR$t;p{N|66qzA!|Cknf7_>1=e?oG${rnX&g+KtYzQ&p&1ab;Q)AriiP3j zcPVYXE3TIM+w-KMv=tpNrqijXV{#}PoFywM6sHYnRj*5k>BJz6j<^k_GvioVCC2uP1 zc9T2DnT@n}uF;rlHMnwI*>1Dl!N@|^TvX(`vTVj&W1a=LYe#lLp54Y+Bo4c!!02LT zT~Jucdk%j zc0!}XY%t~I0N3 z01&qUKRiJ^DSGmPmtf3_Uz&XS(`e2=;XlCP<%+^uV^d;T@ z-Z*U$L-ll882ym$SBzF{LeKAMZolai-MQ0i( zjkPm5y8R1kAcj}Sc1HJp^u-TVSB{dWKG?+;)}1J7P&=F!lY^_s`IHVU+s=3rYjnC* z^ywMvRS6X_g-PtERQdgjL^+Actf)__I(V5peOO&v8>g@2no`KXNzNq3YP94SF?M(> zLNpu%)w!55a0%YH$FAS7URIJ zs4k&d=(;1xVrKiY6zyyk?R|F8*K^s0)+ME@>lm}eWLDAPq!;Z=25n=rqoZ=8)bR;c zTLRY#hvJE08gCP~{F)-2`QC9|cW@XLX=7IK|!bK!eq4j^vaP|O5k=rloM zu7T&{|6VM@Dfg2t4M~E(f7lF5-z|T4j-%+FScL;D2AK)Si%z-c^;qqa_ ze0Vit#Ats~H(wI@GJsYJbU=hV6SyEdO}~zs|p|#s4`IVQt#6M~%c-MVSj&fnuT6 zaz+^8yxAn|E-aJYxH7(a(yq7w@1!sO=}p4`Zl_=q5`fzUFZ&sM9Kq`pWH=u$DtA;C zSE#+U;)=@jWLWmY{qZ6)70+E`R&7>2OPBBuL?7#>ADg7^tQAk1zH|!GCrkVfL|HLe zx@Z-J1QeRQ6UcPSg&QbW@N&scDZ+|cAbE6tx!SMG1H>p>L;8rP(6~Ev>Nz^~htb4i zeV_E{_vP@L9}~%|U$hdAJaLHp5(SZ$RoMR^23$zA1bIUEjK~W3e^t;DvYa}Jh`O2> zQY#^@CgMc27T+>`s`Jq?zW4&}Y%7NME4~3Z14DMUVLwos!$_-wOd~75CXIwwfi2L7 z%qOK-`T&Tnp#0agkxZj2Su&$99fUaVL~w8tRLG=`1lq9TAPZ$O_AhBN?thdf3+PgT z%Od*~7*R-1@LCrlXb7_kfi{*PzT;}lsSnDoPpFD<(m6+!r^qZ@v@0f? z&RVEkM&{%MRtVbR+L4`<2xb$ z=1gVjSK=9sZbKDlTnxy?t1P+_BpC^z6lFHtZ44+f4}G1EM-&~+_j>IZk#e%VmHCyn3U*Dc?(93NI%i!`H7oltqB-%< zyQ=1rcdP4!GoL!={FRR`UigsX+r={5rO?YnuDW}z`F7)RD$*6PMY;9sawz8MZjYHxCGYZ6K~9`w*VTvT1i(qPR`15v|+aWqzEynoOW7wE%z)qpz-V ztu9^5;o_iINMUBMpo}n7I4zu_ZB6mI>Wz$SuL=3WG*x(Y_@O1N%wsl+=zKF#^%uw` zJv*BB-{)kunu|a0zodq}Erf1vOUX+BdB|m-IW<6RdmRc{J8qmDd8pS_k)7}>e;UQ(ByR7U8kzWqIgy5*;!wVNbVr8FQIX`DAN57I( z*S%ZPtbX@UVnj1CO1N@rS^GO@b!%!lTScX{QceE;&IBrgALdYynY0&d*SRM4;1V3W zIxW>~O5-+GuPa_-!ySYi3{I4xAvo#Baq=wdmr6?4u6C_b(^tbV2#lmEGGXgd(p&XkCm-m?wAa$tsFanp zCno0GlDIXxdAb$q*jQ&#JQoqUE^)bf%c|0<9m1)}J`?)@&h-vyC8oybLywF@gu>pqxss`x9!I~Fe6m>`i0L_cvpOgZx ziFcn$yJ0uoSR7#+-Yk}#B7LP@I3hP%wS$Z%LZon>^u-q`n9FFE$faGNp8yhQE}1Lx z14JyvwiF+P=6{e1B zN~W~jxMiq$x2eH>w5s4_d=+8bvTLW1-f#3*C_FA?268=l?%Z?(1Ia6)inKm&mNUI@dvdCa$+zd4Y+PPOwks!>foGVRV=RtIi_MQ_ z5{frh>RGpOm&t7}ahg1iB1f^)S(^X0b<1XBQXZ0?rVPg9aO6AGcALYda%NWLIg4Bw zB?fC6lV&YWO;o3qZ8usuPeMgjRUwm=7pFI|nWn^QyT_cHmzQVCEJ}77icGfXR;M*B zXM16~E8dg0b4PAco-sSVfJt*?6sEaS+}qtbRXJtWN<%4An3GhMt}fE;vgL95;&poq zs;suSg4}$2X1?BGa3JsL%=9Fc#+l;MbM2M61=+=k7Gnux1#=gF8*Q83DYhjTGvBopF&2|0Uu7@Ke!nbVZ_aD9Ijr{5)O-_Sy9FjhQ1z~CXP$Lk zgV}6%nO!*!CNZ^eXQmCnPFt@1+z&TDyL*bscNSO*)D@<})MA6xkz0`GuoVE~ zv9%yK$DLh}U0{Ziu-T+{$7f{bGFiFV#;iOelC!z_jO^!AyUKQ#w0IC=&30$!I4nAA zF5^k9D=al1$uazGfGg9I3e>JUz0m2l+AACo-g9KQ@{sObZ>y|z71ZYz7#Z1D6FoUa z`qWI9xy4{iXPh>NyFl$WTjTA5{11)fTqql77_jm#@o6&BmfMQmYeRgsG=bRNxg z=eTp45VYvB&v5_+*{;+y#2^|nlX7tQCa2wHx4Ya%tJzcIG~-m#?KyUXC(mwRT*-MU zwK*nNn_LES5x59-CuGwHl0h=Gb^!UV3S~B^jLy^r`Hu+$@|` zUam38XfCumJOxgMj(PZ)!t5{?=BvzQo*0j{$XZ@nROBi0*lP1ijCGd!+`9an zaw`&qxUCKsV*f6H(hHr{wMA)#88PX_dV4``Q9(gjg(soRSZ;LY6zg;CRW55jQ)w^I z7iX4a)?}L!3Qf*DXl&+s5VCn;2<4$Qtx>0c#*dcKTT1UQJRoIQ|Z9OEi7H|hX@oZK+Ikhxt%VLM^%*L z&UCS@vxe5ZrY@1*)nF)_fCSUjOPr^)9j{v6M=N5b_q(lxQSp?Xi;G+kUMZ#Ml zIYi{0?TQ@aOL}+z1Ai-6loH(g^KMEw95t~(1<&+nD*eflw~%|9fSEz+O_uPPeC8us zcr_sIFuSljA)bc`VFEt#*q2w{2~uJh4HE-e+}?`xSZA1D2UX8bH(VY-wXl&GP^ymK zHMHX-{v<}YeE@VxfT;==_3|Ysp#B>p4RAcU+QPEh24Fz|xkY4Yhb|>HlgrdOw!^%B zL!$&F1`GZhKn4U3tTw1Fz-#YjKLgxd2XMEm3*7Azkk43?1h&FmVN+MH%349y{cp#ssmw;} zU#7i&TJ{S^RN@c6`02=RHpX|R^Phj|r9>cF%hBano+MlZ^iuv9Lc#)aDPeyIYAJ#q zO6M%3{r&P3nB_E1annZXfjNrrKbor5D^?YhuI6lU*0?y;i&4WDO=N$|`)TEeuQ1r% zFFzdx4os`c!I*k)!Dux;zH!?YjELr_E>HQAI;`KkF36&O0XAA&Q}RChH({@oxbqu@~pEP(ltZxnuu zcaMng-zI@Np&#ggHh+Jy-_p59M4y;=Y6#?7v!xI&JavyeF_G)6@YS zdSzlEmA5G!hD>XwTCdMD8o17>{-&hJec}3?RkYcJ$mr2=hed} zL@%1p&07>T!S$;9*(-y{V^f#~w}0ODllsgFPt{@0X+ZEhhxB<(DLX~`yk^MB&dxCe zRjpd=nXi6+(6$AmIr`X?se=s9X1}^~!r6t);xpHyzf=G8?_H;FbEN0TSN`pOU~9>3 zG3`q ztSMCoXK}R0M;m^S@W6EooR~ovnD6ZR?A*ov9_pg z2RG{s=$k!0Vh&#Xxay+%oz{%l2JYhg4FhS9X$+aldlle&TdnyvTTp?^Sx`{W(4f4r zJS|IRghDVRS=YCHRYRZh5{wRJt86!*g|j!!aH^Tb`jqJ z;GX{m`N9E}3Y$F$nx!mX?jI@;3>!4Jg}|0v))FkP2EM@`CSJcJS+|}eHzl%mNF9fX z7f#x`aU<{P&;2udyX1KdunU7ht_laF#j+x*PyMUu0DIVx`52r_=oYsM5$$& z)itVvJDU#F)EH9B5Hj`Ql&3ym% z25?eeMBM)g@?s#vfb;mL5Sv`C;o+Bod5`QME&=e((2(|r(SR0(9~YDl;8rD72UF5Y zII@TC5f!JGuT4}vluP_>A7XV>+ZC!qEbAG-Rw5PM)aMq`(oKDS2E5S=@(4f+`Z`WPPwW5q#jDNw zU)JnX-TZqcc#y!0K2Br>KQvY`6ebSS&dL@cy#Ih%6Q<=o} zIoZ}i2C062<-K7Ormdg4g}psT)KtE6*Iso?by5U3hQ@EFGgV18EG&5_4i;t7u+st& z#&=zTfxd@W#_)ssL0F#3u1=^duPXK6ApZt-)81)&29}tVU*#0pM7A<365nqd zFB)#J*(b9PWj9Q!n^U%`fGL`!b!|}7N%ZM8qepNfMz4Gpq7$>r-fW)1mPVCFSH?2D z9XN+8+uw<;Nn}nhZCo^8wIXHp)^+T*b!(#*Co@S)mK)Znm#=h{uH)90Y_5!|i>iy> z9eYq;k$hs~?PpEORg#3<&DJHXJ=C-)OO-Cs+q3PtY++Wd;h>&`tW(B+`hn>^^_L&I zN=|X7ijUVG-*s&FzQ(%RmX_K*rTdwtE5%noQMH(M10UN5qP|DG@uc_IKV;QMgGK!m zw@k;<%5;n;#W|TirJ{Ev103T#TDJ6+rWuEp99nW=?TxL>)*JsyB|X*mZhLClx%Qe1 zyN>NYdf-57!{PE>C9Q=gu-rG2P)2qtjqj6HVNsduO;yFJN@ua#%{m;7j(1%<^P8Z{ z&%lB%bgSH^^4xkh$@*sYjGSqTVC8ya7g`jtIc_cb4yHZ`6VKAYLt16dbN3}X@Q9` zY3G~gsZ-`#9nW*N^&9dxtJBgg=5)?BQdE>zYN;?Y!J;d{z6@}2K=?W>C?SPu0?<}o zen$iODiS7)9KCgzrV-ZZs!7uhxNr#!A8mI{8bLNZP(($-V}yxC%G~RY6}Ac$Y~gl6 z$Np3%nx1$^8qydn-hgCzqi?n%@<)h>4C@Qw<%}YhE+tD5z({clBr74~5bX2e zf5bv^5FbHSwJ3unOX*V3o62%PpmM@=4Hn^<6N5hG1mP*z_YRqNMFZ5YQZbt>o-K&* z39lFE;tOOkS$sj{jq#7ZqUntHj<}-fQo<2p!EQ*=xG@PG379ETU`F92?2_1>r8XN& z7Li3Fo2}GoSCbK9St5|J5ZQARDYg-Sjt{}h3y>{0ElY@r;SdTF4pFNu95-17Va7?H z7ar%@#N7dS1V;mr_~V~veku&mR=_z169;0qbBLoCvQr-+G*e6J=o75zbpGX%bBv|* z{jUhm#vHS>13Dr8;P$PL_bhyK%F1VSL)fv27vA_nO$Pp(%qBY!RfdELT}#uDtb2_v zoL;qj_eQQH*_vZa$W6e&nv@DuAbya^|DEl&w_lBAbxCbEdc2uD0O`e3rW-?rg z2~<11YQ-)bZ;CbBm?#`?Ub-C+yb#1wk*#C~klLN(ZJ6&Haik}Jtc|64W5*vp z5zVfmuM5W;KX$>(Tb484h|SUf{t(xAC;w9yrwdb;Tejc(F}bR^Gy3E#V1FR1lBw=b zpWgz>#wSV8$_M{?a1b-VB>pYMPp~Sfc=Y<$Ck{Og1i$#!+n27hzmr16OX9P053Cvq zKFE-SmtP`_Bk2?sU^~lR1zhOw^wncz@YN$1&hKYGednI%j+4>tOl~}&s&teWRInz* ze*uwua?p3=DNc3;r}O%+WGqW6#AFqadO*GdsVmzrNZnk4JqxoBf;Zt3;6t=XI6p)p zXa6%eE&MtVPiZrm^$KpnX0q%AnKcDMR*nu>G_l@9g$#5k&9ECRd0I@^Z$y6R*mLyx zjl*aU?xoik5wRv?yCEi0HM?o;UNQ-`)Udfzo~I(!isBV@>k)qclFVFBhNzK_ihQ5E z{(##>!lf#ijt;!5AgiSNj&O(foNGFxCey#Bb~9l9ZTKeQf;rFO=wl8W9ouwWz@%U|`_L&j4*W9sOb> zIKt_42Ax6h3Jl9e*i`9c2H--Nw4j&*0Ie7*DL@ZFF-34RAfE!z5Uf1`wd@t@Lr~O* zfbTt5a}W9cmC`=gO3U9%m65u}gX^K>Sn}qev*Z4ZTAWP|CEkjz>-vPB%`NIyJ4(9#9 zs0o?RK&1y^=)4CPd?jq<-pjh*;;6jBQ2{ppp<>$>l+=uYMJU2EEC$&~%FGwo?IF&rI3o}lB9seGA;Hr7Y%+}6T$?nMm3*WUY^*FFgY1a_i0WZ{^>FaAnJ zSC?_*1>Bh7_=6f3v+^?O`NGYByz5QU^M@ms@iTdh37@ za_ebw-`8J3zkC==z7$sni~gyQow{e9@+lPoS2tu5plPc)E3{>Ai7obFxexoY7IKR}F4<+|Kp-breaez$qV}V3a#0peQR=FLc{-I#;8Kmj&3i3$M zk@>TmgtuX9N_2F9G!Ctjr$lbIqo`O_Y%DUk*=@UOw!fops4c9hK!^L8gZKoZ|AzJ!9iv zj(+x;nFAW1ZJgQB_@L(ImG^Eqf90Q2y7%m@-eUk-YmcF7b5;bypP~0BYXng(Y^J4LGe_`IhH9-yU)W27GwehYp?6`B{;7$hGNL|BU?z!5n}{{TmX14kszQIS#w{*+aHEPx#k0Qv%_Jwt1HS1 zOA9!De{k;{S7~0kz9>QFjoiCf;fjy9$EoAubFa!AKL4x9vDv2ZNL>*ESrK)RIgGu$sCTl|dLFZDl0xA^uP?|8SBDng^ypJ-mu^tm*aAQ zsxn5?>Gnn{rfb${21}~*Yx1kBYs}Su8zAKLF;Bo|^}2zX$;Ln#@M^=5TZEFasM@aS zgag}F3OB0@h9gX?onZ=cQUbZalOhs<&AMD#;i=YppeR-lgeU|AjNvN7goTgX`bf$v zAPIpn9>{@2B6~SN{*o2Te)Q^mS_Pm_PahiwqD_M4)F07P6EuQ+by(l<9n;q=WfSA# z5DT0`!b^VStVRkMft84Rh^+WrJOA*ch}ab zT9TTh%GrWHzW?LOb>_Nc1fuIF+Ye0r1*oR&y##_Q^AXW+mQ$fGy6QRD03;0TP zMG2~!5iPI>5Ipnhz!Jk25}|z5Y6{&}fjfr4q7$$ug&{X9C!3|eQN%iO40%FfN1GGe z0w8G-{K!M~vGM>ZQAauuAP7*10~KpJkO`Q8Km^sTkqS+D!xYJBsYxu=0bO3834|*; zs7@mIDsFp$Py_5Y@*4`8xorh%cR?PCtY9$efTWNO6d<(Ix(2g>g(!q@iJR*1l!d`1 zxQvHDi~c4A6$ANfpL>>qEL%rDq=u91&S}}NzNWgd^4RDXRbK|M$N|CSFQr1A7YSmC zagD6(-Wy~3ZwOI`^gr;y7%nb4Z_5@HT_w35ee$)JRkF*ESR^-3w13vfl2wvcXKUF3 zsI@Ly2T&#Q>0|x~C1I?f9v=3`U4mJ>OFUdSR>4B*`jZnmKH`7bkFpMdcMOrb63v)X zQ?5m`eh?#I?@P$GMyQ&Fkp(K)KGQWhMzh(-9*kSlxJ(@-MKzq-8keV%^AE(@{6LAm zvL?G$-34@7wkCRg94GrR-w07z)U64CtQWw54Mcq2O8Iq|e)Yb_~69yFWinO^+BE-4rpVu%d!>ALT3XD+* zGLnA6w6_!it-s!O$|WzKeC>KP+gX)|OR-hzt&&`CJlTFzC1_WIv*#9*zk`R-s)c%> zFoX-`1&Q1R@9RIB%wV8}DFhUE0Ixn)>eW%5;u5y)eF?HHLgx_lr{zTVNMzRC)>R_+ z|50-l1*hDY43r*w;WnF4nYn9~}CvoIEZ(YjW9c zOoj9W9mh)Hf4>00${i0PX_}*Si2%0X8XcV}T>= z=EjDCw_7Te4MFF5MkA}$^X_I`RSKCkxYxtQ36~CQx@&Am8cm*c?JsKq=emuzT#ze1?p`Jrm3mm`HMOSe52`lqAN4 z)T)q`z5-k$`U-6aIdk*UK!{*#AVd%oldyEN3jG3F8so8@81+cSs7Lw?7BNba^725i zpz8yH=CLrx-Ngg^EC3o|cX42sF@j=evexgVvdepvs%sO4LpuW_@fEUC z8VY);I6SfqF?lF4hl#0{=tQC7$Vd^@Hb)Y9mV|0!MM$RN-z+MRjNBt_juhP$V20@2%mLrq@!6xTH7qm7NBm0JAg3)vCh;@mhtMzD8|b{^9nZr zkYxa2A-d0H)cB>V^FOH;gkzXggw1q=|i5x zbFP>uICm2vME9gHmrcTNy(ek`16X5lEB6n&ex7$`t^~UICT+2(lc|oc0QlJTD@7e5*Jt zeA-5^c!lbQd&57ut>RnnfR-yfGlJ3mGzL7k!q;Ap!3p^1hoGf&0%;rR?NDF__qBH! zU?9X4XdbphJP$^JPJlt9e}#${ezN)-R@n15pP&}SU5V_}!``6^B9aQYSq=)#=nQZs zR?RR_eAmS-jZQ8VI z)uw%i5APHHHX)64xQmyyf0A`oPF#u{;hPuj+%<6~kJX`}8lzF_! zQA3*@4*s-2#G*YBhBGfuMAjKSEASnh`b6|LuQm}w;3_XJ5%#IWLllO*w5*!XhMn=n zjJ9#FgonTKN?Z6B;AY;q-1Y^>Po`Q0h}K|NPXyS{-+^a?^wyMXgrc^Dk^1WKM7+P` z_{^D0mdw14#Ews{xHs;`kRjv74Hg=?r}J80YBc_2|E{6V1$`+1TxyM zY3O={mo5ldn_zJdG~Q1GpvI6cJsCa>`_dE18kFyaij05gIeHVMet;Da0df1?{}lnj zrvi+5Fw2no+xL=x$6C|cytSM;B{wNWl~|NgRpN3Ly4cccPqU|%L3rn5NJ)nXlycYw zxEi>VZoKM*8{4jUfLKW12f#`6rRQnOa+=4|abk!VwY*EtljnZ~5O~Z7Z5f8kT-M2x zd8gE;PTC4ia_$c<6@7qTegsAtqVI@;DagQegbO7iw&Jw=>{->d~T+&RCmS&9-fu zwj2C>bV2bwsX&MC=GmjE@5o~(KR(L=2>7R{aZlx2hhfKI`4~|BD1ME?vnO%y7Egp{ zQ=&eC3E48}b=n(|ok5@cv4zv`*;KhjAE8g&?1^CLsN>)f^dPUQA&>POf<>c_bAAIq z?RjaSC2~PQMlAvFpa*>wkXN7=deBizIDJIr<~{lr{k}@i9_EjhpFaWcne_ho^^g|M z6R|IGkEg{`xmUl3K}&apmf-Gb7i-|^p`0&lQ(pVLAQB+>AEyu%^0uRY3x%QJddN<# z!u+&HIspU3JQ#lPVuVtX@-R3INN7yZ9G3F!;h4qU7{S6()rGx!cHU%21HwCeB%aAW zl#4%+(tQxpL=|QTTS$-H_>O~O(YWu3bSdep#+OjpB>TX|4iH1+fx{PXa~jvn(1AQT?XDgwmP({J(^8>OaAx018Xq=gR&lD z?Q|F?eY;5VUcCU-eHdT}PY)EmA;U0v@EM9NGwI*v&|d2G5e29fu)RcdD&)BnbeI}4 z!9jG~qFGeQ@pr+!hplvpC_o<|%;JTAaB*)R%REKGHGaPYKDKukMmp9kHEM`Tb4G)< zar0Uf^vO&*UjYl-Cu_lvCZj;=ExjLx;@>I?qtqFD(A`5G&Cm%d@&Luv6h$Rm#InUPYdP}30Is` zY%I=Y;64)7S~Bv(?~gF_O$k4t_lt|^$njKlfFX+|IrR;uMjSfQymN(vCl7J(X51(v zzQXaNXu2k(I9MFpi%00vr17=+S4@*WL;+-<_G?(2M}j2-d-0t_BNPsY)u0qi2k68t zISy$!|3?2t=)v)L`Al>CxQPG8cT(Xf&#Xvx%q&-?IFd4r$^OTKeZMQAhMrVzd_P%P zW~?Z5l=F`Vi=I$=pY7yKh;?FY4HnJ7SPqE8QiZ=C-|q$l;`;H=h^|!Ov1x|lOcL1$ z7SRhV2zDT!w$q)J3@NRW5<5igk_o%`_RwEx?>%&S6m2l4y32Ywb zV#I*Yll6jNM{w_2{<>o6@}f5`0D*RujGMDt`9_8Au*&k#QevybQDpDMNJMFF6 zZdB@021<1`rX`mop>AqYQd)F6N8|j<{N~qY8`9Riy*h~RLH`)#&l9c6F59tN?J2Pr zlydw6qUVLOURkApAggzmH5|_7M)7&%Px6N-fZIz7?p>!St~c&VsAP%*>BP)T6Tm*O zc01)e($luNqJpAa^$EKK<&$>twyKz&*{l$6bExZTifcTa7qAGZonjEc%*~(1Pyie2 z2a*2=NvHfs;Jt)D-5E9wPp$U{F`Qm=SN-vz?gHdyYEgFn08;5ptbtDS0w#pc4l+&Z z?Z9&$4{ML;pb!Qv-Mbj2EHLHoB6KHP3@bP=Z(P=}DCQ;1(0GT?guH7uksZ0L;qLYo zs<5-N#X{g<^1+#Bw{Rx9q2DSxYtGWt1<8wJ7}*g%M{>61;QLoqvc)Buz&dQ_MKA{D zZCO8avZ~*mQ31`0tLxvN*TObP?wzb7BagFWJWlir8|h@awhiFr$hU30wvBuX3niKl zCl$>a^6J`OG*rj8;_TbS&uQKisLWF|vL}Ok|B3_sY}+RbfL!~Qe4AXJSe#H4lmxb5 zBW>!2$N_4%X;XOqrhP%Q0bge&6(tlWmL~_vqRH3vn{F7|XP^89LVNG@u1`Kw`8&Ov zp;@0%m0p=#PQNDKD7!Fk<6r*^^QK*}?e+1h@w;9>4b0oO^xN{}%JixXv|B;4L8NK~ z+^(*$LETUn!0a{PtE>u<_wQr=*R$}q@~yvU_)zj{vtW8#ya6+FoHQKs=f|2bDck0k zheL1Ju!QFQgpFQ?iNsK#-FPUe-9GkvOH^e|o=G z(5GIZsp1j@9dB2WY!wL_c$+>udRF8X(o?#p;(+?pyPFqr7hEn38TP_j|9 z;8B}0{XSTbXjf=dj7DWk{%Ui8&}Pvzook6xmA3VwHCV0 z+w6=Lm3wlK-V*Pi67}RsO}BucBfUU|SCPj?oqx995EMp18~3zRRh#3s#_HIpt*dg@ zsK<`=6u-=6TIWDaka_5qn1$#xTWqSxtHfVW`psMVTk5wCJ9qBp>S}9t@4YhQJt9*P z$-Q$O5AMvNkFm55?G=eq;$uJEe)YHCstO;l`5q4(ONS)?v&d_ot3KUz{0o-!YzEn< zkD5Go{?3DdqjEJ*8cB(?yC#DL_67n%;OHNN{hvo#BiX$Ob^vmKtiy0A zLZ#&S^gwod=-(Y|JRpk4b z{~6QC*jvhPkUJcP|CKj1x5g^F3fL1DaVbAu{YBJm1G5*CdSKfU>7*%@&9hht$z<%= zpM606XouWx4U+AhBL9;_i7?noD*cwSU^fNAf8NKS*a*2^Upt~_zIJ%CKpn{G(;;Kn zSKb`Ed~q}*)LGPa!k^X(GF*WeNT*xkAIsmNmGycS9|m|?-+2Go1_JEW2y3lsX9 z6mGy@OD`c7qwu*iq_}GW4EU5{u9URCq@fT$bN3bAcVST40uYpFA)VKH7a zZeUJkqq{aMpmLSv6trus*=m!?V$S3I+E7tio<2QQMc)&1ws2*aU_NH#d>co0-WH&Hqv_5( zy)C1_5QJ#R9*q;IOX$kWiO%hG7UmZQRq_A0df|if=gtN})x+=upd+`1C~dI#3wndx zkm-ZPAA9YJCZdcYL9hIq`S&>bk23&T2SXBtJWszMqom}ZSorr<@xEOd@#S1aydyGe zGo9Mmt|VUru|{6<+C}guef>y31?i#jFXfjiZ%BFJUik^J>2_(nS(K7s$AJllgJU8Wu+{x%u`5!u7@N4IzK6aE ziq6sEQiw2nmEtA-R!Rqn%()W!@RvBUTSQ(L7lXC9cp+JGs)i(r{JeNM58H$mr?GAX$h{i)jfYi}r_t ziP9nd@7i>~Jf|EEn98J)bZIo>g=V7U1&tt*tR-W_*AJh(^)CRsEz+SU$6jB>(lHX* zVv3S!h$e7;LllfVD+i_%?aLw=koGG-K{tFa&1oWUB}AxSUDC^E8U zyB+yUL2L2HA4Q96G8Yzmx8Nh3_yf55V09Qnpnw6M-EBWd3?V@#8`ZA1K=<{D{h? z-T&Y?+`d@ymN4xL;osk$SL7RV4LM|#rnub9r9x?9EE!AJlrqWr>12%5>9)JgR`q-TNMVCCY~XU)3e9|ZGC$Tow%iY$wYPlp1!!%w zhL?A?DbN>@b<5P}=>ciCIWoC~q6`dXUb&>UsJg0%t@6~Pz#dYU?aC^B5zyPZjQ9jS zDuJFBsuKi@3+Y?rE!jk$+jm9bzv90_uFxwy7LmWMGgQ$}tighCB4uZ3IE%V+bARd{N08&fI~ z=9MdBcP_ESMnNS{u1rbHi!O`ANBcZ1qMt#T4h(2QPPg~wBne!)HprZIkxDs zL_u0n*`?bgh$TBb%HR~mybjQ2NjMOtYRi!K%AyG^2cc_(!ZQq)I$7!kV$ zsZDf~lHbH{`fHHNBsGXv!&%XuLHMb>7e9!fs93Z}Bvi?eoJ4B7ls~A*E=V(>KE`2s z81*qsX&|9xl~~dEE}FAC9)0cLz?x*8%+}UnaO;UDEnl2CFTbi!Dq64hHZzI=kPt zsk6A(#wOAsyJ(IzEh{bE$e41C=3JDUwHIV_IR$hS(laYm#PR{T#a~78UD8liTUW@| z7B(3x5{0xcW*`RQ3wMM)V#dV?;>KTVAo_@C5vFb-<2LK#tvgDD+pJY47gc6ftE(#u%MqnR1gfOc+Murv zBI?e$le#wN$0$72riL`3TWXc%8Ht7Q>iERWzIFs^t1~N;i=c~zDxD=etnvDwIDL8?3NgwhvBhyUdbV2MV680S@w>9TsIamc z;t_rwB4H09yYJJ^!(YH`T8JdZ&&1x#x1J;^P{X$%%aH}jX;vO%o*Wyd2CI9(zsZYG z?|)icTI?ycado7()om)wDF|}qfR?KEuM(RMn)le689r59*1d|@>dq_7aRn9R80=VO zvzQG2ko5bWjJx_#a=yCUSYBu^f18X{S_{nXT$d62(=02KpF66izZ%R9H=RXWMsS12 zLI7{H=0mY*vt>hmB=ZKa@l+%UfaCuqrtf}5>~s#ftR{c^u^9-OQir=Nw=5tSqab#E z1c`sz=ivKe5*&@lA10?a{39d~T0ZxdhCE#+rRPYb`2O{ei0Icl)6Ds-(}>zbD0LCu{h`DH_dV;VAA3>o>!g&B?xu`!kh)yA+=mI9o>CP=g6%lc<$A$2b z(_<>hawGmU6S5{+Iv7Rp5*iUG{^xF@Wym;O(NxgB^u73B`j(gKHRMb3_FI|sFlc45Zed+$-Bv3Fv}N|!FZ?y|5fy9+F^yY$|>0wO9J zyRnz3F)@iPF~ua_iHT>Hv-rHf!Q_6Q@B8EXT$h=hnKOOPoO4~jve@N?1op4MeC!jG ztNfP+lMaMXCsVRAQz54t#6V}llb3F=&WPL@wmW*4Q_R7bw*5!xK7OvFIa!gFAcqLN zLLn%5tChM0gOc2_-gSgC(J+_6)1ZJjjkeFU8zPL+?-0Bp^TmR%iIK$cC!vVfUDLgj zp|UX(1%x4U5IXJTPM(VlqpZm+{ZMyj(%Ulgtq2`8;;%y$r=rnHmSxoN@NMoNY6Z^@;`t zc;e@DE80i~I!;1UC42X1wRBiAJbvYQv1>;ooDXH6DKL%XFbF~*yroA!7O5 z>0-O?c5Az&H_0R<@I+nRos6*j>&2a{e!QRL^;)FXAUXrxOr)d!pXGt3=m}-gkr%Q3 z=TG1JF5T9PcCQMD+S%WD>0-G@-zF>VQWLqjR8gA5Y<^)!VkKu?zVCiT-gXh&*S>H; zi5C~`RIiuso=CNr@xo=2v+d6)s6|1IC|zPUy|9zm*OFNAS%G|k*C{%sxBFN^pAEHp z>C)X!9fYRc7_{ez44Dm#IAFx;3e^l(j8G#4%Z-m+{%=VH1oq+P?VY~Z#fr{?up-M8 z9xHlXOn9s;u2^mF+W!0Nwy+Vz;NOOUI(Y+CRd2b(8-aHImfiKpk-v>#_5;jurpn$~ z?liI9uFhFh75G|L6ODx_g6Ewp;}sC-?G;$l(p*#9B50kUweif3wgVjGfS_ReXsoCd z@9GzmpA2ScojAL}WHOgYt3Rtf_pR(6(#15i&V}8zJ7JY#ZNfUm8h3X;Kc8J*ZadeF zrf+*{q`sQKKwnu8Bk`^aY|^sL+6&>A!la(aq{+9F!SX`!mw1QkGUQM6SF1Ws9PBLo zJo#>AMRB9)fVoZArhuAb{?XLq(!7*9MFZQ^T6*@Rkf;t{}yN8Tq%nccJd9t+Qu}A&e%m=XUHsyiH#*m84yV0L} zbnZH_tZK4eni8jrl7A$Q7Sq90zTFdqgOy=x!o9UpAFY2N+@~0cZ%rU1$qs0q(YFt; zYjJDZRqxm8ZeEkK&b&5fRmX0r3iTsS%e`;?&jo+RDaw>4RfCk&iC;W^@W-&5*AgxpuBlJwTveRUxO(;4wS=EAZvbF>fZBkB2o6f-n-@mJQ_clg=&#l&p`vy?W9 z!-dLEo~SmMv>a+uW4?@(FQXlj;I!xr1sj=}pI8bScYa+JxA&R^TplCSoLZsIXKPeZ zc|r31p>e_C9GSY*s=U@B2`Vd(E0 z=ceUL^;!D7GMROgOz4}c0sL;VLo-?)@N<&h(9Ndc%Xaw5Drj}^iPYwV{^|R>o}Jw&4&*Q;P@`k z;=(YNICE!{kL}7^D=nU(n=lni_oP@jhPo{vZjz*y*w6Ogj6D*4B=(5(EAdIX=>*tR zcg19z^?di>s?Ecp7ggmp$s4QULyEb)$gBVy zdOr!Qu-;+XB>q7mu_5yCSYuHVmy(lOh|a;0YqU~gZ)+2yQ=t*0(4##k&&@NH=5wUw znpG^}my)vsT&juRbMnrj=NG&W6NjjOs@#Vp> zu}QJ9EIlQO&CgHDmsjPMb#mk>@nkw<%l-XhLwB%lKS*9}C54Rj>Trquoz48!K|hl# zW3h+UtIR3M9xtDWee!_toJtj^&exPT%Xsy$#o|KUVl9R@R#g%MRRdeAHd1rI9 zPZd`bV)WQ38v^xCiCcbXeOYc!g@M%@^d&8_r}1LzU)@6)xA^`30dW;aSmG%;l2=|^ zmmBKFQcsCxZ;y&0Qgro$i7gxT_40G`jM5Ucj#umGDwz6U7y-Ypxrr;*Mb43iP+Kix zq*B}(RHCErRY63pXwH>&_f*nwJcg@vWR)C@u+_R!c(mNhzI?9uYiT91)kDccB6}6> zY-?qf(1JyzKr~QXx~gnt*{X(dC5w$P->P^{DkS7xez1s?(nrk6#MVe0V~BU5n|z0N zv`+{Z8ItI}QHJ*JMx%RiFzZv<9Nj5D(p=b7$rV=`+i+%{kRO-{)(^x15s`85bxF$3 zOBJ5-oKhLzXM&ZLc%|<*#IhmA(u7)hV^hhY7S2^-Z&UiTSCa8(i-pl?^&r+9WJ?pG zD!k-W1^sh1T9ipjeOy*N+Pn>pTIddI^I3TXL0L+(sJ`}pkGF@&tKghC?Ei&a4R?Ep6 zu{k?M1!2bsI${89UIAHlV8RsPkqTr!5YS3eCTJ4m3T1CV%N$?!I-r#cUP*62t0W%W zh1-tB3UhcE(9G~W(UCEJARmPNHusCMW@#l2pAvA;=tC;t3*huL<%IVO9 z8Vngr4C^V!mW}-C4G@YTtN5fU(09r>{tyV8emC#@40XqDdh}uZ_I9P#cC3?MH zE7D8&c)>92uCwj;j8$00Q(Dd^lCvT{k)CBhra4ER(Sv*(`9frkvp`)^_=Q=hc*+Ia zYaMyFdkT36h6qH?^lZ|K=xB*$lU_uUaarg))>p5l@UQ5*J)wFru1qs5GyE{7*EP#9 z!@|VTQI=1a=aNyPp7;3=7JxM!u$f%L{(!Hbr%o<;^ml!*fI^)~X|I~?loF()CU&o+h%~BbNpz|Q`CL@TM z;`Jhf^7%)QjFeHZBo7cPMS?fT=Y;(?U(DP{6$-!U-g=&KO^OP{Mr-;|%u zJo)Yb>3^O~9a}^PNr?&(yH%^kt7a(ah)6m{Pe&BbG)*wBxX^m$rum|YtZ5{!TC&Ff zs^YHl@H*+)S0#+Tsrl^oJcLfRSf}df39=o;DT-Y~bE241Ey*)%+CpmIR;aL@UH!`u@lR?@v~ zbayjo?Q3<5PwtTt(G)VslL)cxFcMHe*8Kcg^~DzR<%1-kl>{_Fw;1O&mpn(N=sx)m z$?aqL-ZGBKUbArfruuaix*yM0OOMswbYCyKU%mot9tpJs2%qVh7z>ZyGHj-)NBz`aLyT}e8xA~x~l4eiUk^I6w24|hrr z^~5vbi*m-y-%XiCbfSt5s+ylWxnj?)s2hq~2{#Qnjyajcj}9Uyb?{Rh z;9qab_Pan@7na^Y79uy&*kau1m*@l|@R= z2;oZ;6!u+97yOaVHg%eED!7a2&+jt>I`p4=f6S3wTwIU0toKVoZfn9NiFlDGD zUeO!gPDqQ-RuX~$HZqQ&_`rtPn4OV{z5A1Q$Tp=R6Xf(?+nmhq8pe>5nyWHVf;hL} zeUd1YNQ5p~GE4uoI;fPXLU297U{141(W#lcF*Z5}Mf&OVy<)-EsoN^3V=3E(8Z2J&M8zH%gb%{^H z3lmENNu8X@S{=xr%Ix^G1hrFwI!O^P!*SCA0PCO(U^?;H3bUF8;}QxF=%>DP%tX@G zC==>nXHhWfyI^vMSzEO6klR(M+ttv!-^#u$yU}rxt!O^j`q^QhL*7l^71EAXi^^up zx2{VFTgHVh+olMRhq{?cKH*9huQP3xQ_0wEqvvz;M|nU3YpjgUI8JB(O6Rk5{_np} z`BUC_*j#>^D?4?}+$L{7p$t3Egz0qVd>lMAb;Qw(rp)rJmYkM~mXW`Ehmlk)Kjo zDJ2zxmA7brM>_E1F?j1tmUT}QlgVSS`T<|Ce6Tf^IqTNBeuLYN_3Z1te7ysGvw$em zHIN}c|N6c0*uHvGyU)QZkE%awDri2}QU<2p^u&DfL8<+gxeCkZZVR(7Ej84nmztA` z(n>g;M<)Wt;m#>3vccsqeg0Z zMk%wWk-nFynJo>ANsWo;>}|w0Th<<-cIp*UdnX&4lnpVistx}7^ipHJ)c#Ey8)J2D zqrO33rzuipBpDQmF~L5r3-*7aT9UXT%jcjXHzGP!qfzH2nj@t4HYaTg0`qrzMCkvs zFVpuTHg9jc)#h@R@w#8_{z}UJ;oTNp6lzQ?4LcTlqq+-C!jzOK6cgKo4Z1!x|FF4E zc`Ea;)LuH@#`NV4GQ2)}`;$MeYwu}~chWwc`;P~o{_?AXW#*ckR1->RY!W-i4V$j< z(8d{K^LBQ0d0ow^HJA+bxeYnZ#m&MZQx%n&sl`eI+yr$=irC;qv0+I8iGHfxX)Dt5 z>)fj1vocBwi%iDK%-m9GT6#fYt}!EB_mw-e9&O*W@zE=T^}*8Mw7f8o5cSa!N=>Xf z;!=8DT0_B^Hf@WxYKL~NH2z$1NjRGqw+ih#*4&cRoRBwNt;$;$mK2m2Z7QfTRVlB! zrfkq;kH}BWPdyk^t(HEHUa`fzS_(w1P41G;qISAGThXL!qyuW{2Ybff%r4MZ7)&iy zKkg-c_TCLW99ElPIudk#O5O@-(X_ed?*84Um^tbL}9O`;b1nVd0A zotc8DWO8b1QH~%p8I=+u<)_mvOnO{mOhQ^j#`a^SN}LVOsFG9^uxny<=33I!`lOUcYdKdv-EyI*<=fe^JKG+mt?Bn-XH3dX)~coaMQ1!ofkjJ-lS#ke&~*Cl7yIuA9p6DmZtmUwNS|os z+~sqYQM;;AoVnYX=c6tq)}^#%R+~@N7SwJo^3C+PtU>PA#^!lS$$uIQr4VI~`7P?N zRb=Lz2e`U6ie)$Vd>;Hb>`ub1j2oFx;08AL+}4(PC7)=e?w-l9fgF{tjG34=ByDs$ zebYQRe%q1>yEd#_A3*zfjEdOoyI-?R8>!z`n0NiNhtv@`n;kfk3irnlJQx$cIca9g zoRUR_3(b4YAz4ZxLsi{!P~VW&5MQXMQdDV5jAkiJ@6*duYcWMa_cAU(LhwMJLlk$5s9#O*%-oo7PF`D*gqd(j=xPYNR^)62P}5 z^b4pTy9_4M6^J-P!%qSC41E@BCihhTAy2tt&mzwPPw4;xxa7$h^g69hkCu0UOzezS z`ie)!1oAFyal|-nmihDx#-FYjOefLdBa&LZ$){6+2J&tsE7s+uNPCW0q8M~#bR5KG z;h70F`k_p!W*i+vb>orV*#o(h>B?Mb&hgK(PRfD!nMKB|8Vckz*>8CF|&j3EMHSzuo z%v3jzrE4Mbvi3Q7?{xj~o9s&y9fv@{le4WSF1wm0m2q@fiwHq>YI^}^0>|ifmn;CT zWW#(aS?9iaIXg-N|J8}|$s6`>Tz5A9%P8)}ei0c2=k7Ihp^W?w^=F>=f3xKZYdV&B z;)INMg7(gJtJCJq$;xf)@#VAXCd=FGCfCh6zMNBTOWwR$2Ai+z^g8c!;zXwD7`x@l zH~vrL_PYeyr#0a)SBC<=K$c2%ww`n;?PI;F+#}qoQ;_&~z;_B*tgeV|!=pVE z$ztPr7d~`~3s87MaQ&aD7BDD;sRG7tipAK4tc)(xMSuc?GR4Wo%6!;k03mvQ@2X=9 zjqf>qnr?gb@9Fs+PDj*OJ8uxqF*s4fy->_3Y-siTko)_fWu__J6=G5hQ33WO{Sm9|AAd~ko81EiofQT4)jFR*Is6okW=&&FF9}^J+lQY z_=k+SLR}kK99bM_2vJCV7Jd{xM_y!S0wv^(RP=e zMGD|lyCDE1*t)pet#c9Zne)+Y*u~!le>fD%Ji6ys5lkfuzISnIcR}WEfn(1@F~tP< zygqRu!h~hI;nV?r37DRSim9}GQZq~>cF>5>An0rFcT(iS%~dYguORTZ0z$Jo;)qw- zGN_vn2Z4S%kMt++=r{{@8)Quc|c0jI~GQ1!sV*NUKvtyJI7Dy4aXJUk6%=V3S=hjTQLdBSEc=0e^lX__cYDieGfRvaA|ltXAhtT0+PLoqD*eGy3fsHV z{jh2lsCE;NK8tOKiw8g8SF+iBhpgv4iQV6X?QfY*3`~IAstC8z9i?$6YddQWUnuE} zJQ|U|G0;u=GkKR$Mun=PvZAup#ik-tVOe%ja#2!dgfdD>77k!85ZMBB0frx>16%0i z#jEK1tEl}2kg^B6q4h&XY$FTrTp-RcM+4cnm~KLBaTz`CFSUQ49uGi(OBP8s;XgV= z%gFIMa=aEDZyA=8lFw5Z;!MT&hBUAt+0lmF#+onEFZvx`_Z^*_LYL2z>emP79bs#J zNcnPS$B5r)!BDsxg~OH+jJUZY@zNhJqsRI8=~7+sM}KV7L#)?k}dc(lyYD`oM=c$q~-`py>j6 zgR`ofMMj3cS`DYO>(=*Wblr8ZwMA6M!X&yM-r+~dFS71_w1UA=*W#`F>T}i_g_tVD z@s1+W-w#||BD)TyiFHDM+*1A!(ofJG;ukaYE0Ryo&?h=s!;{Ki3Z6@Kylz-NAIH*1 zXbsGyU+H9N&AM+=Gm*TA;g?#sk%=r&){l8dTBeg}l4<|s)kuZ)<+oXv(2v;`>vBHp zzD^cBD0r0Dq{YB4t{}UugV2bY2%(IY!(`Ms1Shp{pdU{Yw9=4>$PmHMh9k{-RB*14 zDfyh-$hdhE1I2T~I6I=jn`$t>_wAsO6C4-DT z8?!)iER4;ER11jUs`SLyQY~NnBh@k;d4KX3WLl87?gh31dmsp&#K)(o5R7+4Fg`j# z84)21H$@gE0LzXEDsyg1u3V@{>68W7&TH%~-uCUi6ljM&-Pz<1hMI~XxD-T9@_&gB znU;Emr)baAP0JasI0-F za8r3)1zugfI?6_@0<9c}?*AcmxC&3Z`!n&MOauRMBK2H4an_WfYdk~e2W~AL+3rK; z1QJp7)!0kn=VCjO4)1Sszq(=N+H7e^hN)^_fiz3+!Sbh5Z3p*5j#W8Th! zO~zHmEqRktsO-w(+jCD7o4V7L$I81hjz~?!W>fx1)oHvtW_)oh`-1UNYWt>IPyM#U z?NZ>Oga0wU3mHTvdP;=oIj)06N=>)0iI3@iC`eemdE@9fKaH{PA)1vIwOvqm%1)KMiz4}{$47Z5~o3DcxRqh5qo(BgfIU3xuWd` z*Zl(3_cwK-_JHc0TV-2=cJ2vaXVr-s%1Rp#$PR=z?ki(o{Z31nJqt#K4wVOpf3muZ z8ZV&*eCbL!|-hsyf6% zHsqO(8~qG#mMQxhqz(HZZ!6a=*ZHyIuv&r4D0*(uGqEumbu33`Y#4+SJn@w1O!2YL zF3RpNJvTQtE;R+U$~4!FWUA=4^n-&;0YE3#E;nmu26s zyfBmPX{PziAaa#ldifXl;6PVzv}<_P-b*JXw*IFTQs1NJ zyv`#k@%nTATub9o?x)MYp8NS?MSf{O z^#Ej{s1UwCx^ML4eZsns#vU~Acs+fGd?V8B$#BnLcc&XJ9nwgNed1lDF?IL#uqwua z^*z_V1g^K?W%ZX=W!7{UutxVx5{2Kmt+*@y;bB3|eJ(XU6;uW(Kd1XTlM#{@94MO` zG1Xl#0!!$bB?8gg34L)LIUpl4Z}Pz!@+R9ejjup1@3lN0Na~Qu;}h|LY@RTDEuRN{ zp^>)MeNdHg;P>(S$Zi*50NpYNOvGei*z4?7!MBmhKHaz6?HF1~okY&v2XI;F#a75$ z&IM?bd`dh)D``E>lKB$rvW@gRnn+vGWFRkTD!*$Fl=9GX0#$Ef_iBa?m_z%0O=q2< ztIC|{e97OD&wRdeqr+!7@?}&k>PzYbTl#KSZ0waQdTJ0Lm3Y?&9AuqEFU1GzYnwR% zJR}A&oPwTVTr2VL0~vBf8RV{-{c1hfwHBbIdyIk$)c<=3q2AfAT)`=~L;9|lLFp_} z)Y%E8`to%;=eKOo)c)PFma*Of&qf`CXeXQp(+n}3^%hwcMQ@1cKovO#g`B_TAZ{Fs zwNr7t5jPM(a`6WC6{<2(ie95b=UJEX&X8AsLES4}otO|Oi!&zVBFyq=@Tw^=+DxWz zIeCNy?b#;VQSROx%C566)&eh^ndFr8I$yYSr! zMfROH$Xi#*JNL<(Xin)QiJtCi54o3@!3Z*`jHcrqluSoZHPjF^uy#yF#zQYvd3hvx z%00a@u@IOfkYfe^YBjwR-?Pavv$@&OEN^L6CpQTp2-4@jda%dI8tB2=*LM35a6Dft zt|CO{2~k!SOxs>v)@g-;E-U+AUDmfOzcXtU8+Pwxy?oZ}htX^;v|gJ#xx>w`wO$_y zTCW_n<--_=$&T|JH-MY|@n&er#s{hdE!pZlEzpwvS4lSKwUX?E*GjVX2maBL{e!C~ zE9@XnI~L-!j$-2S1b3W|?q0<`XYuTNo9;E-v)^p_g1^Chx$4sV`72g_H2?DIyLT^s zewXEU6OIw4aQ3DDP81emElbS|`C!<8=m+aIhI#FUfBo-t%Q@<0BvSrOM{<3EXsG_X z8Gp#_*Z%q4gFpY6@nFbD%iNX)aP;}N5g8GRUhDw|EZYtd% zw;w=17&eT4FuP;XrM;X6u1jIyQ`2cbLk)O7o_;vtzJah;@EQ^?C-Ec*4O=psL%Q1b z7vQ_6$x2d7H6`rz)+4tc$mnfL7;~X(>zXxNx31yr*RI*xbpff13#bFG_JlFtUc2^f zU2S4aIaWI5lhw2LO+`fAuR5abFlxbD)*fa!w1xLZRyPIVY|HpIqUaUThK$7R<~pSgaZDLS}}{q-7=b&yf%zmU_88M(PxIT{l2sbfcRM}3$4+G*FNOI<%* zy6n?aSGDkw>6$@{$OtuY+V%5Nr`q!7;x_s9(;Jp-^xfeGME{?EGh6rKh}w2{9dA9< z)#cu{ML;CnCZm5MBYz^J@Spt9$MVv$idj=5Iwh$JFAWI}4-aN(qh!FOsRQU6lOK~e zSj1<^yE1sez9SAU39qUuEv>?Zmi+z0gTMd&VcI|zk{Ky9gu&8NAg^LG>G4aJyeGL3 z_(PS5z9$JT4X=D%K^3PDGp~ zB!+GRaz76KOq&7zieh_gB5}E*U^7TZ4!iYx_C5|?o6u`~z za)RAuBwmNq28D_*ce@U7A$3C1@;$PP z7xfNze~Y7fkL>Pm|B!rxt^h+@={G&A_}cD$(43;XdM=QeE~J&rV94&CRdlzwd!H@Y zEw&GWV)YiT-_YrNUH3vU-EFNC3bmmSP%`&t()*ZG+r3co&m3Ib zBX~X>@!f`}w4zUUJ)g@w`pe}ZN1uVT_3$s3M;w3N`Z0q}zZ_AsS-adbbG>2oBcWb< zM3(m@_cQLcoca7fYt@nb6VkNYTs@NKvp@oiFBK={9WP2VN2W@G}QDV0)o4oC`B}7Cff6`hQgLe9Hfp;_?JG_3*L(ZPVs$ZTF>F$Kg{D$| z?MhiHYNp#|w>5XQjgD&awr~E7n<*J;Ly93Y!_kx`BA-*+9(z#4Tp>a88FA?(HrIxI zKlA2dh-2F!>NW&OrCg=-0!d)9;6j`OYskVqwdy9ewWLemVIs=2WDc?an}n1eE;*9c zm6Yf>f-a14gYLEi?E@f&EA6)h@uD!j=u1h0cB>}#f=`9h@{e~c9^&Hm`cGn3C1ve$tT&MPMO8AG%4rR()y*PhvOo%r zmxqQcQbW1SXc0MV?PkVE+H;iOi7db4<-+JCTA`6|o0_84q@{`U21c(J`pA!*ZR1Z0 zw?xJkCM_vlnUEk=spftGIzMs6{dO}V{VRn`@%Lq9{xhYkbV&H z-r>g}4Dph5@vg8R89{t4O%T}WJ`JiMh)iSXRCNAE(=q=3Ter^EZS8W}dR%+|c$eAi zD9lYrm^|5^zF$j4P7}hH&KxD9;vdHo(Qn^g|FM)Mwt?imx+jn8>KqA{75cLxcp1%O zraYqW*3&-0(qChy-yI^SqVeOYc;xk&KSprg^sO4&|Hlb+{*GwpW4nNyP7z8AJzM-5 z6HvRgOZQDzms3~QeO=eqoCHU#d5p-?@~Vw_G4J8*_SUUVua74o2M0pOm=mzyPJu+);-r&|E&guNb2$sogw7#N&UY zqQO(=4M!hY+C=*WOqdYhkJaOY{S#qVF)AFOurqaaulLRA^@b9#i`YU=&eNy0gz+U3 zr{{TJJ$ivkztyt*Fn_bPk7W?QgGtL)97#?~PNQ!hkIs(E^2v+I>bzNVG9x=H|JcvS ze`o5;V0dVVR_<3x_p5gJ!y7SWLwJBPK>2A*SaMi$gf<~Xs*lb{*2&V*@Ftgow0T1~=A`eC?-G{OVmy;&gv5utADV-hk_Yhe%C zSbFMuQR!!&AGy+U8jbrb&Drhw%6#Q{UqMK!D>Mz{+TDCKldA!-Qm)kct76r0DSnCZ zns`k>MhZSg@0|Fuup*67D=n#n4=Il)bQR%tLm&g!L=FocL$2UIrBg=Y*imZQhhcWz3vKbN{5}NN!)0mEh ze$fGuzOhbQ!K;j+AIOK%58FE@a+&elYZK*4l}eEW^njXM{eXPB@^ASAacyH}W-W(6 zYTGxTwJmczg*%dTbl(Hu^{9xSCdp0ARwVYkN%y5DvDVYDZ?QT^rUk5y&}frkshOOV znyOW6HPTm?BwD>zi|AvPI$Lgn&VxFufCDVml1H`3(g?PR?MT&K7O1#=@MpOTbx2ztRC=kos+CV>>T?KnH=k#wJA zCO}0LKkOZe@zw4Bzar??0eU9nF%hk-><(fM9MoO#Jm_&?jn2apXu(KFtF4$ulE~Ln zoIE{rYYupjPTJ|%b4AE&IzX@pL(3K9=SZiB-Xk-zT!8#4?e1d8fKddel``v~&}K^q z{6=@7eq_!eo`KlLFIHGi4u!J&7F1_%Y#KU>4u#PBW<0QOp7_tNEYDUmG?hL;P!U4r zk9>dS$WS8w9wB}QVl$D*xbL;7&(3BcL zZO>6B!a(K{A>S#m!QMiLjyf?6!ah^bZ{AFX{<`T8`UVGR;blRM$+bHP>}+HiDv?`2 z4h#_yBi;U(_9uO}u{(M$io8>+1z{yuadUNTb1JvPa#2M39(#U6_>dtkHa%7z8>>;raXqde zgl~!R+4iXniZ-mYi!;lh)U6UCiS}XyP+n2GfBJ23xFKnJI@}5o13I8M8N?GeCWHkVr zk`sPMw&NGt!lJC0XrMcyqcus0kf41n+8*xb2AIMSiS-k@`rltuB-^TY91a%(_n}Cv z*`)(xl9uL_mYSwb*9sFIF;R55w7T<{4ACDQspB^i;DAZpw7SMOi5CavHce3x_CGW@!tly$WnD>Yb<1E9(`h0ys0Z3Bt*bGCfx*nF* z9<-Vs0NHI5p6viK@HgTC70zJs-2Ef>d?a`7zIdFmFD1{(X*9h_-+P;Jci4~L3lnwP z#WyiX2jxoa2R#2FkV*$E-Zg@=p5`-=K5^iIJdXmJ_f0&=ljh_09DkT2qEqL;g?y9! zT5!YHd`|rYwwMFr?#;9rAz5er42-IG^S7l2}rVz&iG{u9Im-p2j60KjWHkj?>5LaXGgeflG7KS0U9 z$;{ufeZHC_S>n4%?nmd!?WJ%+DQ4!8FYZbDLXFjzjOy!#!}geaqJgi=Z~vqHk1a$pw0-a) z$BZI$aRn*H-bFdfEr5QIv~z)5-5g=q3mbx37(R1Zw0d1IYYs<7^~0&%g}NgHQLA0Z zZKtKO^ni7=NUuoHC&*W>jrQBj0WC98WL+R3(c?vQY$M7_$TUG)Y8ZBQegVfX1I2-4 zphDP5fcE8Yo+k^t`2I(6ssz};*WK?j1Ex$JFmTGFmw!Kg{P)YpQwFlum)3_ck%uAt zn{lzJnt1kG-*5J{j^8)i$#>Rx_t_1;dHZsGbEPXAukQL%PTqX-1YSnYoE;ku*7K(V5(>i z{lI%AqSf9jTi3BivH-Y}x&L#nV;05>kXlox8Y7{cU za4QQ%zsRhDmC0H{MLkvB6POh@KK^yMajRivOyEwyt9Zxa1agzE5s?7?t)myg?-@)l zFp&x*BcRq8V|}A(kxuqQC3&ah)Pt%+1($-Lgh}{EP~%%j828Vyevb=_lUeIXJ%9|8 zac{l@h#DO|m7g9#g7~+DfHF`;Kwg6{%OkzT6uMk>VOz-U2QGxCw_pDhQjg^Q;m^^D zCoXn9M)7&P{>A_56hf9quxtKbKc4~8{lC`hEE#|(FiKLqE0OE6x+2*Xdf4u~%ZmTI zlFQx36_Wq1<1$vk18nhnqt4v}AdGRdIg;$gj=z+Mv`-4;4rK4YdLW-biuW7LUq|Hz8U zhT{Bk16TUX&$++J@j#C9n1@#w906mjZU`5wQ9_Cr+_;IB5IzUiAUKP$9Verd4j#uPweSef1r2Xf%^Iby-Odc_w(d>a;$~Sj|KNLuBZG;w>lEnBbN(w zvhvI-^ZrUSFR1Sg`h1m23s-k7@wTpT?AeB!nGTdFvsI?vwV1NAO&p&jvDVR{B0i^k zBHkwb#AyDaUOp?ibo$=WADX9;^^PP?e1*!gVJeiJ=0rjpNr0B@+<7JLQuKvzDL-Fg zQe`XISI=HSA20iJsDzZ$k+c1&B$vMFlpa~ED9Vru@BY@Kr#~a|;|HJqb+eD962YN( ztx_2;Pf$W&go`7|d3=c|*KE$oH7VltY=N~zL>j3#qlJvVCMj9Xs?}hKz!xPWE163{ z-#$~;%hgkm1c6y+;=j~qicAJ$wt+RI8{ju&NHx4OBwG!iV_A;%JJG9l!Y~G{CPOV( z!xLW1MN@}D`k_dzPfsz(4e1#MJy!z9tE-@@7_0Yj!?hqwsq!IX#N|mByy+NHR&on^iu97HW9AIFwwaJDg zIgUidg;PT*)c{YX&dSO(Wb4^-q7mH!zAjq}MIyN>DM`ge(D)Ln6+s6%J3A}OsAo%w zRs_+h`{3Dz#Sv^t4U<~Hxim=m*=3Uq6F zmyEG`vjy0^LZ7Wd(88E)#*)R@gRgl5lcP;E36w)+0vBUVFQ95sg5H>Dmgg9aIeIKt zMARbQjw*Wh;&oaSFc`Yk63^r*%yDrFMI0Mv&B~)HQJmhS$dl)p&3P!7PgJ4@I8y~$ zMGjh!2?;S;F2SnEfr4$UJ|`hxo}ZJGkLB`+LPWOqi?i4R0%%G!IHji~r>SvDaLu?R z5M8v1QjH{`=lx9jRwhz)(fYi&LV00cULgt##bZR>zZNqP0kJ3cbb`C5D$a)`*`d%g z*-rE1D^?|hxpHBuWL326RewoTUVLFHEA+ssVBlsC2=WBBm+=PGH4m2_qpb((NBn^f zt#uCll{mX_5UdZTO z*w~OHE^3*H+BVQP_D}boykp|tSzgQiHcR!|G|1COkg23(e(%r7ZQ2Vz#QV?oLUy`b$(5LjkM)f z&6VQMn-(5k)3pn%4Wr7GWKv<7kx?T9CwogRvI0im+hx|`QAFLp!&J1DBX3kis?k_N zgO;C_Mc}VyH^2^O*cl-(yZ}!Qm?-|;x;!H$4N`MXY2l&_aYku+uD&p%z=;gu55X`| zOomtw2@9mhJL!|sRLQaoaayT9H%(aPcYe8O;!CV%v6#;287ZQZ#b{$ksSC6Pnmi{> zg(yXgN>!_3Q)57@h=mkMl%ufB49iH-Vxc?jz<>Q>;*0B5F7}06Kjq6ImPUsWU^?%OVTi4sTlCOW+V-& zMArw3?eEdUe}5?+K&B>{k~34Xosf}FM@BwXtVxcIOyGvlsiM0BY18XnC?+}a*nrZw<-zrR2n!#c;x{5F+u4C{w1%&AJ(-*!xSbLqJ|__=~YJv#z$vHg9s+JAA-*0Bo_!> zyCd9y-4Px{E5aSPNqQvo3{#^DDGrd&5p-42!m?jFf<6vk1)ycL0LX!St<5Y1G)EAd zZ%Cga4Me(F`yslpi_=IOYrm8Zw0ba$*4H*SpRK)h>ui9x_xgZE!p$gXFs{IsZsVc9 z(R)_x2lUiZPX-2v8f79}T4y`b{t$109Vy2D5q*3u`N+3Ra#cAA29}@NvzUpCGnf*% zz_OIK@*3%t`^~?-kiGE!ZTWpRv?imiro6hWJ*6yA`rXhY=pZ`EsG}QYW(;Lx;-gfN z2!KI8AvPw{9M6SRq_$U9NgG>=;e*{3dBnGc4XH|NudJx5XxCN*OV6ySpEpxB({J8} zHEeu*bW*hZzej;%`0r6bzYoUs4zDfrtPb${fL9Y*jkR|62Y5v)qfbfEry$he!qFmH zESe}G!T|J0NLv1LbhrOGy4UOf=W%^C1?vUG^OQ=Vi^*0v5saGSN;G+9rxOSB%;_bH zJSW(frVxD1d76?qv(x5-apnj#z?>`{^c2dHQ;NKZ^f-mnW{)_9Cc+%&1nnbWNok5A zE=w&x2?v^g58$bBtQplgSbQZ(MavTR|LyLYE}%Hgg$4L!JQ^1-nyH?DN7qi-*b zS`fdByFx`|QL|2V@VgRX^NWmRgOEA`FqBk8Xx0K>sRj7bi>w>X&Y_cs(t!g9(hVe* zE+m&0@&A$17AQQvO5~9y|8v!O@8fAF>mD3M*U*4i(NXESn^^@ndx0?HEMrOU7ZS*R z=te=(btz=S_d|I~(leItV2D|QY#}4Eh5O+v<9v6~EZUEbl+h4e z>W@fhJZliAiS=-IIwH=>(q_ZO0HEGakXM{J1TLyW0WRpiLeU_YNnCz`zCXEg7B!TQ z{O*~qdpDOIUABHli2Gj7uf_kszGmr-o40GwqnJdTM&WUtK^;fZ2^_t>9gNx_`6sKl zEnM*V_FLyVE8E(+I^tP?0x^iZ;5M*2>pyP)2RU1hP?d7Cn#m8VNWpvtIQuSk4#8n|@$t zHsEtb3wX$`l4MiJSKGOOdgVXU|<5`gV@q)qZlV_CYjF%b{Y)F9B+P0bNEM zrMeJPSp=)&$6CXz68aGM97mU7twSNcu#_x;8zcFH z|A7Crv_xu1Pfmq)Nf8{yhtWbMZ3XaNcesO$6*z5UI}Z1^yc){v(eE+1XB9qjq{C{d z!o5FIOz744FYd_hIoc2K?ATntHs=^g za?JAcP4|)e_-c~;xMMVFZNg?h&s|PPu}s^w)n|R!N+%LGTa*~24)mA#8v>1RIgFiM zy0U3~2Lx=f(1Bei{Ld#iZKKJeN$f^So9X+UK6|m!@arVQ{`Z|_1S2R}FUD@FH^Go9JB^g!| z{m8L3yFH^_FSUGukRIUx9au%g?0Vl~??R7Ucc+Q z@GbK`+vrH9TW2#?U+ahX_zFY*L*5sk-XWlb!l*EdJKXQz2OLw&!GaUgDIcP*u?E@4 zSr>`p1#%4@bzS_|B$7F`CTsW3PZM1?Tu$m>?dKov$~nb(p?h{T^w8$@5gwa1mF+u? zQ0S?W=Hnchb(e`zN2kQ3NHe1|&@LIYe9q7a)=wQ3=PUC*7Ez;Szl(k9KU_u!j^0ik z2GVz1i2a?;j_YM?x+I`5p}JAlklEUhhhM8o_dL2NBhnup5OM4O>Fm1$qPW(+7iDIb z8A=iuFYdB4c8w;nYix;KV=veXc0fhxO?qc{=?g5qBSpZDJ!;hGRa2B0Q%p25%@z}5 z&Ms&1e!l^|?|t8|{PDT6WqLVt%Jclnf!NS};_>6AqNAX)D=%5c3hC8)RLN#HWu?A4 zr4q3xHZ@Qm7^t@XL+PvEo#rc=RYgMB_N|F%_+0lqL-j>`($bXi@rDE#JE!U(aBKJR z31z9SB&9?oz1Sr0G;eS9U(}8b3r`EvtbjD*ww(3Hs;aUJ%0%j*gnIXKVV&oOHEXsV zIdQV(=&4i99%})HIoV5F{wdAP@tiu7+N!toboo)Sw+(W436fMBTh3IrlQ#+*R(aORm!(sQJFqIpuun z`5gF$gs_>r3_d<;=RxleQG!^rM44V%mR^<*EeVZtN^&ZFrgUCTr&iNRWc$aLbL-BE z);2fW5aHI+n-eE2p7GxMmu7w~I(NH$@$*}vrfTynCH>NTk0FEE@99|Z zg>TV`s&uxEO!}3K1uQ^?8D`rE!0@9lJX`s!UHi;=gLAp%yY`jB-=psJ?lpRJFW*eR zyZ~{d$NFXKXQRECi>LOV2d#5dzUh@AHE9OePVY@GuTHJ=Azyt)jsR4Xdhp_*Q!NKo zL5&BZ4udHwhp{E|>oEekMGHs)y+yyEg%qDdD~28!FPi)sVrxvu`Zh$>sJuT7YrCz6 zTFwrsZ{qIa-Fp*MaYtK|S~cVr!IsGvXpc+W*l)X& zO3N+*{RnOdkfm$Y+l)R1+r`wZl=vJtxnIos@O;G?Rc2axVYVhSrEuCKI`y+X7?Uw6 zI=xOO>XMRmNgB`8!0?@ksx6+;dzPY!Bqx%-yhq+F`Q)-#lhTq=m7ww_$|pPEd+`f- zJMZ2FDJKu|8+qXmh9)gJf9*>1SB>9gX1IbxtTRY{1xMdHsQIXrI5v|JlZZH)I74bH zF(<96q_$Rl&hNurt+3%)MWUCJc{KV-&!%xh%0~k1Ko#Mu`$=@d1au}N>3nrac+7IJ z{KJF8*6&t_8N#!}fx`fR7~LxK?e>p_WuBhy%iLSeoj;Gi7EgE4vd5YsY{OJf&zAiy z_=l;UB8@R;$jdHsUxww*wcx+JtdqR#Hc!mxTK3$2dD&9gW#HI+dY$-CwAFp-*R%?` zfi=j!yo(mrS(-+7ku2iOg#COo>}O47g(0m{iZ~g61`=bRq1%~D9#vK9P|29@TQ3Ua zC_ReY=-1dn6#(q=FMN{6H`_`}+C;L3+PISs7<9C4PzUrUW6^CKrOl3ocNLIRDT%SN zH|-1e;OOW;LqN|o|H9zPIJ1NnuKis5@Q%M;v@-M$rEhUSb)1-zoukXvl$PWa=1U}r zoHVbZ^Up)za+Eftz}FBQ)wv2@* zksE#nGb^MvoksJyPQtx!GsT?}twNNX^0e{@c_#u$y9#pNkPwqN4QCnvR7mKGUNl zU7kKSPpu|vctvg6HT>_Br*}%nd=uz9Yt$X* zl!hgYmu~cqAaS+#(3Vl^-Gy8CiFfa2-~Hv+gkLqy1&8W?qTKowjncLX{j&pVgIUR7 zM}}N66AZ~>jb$ubRANXfk_<>1#;6Te4dbOByFFN3;XUxc2=%U_ZB62jKW6`U|9--c z8W}85LBi2`gd>6W!i||GH2Kzgi`D=Z;LH)x{*$E%zB86Dny6Yl(Ps!47H?III`W>_ zI^pWV@3&mr`CZ7Pc$GDQ41o;KdD7R7zK5@fIh3bXWtNH=MfrI}8LEupvXo*?Q|%={ z&I@Js5C*b;A$IW>i|@v0z$(n}2Er7;F`xI5#W$hs?pn&?V*7Gk)ZGwwMf7Csd)t>Uk*Jl-W(;|Td_8P;boqJq{fRtf`Gwotzt<3r z7A)8pL$o0V3u3f)cFBAD#%eGP$ltzz3e5Qa_P(RYWgkvw`0P zYByvE;0N50hr})iGMYIeO(gb=*VdImOEsAJ0Mt|N;R9m#(U~AGh>yuLb$GaPpg#o0 z5r_A#_3^%RWkm~g$`YwPV?bv?AFq$sCB);X0pGwREMw2PCKJ~BOr1$slId?Ae(Ew_<4}c#lbPhne?DmPzCUtb=TKm2FcE`zh^D1AtN z)X&2q1tq(^=j5E^NH`4_x?IqP{p1>L3f4zQMMdj_P0>FMb9H{LNt=_C4iEOjWbP~& z33u9tJtR)x9ttIq1z|I}ABu9bZsA8Til7 z&@(7L6WdvOT()CxIVm zsk^!D1FgA@x__Yk6!w9Nu^dP*e+g!1wxzDFMIwSV53;YGb-Uy=Sd{hf2U_P$#s65V zAJzhy=#lUVu#sPN6m=9MUisB*G0L2mtK8psmHcUdT31@*>}~2;bDq*F+0KVewX>Zf zSZh9NEAN2C4q9a6X;^J{?iVa;#PzNc<5kioOG4nG6s!{=`W*++Z<^KtcPQf>95)gW zpo6v{c>vZA@G>muKkfoF1UsM<9%YQwSSKQ_`?glEw6@*RzJTvYIrxo`SEqp>pISx{ zXng(qC-lzU*l)nLT6KE7e$^^#e``NiaGj#e{mlJO!*OKQ>7J`jVa{r6KWl$i&@l!B zvoQ+Ph}}C8wRx8sdQw=FFc>;xJoo}H1KQ{x8W0)T-4j{)!_ z|9*%B<-P8f4$FSn-46bV@?;uE_(u?g70tRH#CFI}Ad+E{{X=;Y38J$FJly}FTPi4% z`EL47uVnX-!jPiivgGs>yuwO-jB9nYdouM10`~nim1VS&I5r%>y6unH=lj=FrPMJL zG|o(+@ub(8<=YaH;#~fusW_)Hs=JNesD;w8bok$!9 zlLhb7RUIQO<9o%BN2){va=3lfCCP=!g()i9$3T~6sblCP%lN*=04_`ufEf-ZLNJ+>O*}Pba%dPZ*sG3=x9+Q zojX}@Yab1ve|iK!#Bg&T>O*{#1aA!anl;Zf&tx3$x-rYUTM7_rG1Q0c-EP{R?-?KB zuUa%ir-%5!IvN)jlN6Z}pBiU~OGAJ-H|7NJ4Da5|ug)wf$SKb>q4^`tD)PEM4a9*r zNrsTt658OCuNt!ty+}2I^nY|#geJ%k5)&D;Yh4r_nD=J-jx67tJ^4XpQ58B>fidkK zsgQ{MLF5M2^~SQAv}Tp%6M9<6sEIERD~K^dN~7XO73B^>m{q+icSl^1Z{Y3}&yw9I z-g8CiFy)8k#}!9brdAq1t%a-g;@q36j!_nSA(1$Enp={q6Dz}t{Ie#N(GSPEF9{1v z49pBx>2t%)w$`u2k4Cnd3Ni{aTTMyNRF=V1A#_$J@wb3bTQR30FfULa3O}a!7zEh@ zRZ|8)Vn-bopxa*RQ|i+cS)ZfQrOJn0m|2^BDvw?yg#mmvi5kfiK`RcC^>Rn>r^(I3? zrfV%mE8e@l|L;@KhcyZ_7B8NG(8-L&7e9wPn=+HbkIyeIo&hWgB>62clalLR2$vw8 zb69rPo{5f%AH+$Nw9U3ZI?L!@)yWzrT?q=@z!YsXm(2k$HjKD-Z-3N&O8`7;?qVnk zE@yZ6RqV^uXQgFI|0H$H;oKwpj%YrY8%~!%>L!_=(zgWCcNLhmJwFi-Ey$ZP4V|R- z5svN+*?MPi2t&352(o}(ziyjHtTYv5OploLp6fJp2%8if4{F@Trd@|c;?15ub?{`K z)J8sI4jbitTxQ8u65fOq^Aw5neSRC=(^+b$D9jhoAG>;%9u=*N*j1~ytU>4PtXum- zMwh5dNKkLsw;P+=&YpU?xlfrRornA}i}*8DkP6DOn>Va$Z5+T4! z|73Y9Vy}!TLGad139~drs9TZv&?hwRByWq+=i>t+wi*mQSI|C@+w|&vU+Zgtu3URf zm<8pGA-~gkC(=x=q?~POh}x7RU8E-&m>~TD-$|AhbRhRJjinlM_QNfAM>oIIvv>p< zgN!hdI(i7tEIk-9p6%NKVc_v-+%2pSNTrAzpMuSK%XB^G`0V!eX%4=)OM0;GnEO<9 zDu#N@C_2@knmoOzWQ&Anw<3n|Kid-jiRQ$IrAPM$m(OXC<~6)~#_$WOdIN#?#k-oT zA4W#)lgyKffTojo^bQ;GMG{mw0_Y@ts79X z_5=lLq7saz@}j&3DKkxWN(ml zJLo#*Beswh=#a$ zeWGUmHXqo$LSfFkJfNYvG^eCM)CDmIbD)D@D9XE@*`P`*Ni*fC$*_xpyl#3#kReJl zFL=jhUsG6pq*M`;krJzRR@f+_ViSYH_oQcri3w} z?0gkjcvwh}-<2DnnY?1o+cOSq__)ZFmQ^n0USi@xBV^QDXw@MJnuIYI>JA@4@L8cK zDoBnklZ+P_GG?HB{nrGC$=4s&0gCv}dmzhbreo{18u=c8Ql6S18RDTxsgakN@9DF` zyDXrgM!x!zeD$+&_0x)S<*T1wVvw(X?@K};P9V%rm6n&5m#1EV6NsH1-E{&Gxyh(* zOi^Waoq@BBLP2_;6r$f}$|Ayz!J1VY7f#1L?xk2>>vg!iFuSNoObKPqvPV&5&eI+O zJu8py=sAQTnZutAMZ0nP#>JoO|4^-BeTFX|KXd-fE6cz2`3XPk`(GS(dpZ;eyFom1 z=1|IPqD~sDm|UdA^O8c&AFiURiExXjHqgPp=8iHZhGs z#hb*C0j2DbijpSD*{zqGW$7GYbPAI1tjg(40`X& z$B(|g{djLxV&q=wJ!P$LVBSv6f;B7W&OW~8dR=8+O%0~H*?wkyD!1I0@7eY~B+>=o^!}O7AN--c-b&x?t79b;-@j-t zhVYh2!WWA^o+`STRqWJ73#UkK)LuE|(!w^;O=)J^E`5whF{;iR)4w8u`J}e2boG=zcK5Yj7Gmkw3U^gEJWVo zgKM8uhkTlIeaWXM{&qj_99h4)Fa|q+AhZ(2F{)t9b=FFOjyy;DoM)X?ul4FRnf5sa z!_m(t!c$41(#3qQ6Q2Cdz~BPx;NhsYP&+C7!(swOXHKP1DBk_-d$yt^E+lWfn6Om+vUcDw6#r+JIz|U+0{U@36ACs$z2I470~fL6%NcD8Tb<#j(6-AVUS` z*X1cx!M;c5jUn@x-ZYn$pF&LQMsk@UxS$Hf8wv`C37BbBe+=RTTMdk~EAe7~qh1hc z`i*!o)a$y^e3l*%K3!A3K*TDj>FH*9T^#hd5fkn+)I_V~-!m2RFa$_c1^(cehDLXWDVig+} z=$W`nW3Bmt%}X`Jit*?<|G`G@+Ntx=1hdYzsHGGmsHbwpCG2oAez-4Uzz=pLf3T+) zp96V2>g7VUM^i(}r3$iDxwknfyb9kwgS~|!L7@neKT!{sls08lukEAAFM4?9stTA2AjcTT`1H zRwh*_$>boMcyG)s*>^BwzlNl-mGWxxy=WyMSa+^i?ZLE?*;YsSh-{`S=p5GjBC{A; z(EgX1rL6w~X4Z(9ra7oF6^iMKK-#Fhr_9!6$BD5zW{~y333)X|FGa{&hBESH#wJ3K zGwbLsd3`u^E?{W)j`8f&OAB5-7nj?l4juTMSKW;(MQATnUBl(VMift8U7e$a@$01Z z*Ul-M6RJE-Vtsy5eZ892n?12k&I*yfZD45C)yJPJZ$@lhY>==%){aq}RkkEnZZpY+ zMPW0!F2A_GL2a(FJ_mEuz`VNmLq38mRu$Q)w7zEv7CxX=*ICO4*4G8ngH9ZMNnKHz zUMv#+0ualqHu`}UERYG`ELI1HCGQdG8;i*s?8VlKtDszgR3q;uX45&!tUjr(C`m__ zlDmK~&#DbC*ZX=2vMEVe@Abvxb+&PT_TEysC|H(YuZ!TbP8KnPAe#t+iIEx14yE4A zE_OvshZR9h zWaaJl9YT`WVK2~W_|bF_KRyTGsxgM#vdkd!wW&b~QbKU_hG2D!F(FqhWXS_MTDVYp z;B>l_lFn=zm$=lgCZ$}m6v8TSzE;<@xJQUO29Vya#Yf4DpGlXT-4*{{Be@)Cm{?$j z?%a>)kC9$KAKG17bbyMBH1pZmxSU+mcf^`uluX%~d0@n#Tlr*&aQ>&n$)M__#7gVw z@{~O>sZohNmjWej%*`}pVj!hg`fc(LU#VHWsqVvPPfETsN+oIKx{^#)E|9H8b<1i! z^x#sGLdDeBptv|qVoGMFDbti;l5*=S^tA}4S5>D~!?Gnw$V^X8ic5@323983I+F3* zv)$mUiQl0&N&7CJ-mgXqMwcT-KiTy#?ujnbwX`a&pt>b}mr*QOXPUM~otd1I{tX#W zP|-8rSddqwA)h_@_j#g4mmT_2q~Kx9?!+zWL7K>2`m&<0$_HBF!1b*`Zy^0}sT zooi}lWf|0@%58?do)m)m|u`m2rpJsMZQ!}o!xv~ZJyI2Tu%*a1Oy~(=j>#O zbc3YPZ&V|!4Bz7ID+cWJh+3wZHK)AHODZ7@6L9#Sp$9Y##d&4rVWt(O(zv=+EqBz% ziVif^h}HE+OlLGVKMaYkmcpnlQ?z3p?1us(PKz6UrH?c__1%+=R4P zWDzu;zVU&f5)?`XLo(_g%G{;QAyZSu5slHPONA(|q}&g78fFc)?ogU{k~Cp>$gE8s z;<}CQvD-Ak0U6nW5*?zXgZ&vxPbDrGRCsdMG6z}?lpNKZ*dOjyE7fl;Trfdx^&(FN z4=+y-WYc3jyjogYo15|HHs@>kQ?fRhcMHFe zX~zJwFscD>a0Iog5Yn`&fqhPkX5SaH1RMhGKG+p{@3(+o>P}x*bwC^EO)A{f-g9Go zg|0)9kHmGGw(B5z${KuKfg#X}ou8tn8zn4;px?XN4tLlJ_xL}4w;pZ}Tq&c2!H^qk zE=EXOi_)EkLj5b^{pL-AF+Mw9q&y3XM4U83Igh&eP6PSS4Iwg+cz~~isnQ+duxp+; zLkVCoPWCq8YB*w}1T8DSc@PrK8}O=vp5`XH6$-h%NzjJ`oVqvKM+%VBIwU7rCFfuN z2db^pAYJ^goU7z~`=ido96;VSMMDu0pAecQMVs*vpft2uLio~$2*E@quxdQbnH!(XaBgX&--jtlA>`kX! z0dY->j8?q^;q!hgL56xM9^83IlJjTCS!K`+2zrfv&d$S5WcgS68I; z?RmRPgH&D(r^2ojWXcLFOR|8iv?EtRAjS=HhfG0et%VUwv+C5z*Rq zpX=H88Q``7Xb@im$w=OIPdB>WtsS0(VEeM>Hb@q`16hvPqZ|7I$FLA6%hl_Gc6do0 zZ&<%%7A@O8X@Z(ggj`BLGU@KkrVCKcejN;1sGojC2C1q}lmm?LVC<*E#239^V5>o~ zwCCnA)L#`C7aZxYfp5;A)!QWcF&RiJ!7VsQR)c+^Q$>$JiHD| zKFt-OXEX?owjUPu0`A`9<(rHJkt1U&MUOV@9$Erc7usgU^|QKL+ZbzGg%+gRPDdC7 zvebel9asY5O_u+FXF`%FHSZV9N32H~`R5OKw!GDI2_Od@MyLz?w~bR52ou0+bQZfi z!aKNJg1Wwgb&GWifSZvh3f4Q;JMt|vk1~%Uku>tQ*5Y7skQZXggPRKXcJk5RZC`x~IBR=LoAAlGQ`hQ`8iJ}sow7Q#Ah2*Z5uUgP*M&6sR;vu`j4R92N5VK{U?zGo z&UBDE#t@ShBVMs;K&Tx<mUfdyXY<1#R%zy3-4K9+T$|3VBNdu+dQ9&o)ETcq(ee)g<6s zjEGj>mT1DSzgtCeOM{Cu9ufXEWF>{;)`Sz%KLAG^F%4E;lV^*h@6yHJ(NP-I84xMMj3EHi^a2Li{w%`=Y#LACj1s@~?wy}z!sCTu)`ph;<1A)qtwOm~ebk1Gl-z|}1Z+o=oEtljFh zCOI?IkR+8YJQj66LPhMo2|JheRzI`6)}TEyDVnnyh5tH|I&J6Bz7tk6gZqai9l#7azz4*MZgi-I zPKWpznwsfyQiV)Ebv!2Ihyv@(Bz7DLmud$skZ#_HU|LnZHy;PV}JT z*vQB0f1G{&32}9W)|Leil|URIq}I7X@yC|0FI*H6B``6e`DL-?ntW3_Xm)j_Ifp{( z0r)q$79KccJSr2xk@cS5c^UL{9a%^9Gw1Bty;!7W=6+0ZbVy#Xh8m%v?$6$ZVYGFY ztWnz~sjdZ@xq0r?vPqf(?x7a^h6Q8-@oA7izAY;?76YgB-0XerO=j3Q&=X{uh#p&C zM^?2e=4>C&%>e4XIKgiAX*rZF-GqcgeO66H zgQk5j+fWnalO^4R%mWQJn-PWx_LUt4oHPA`%4=&Y%4;NK-)hT)eI;|h4sYR3(&eyk z#6ITL3>g(l_dTS)Y3Ofs-w-+~RO)A4&4f)zSTIg){hhe9a%72sE8{axqIT#7&xa3EQ%rM8bAn%JU|^7cY<+ZHOr44z zgYS1`eq-&27wMd>CJ~kEGbSy-H$4E6+VHT{_(*B%Q=lPk{Gp!Mp%-dfPt@LdKsV2> z5sg8WO9Itl;Xxt59Z!X@NktpPqu_?}qwrzVcmITj8}(ct?i(GsY}K`cyTs6%;OdZS zRY*uwxDV=B;EJ4y;`3`~+hD+wnk|}&bm{q0##?*AgJI)U>Dd*A%iGRgQ9t?e;q8ya zz2%LjefdqMmcp8v)UxE#s3Mi~iGt|3%uvl>`eh`5lls#9Oer_7%7A1iLk{eo^1al$ zSvLZR%aI<)iYlnRNNxL5m&Fv-@)nr>uw=zVDQaJIbBo%!kg{q>HO2&j|>Tb`uxPh0N=2HDSh`Gf^EOLe+7mI6|Ea-HxKc5Z#oiMxxF;b z)2YqM2?KBv4)n((l$UaX0FP<5iH-Mn#PbVyKqc$8}GJbFB=>w)^X^!R)!tROfi zvQ)L;yGS6RD%7OhMC`7>uei7(x5T76euaEoOn%dl-^lUsb^nx#qswDV;i@ZR3(%UC zt6>nHCb*du$e*IiAhY`d5vln1U-$OF_I?7X1?|S4){53GNsNR(CXC<|#6$$GZ2w5(CGMp2azk&qB6y0Z}p z*@Y4bS9Y#27|W9d+%h&I@#WMIZ02otdnl&5vyq+4rYmopJn^|mda%d#g>EmA_Lb}_ zJ*FW&*&8R;PM2u9(tPisFk{V{=^|aquJzR)M(meFn(Wiwoe5_U%huq!$;^@qN}8a@_6EwRd^;jJN=rjF)dM^pprV{QTM9uhq_7+lYE+G?7S$2e9o3(9 zN;}@p#m?1EwCig((C%%!#dgc>*4RbZ8SFCcO6~U9owK`V_t36`<2e^@0PIcXaNe9h zj800pliVflD%Zw+!`d_6(aBM8 z?CB^u_H`WWILvXh<9NsS9OpQ$a@^>+&2fjLuVa{FvSY4emE(TLEpS@xwAIPaDcC8>DalFil;xD~ROD3d zRO8g(bj0bT(LE&sxu?Zffl z#|e0ilwP>^cujGB`i2rx$TIY!RRSW=fEB&OpdmV*An+7!2XTW@^H>^ zd6VOnBeeVkPU2T+n|WC|4RhG3T6~rGd0HIYn_7O6{5go@8QH-Tt`r%vD+NCR3A32t zoEsZ6gyV;>ok5==UD1q(H5?xn8KdR*YOUL>+iq}Xt^BfTWxg#CIYwYmPoMVI@)@XO z0|8lb0S{}ndWdz4BKf2*8-xn@I{9s7Jjl;!_<@6kJ)RJCW{_KXM%SFDVATkWs zWbSw^e^srg+t;lpT2b$He^sTZpKrL(S+ z6YB5lKRb0+j4$*1>hN>bwK6hrkX~JU`MU9%=GyhR@XL~(4197mL_E^lZ&G}S>eTZ3 znPb)TB%KX9XsEb1plaQ;etLd5!e6$-aWAG#yUpGFQL+HDrQ&#t(apA8*vHX(^d3VC zM`B?7CPxrn$L}1DcZ2il2V8GlGcWup2XK5~cu*+pyMxf*(@kaklXph@sKZR*`4I0_ z(7#7pQy5)>E-^vvX9}n*FlA<&MDsEd!waW~U3x}NR+gbB`JBzv857f!Pf|M!6?OpO zd4-)pCNQT$79Luzp>6E)g_~E0NHahQr&l&;AHJB!(r!10|0u#O;K!T4$>L43WvQP@ zcvxKgPaksjAY1>^EYn79=JnX-^o88;x&i#khHnNcG z@UX0B&a51KXu8Ha>LsCjlydr^!Dm*97LSe%Okm}4Z6!i7(dL-P9KTZg!es(?1e8&1 z)}Jdb%FfTnceA^$v&_5T2BWODqpZr#QM>>n94Fwmrydq-4;P#~MI>&)qM*&|MB+XX zJ?uAtoVv+H8X^s_k{CX906Ljd)ep5|dmAge$E^W=HlE|BFIh63M?1*p%Bbi`9AAe4 z-G6Y;jXODh2Nzt$@$3LCFJy2?&#<#OdKU_&!#ShY>i#ANF!4OCJP^A}?&4XvqV3N2 z*p8qH znRtr{@+Ki?Z^2re|klLk=~ag{E*qRzlTASF~oC z3^B0$PR`MvL&F7o;b^Wq4-mLg!7Ed;ld}@DI#yd&yZTp$#CfUtDD1gdlVeOv&ygx~ ziz;i>{HU%+ROCCIhK6zc9o#Y{YV(C)arc;oDv<;}M{9hRrl4U~^2%#?wyZ|iALX)T zbj`-%69|XV^Sjigk-nxzJACfB$bY{0;tY{*K+6cndrKec#6m7){+-cR zE}Bd^@Ym~^ozJB0VPkbsQEKaSI)SogZzWIQ!`Sw%mY=Py$6->Oft=5f_;#dzA?(gV zjqenhM<5*aI++M8143${{u?11m5`dyGlk_}WkCKj{n6R;mV4j-`QnwqxB)2sczN+` zq?QlQ-jg5A!>1Jcby4!OI6Zael{9iX6WQsl(aLo>1}100d|Cr53`4p^c3ej<#Vd~E zVGu6y2Qv?5x8#y3tz_68P$^WZq!Xu7PHALHJfh5hOO8OwbQljKgiD6vz9@NN7aqpw z{KTSSb#Ycve!j>vC1L)#{u+P(*sw6P$|Vs6;V9{o$AP~PUJy}2R%3;foSf7gO4^K}Ij~36?)|Qr5^biK3Uyiz^@pmfd2098TOdf;y#)>wv3t<*>&haCZWnuY# zzG}HZJgKj-{fI$_$vdDA1p!Xq;MRbUn9)V#7e#OUuY z@};nz@F~P6UM;ALUtM%7oumv(;LD zH`~WNmLYHKq>c|D0KzYtd``*_H-_bft75Wq5_xqj$EW0IGBON?42eIg-BpL)2o3~A zu{$rIU&+%p^bz}ps=&V z>FHDAgcEYdBOr9DK(Rc*NDQ|V!xuFAN`9S4HF5N`>r&a!-XL_|2s0bX)R(DSIBHfnhdJ-(d&j_lAF{>>GgxkvB7 uQr82 diff --git a/css/font-awesome/fonts/fontawesome-webfont.eot b/css/font-awesome/fonts/fontawesome-webfont.eot deleted file mode 100644 index 84677bc0c5f37f1fac9d87548c4554b5c91717cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56006 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�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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/font-awesome/fonts/fontawesome-webfont.ttf b/css/font-awesome/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 96a3639cdde5e8ab459c6380e3b9524ee81641dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112160 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 zÄ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 V*eEM;|ho{trTA6=?tf diff --git a/css/font-awesome/fonts/fontawesome-webfont.woff b/css/font-awesome/fonts/fontawesome-webfont.woff deleted file mode 100644 index 628b6a52a87e62c6f22426e17c01f6a303aa194e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65452 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 q%u^)w#YX9ZIvhtu?9Cy6YRi6f6G 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 diff --git a/css/fonts/LiberationSans-Bold-webfont.eot b/css/fonts/LiberationSans-Bold-webfont.eot deleted file mode 100644 index 35fbccd6e4b40f4f2498a130acd969607150d8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32630 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 A!~g&Q diff --git a/css/fonts/LiberationSans-Bold-webfont.svg b/css/fonts/LiberationSans-Bold-webfont.svg deleted file mode 100644 index 47a2314..0000000 --- a/css/fonts/LiberationSans-Bold-webfont.svg +++ /dev/null @@ -1,154 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data 2007 Ascender Corporation All rights reserved -Designer : Steve Matteson -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/fonts/LiberationSans-Bold-webfont.ttf b/css/fonts/LiberationSans-Bold-webfont.ttf deleted file mode 100644 index 24a4eff1b7b0e682e832baa0927d180d1c347e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32428 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 diff --git a/css/fonts/LiberationSans-Regular-webfont.eot b/css/fonts/LiberationSans-Regular-webfont.eot deleted file mode 100644 index ca5f4a4bf0f149d3a16626c9baf1fa7b3baefe47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47622 zcmbTf3w#^Zoi9E!dRms{kt|u3Wmy`JWm%Esi7d;CBFnEhj$<6-I>tE0m=GLe0wIKy zhBTXI(*S9pJknCirdgJDxipu}wllIxX-anulu~ZXhh^EO+tMzyUACo{7M9!X7Kp|F z`#U2g2HM`+zm*)#oOzu&zxV6Ne1_vzf1TraPT=TIC^s7g`ZMy}Jv{XckA79)9(?y^ zZj|=u?{7G6E64rd<>e<1{FrsTuc_yTxofy>+;;9p?n>^X*xtom&xN?n*t?$FgL56+ z7>-`e-Napoz8ld~!%eXB_nbdF!L@R$@!|0Or|%c~(A{tmja)=y@l8`V+5OH@<~^+|Tg6>vmmr<+f+;Y2-L< z31j%>&MR-eLGT)$h8MUw!DTgFz?KI&;j5$E&F`}Nph@&@UWaFg-Zh$DER69aW8Xeu?i6oM+^!xleHK@dZ#wW0pd6`@m7LxZQm_X_u>@UHQ__i%lPdl1)+t+4~C=$xiQ=nX^yUnwZvPM)rq!bd#WS7CbKr%nd|EA>Frww ztlu!WapY9iP4bfxrFILl6ItFaOWK zd*syLfAuS>w(#iU>BqkI_&2`!58REj+pl@~<}coG?JqvIgZtERBIK+0vO!+=7u?A+ zhpxJwc6J_kW!ooj{rpqk`oX{c_$NR7(bu^rp8og$_}R~2`xUqErGMjY`SjsCZ@>GV zV|RV-KJMNVfBl6gzx|!vK+KP`+Y}~r%rJeIJHh<}w}ZQnJIH;S`+M$Q?k?^g?g8#G z?l|{l?r*s~_aOHOr*ijmpX6@mJ_Gi$ojbr?t#U0YS9OuPYIIT^`q&ngle=qFb8IrV zh4mfS68aaFuWGG{t9(o7N2)y*SA~{~#wORxTco&ZXt|~)r1p$XN@~xRxN2;nOC?$Q z_~cLg&u#JJyvb$%uebPRNj1eL)q#&~VF$Ks!Tn4v71L93)!d>r@SnodL!X+S_NyFj zV`?@#xU) zp$)eWTq)lkx?N_ElT~hPQtiQ+ct3iq+OwT@aE*gKDR;I;lKi2ww__S`(MF8zlH%Af zKAcwBB8ScvA1;R`FWT&vRDR3k?RcS$^6hfy_Kmm8SJFu6b*QEBhy(@~z~H18pbggt zUH}7?2jnYvY+d;#bZJ!!UgGv6G;Kq(^6eHiG&RjO}$9UCd`=xI^Wi+Mp4 zXP655G;#vCive5U%ccbQ8A*UnE^pwu*rLhAxs9U|WV17+Cv9ATQfwRUIEoRP-hgy_HGuvVh)Qr5-rJ6IV6UkK4 zV@Mk0$DVrPY2Rm`eb#j790^K1bHeb9PG#My8^bDRE#`Ys!Qb`hllYk0QG2HA#9L=LPt2y)wyM@vwN})8mbX=_s97v;pXvJiTMw~=)vc<%Rjn2^ z4-VQztsGyq;(}0XsfsNaSZk(M^@$5*J}Wk=#RXe+IW|1vLWReU(?r%fS?i{j&hfHy za8(Vv3itGv?o(H~Pk_!@s4txvq<%wBjbJEof6=*;^SAzyKeeZpP%4$Il2cMu(m?-{ z9@!vyB!gT<|I<>HWc}&LIlgM@x=DWL3P7Ed0mh&hf(MHt!t2mA`gV;W&T) zb^Pw@`1=d<^#8iT-Ph?`te>Q}_q{#FG1KeZdhQZ#j_>ExK1JXtMMfx_7-dvvsJM(#S_XG z%4yfA4vPz`hT}N!=Ij%1;L7ra80{{!P-|Qmp)b06j!w_x7_ko7>~Oj=YD*@MyI_m! zDYunZtcnkh%+AGHR=|NjU0x9%o;}|OSn%4+9H=dvQPWPfF~ezPeb`->Q7?8ba(q=| zxY3(YeJ-sokO4tfrK`RA#~EqTKdJU~myiabmX28HfU}-2o=Dwpi11()y>pcu(&m4wp9?PoziPqk|)HcuE#_zCsz<#-*_kL^szUfY` zp38B)FeyI4z0BpOz(usKUT}yVI)|`=eQDi2=;&Y_i#1JC){59-jlMT@Guswc9;z$v;&qxp4)q zclR|#`)J$n{Nai5RKn|adlRYgiNgmbrjluo*Xv%ROivuVqPKseM-<&nv0UofU8(L! z)FJZD%I5I8o_C)oVan%kotSJ-RJ(bPJDJ=veQ@veXa?8w)$TR8-GM85yCY#Yu5pJW z-Mv@rO7%BJBn*9BAMv@t_g*)pOh;kH?%)n_zvc47B!Mq8ajg(aJ%np%u)MUmIHF^l zmxTW(ipcayhD_r+a~l^m5lC^Zjw08J+FtAd(FnDGXoOmdjxdLHgz?vX+pP09tElc? z(yq3>tu`(#G+o^Y?u7ONcj6YUjZIhYX3U6RvCUY}-fMwD-r>uxB4!hG=2s>A3Eh-d zr%OxsWPorZJ;1!qjF!F(-~Ac&6VB6|7|f1ewd;LIm%hN1I?`SI1sv4*51|dQ8ZYf) zhhd=yJ2Ih`evZD4`v6l3$x4{YZjDnI_tN=QM})AKP|so>to6l}TxPSY(otcxn%&+= z?8wwmF1tEb>mNv^hx;dU7Y$sRX^GW-CYVVMCR6Fv?r5;a9S?`+`Uf+?u$+iz(mgj# zjHgq9+LJDq9KLpAB;MQ*@meDTvy)wWvbq1Ras^TYxd`x@x7z~V^|7sqHh$00`o3f; z8VO5Hax9Q&ZsMHP%!jf%!W81fK?CS8k!jy3;v@13Mxv1<<&CWQw~&v6nL}l z(i9sA8#NbXu1nNvfn#NDnh$%nHci%V0&$~HezFKIQD-w=xd{4$Zf~r0!^q@UCWnS1 zaktm&T@@J`nEuM-$cEOK*DZ*~V;?`di4;TLP@WH)1KelIfX5X%l z?zkP^3A~pbV~dr>R(WA;YGs=yVL)P=Dv6pEFNool##Y1%u_(rpgl_l*_>%myPY(=5 zV%6Xa@yO5+hNzFJIO4+O?4G^X?LByyuROf}=AC=@ZN-Rg+HrK>XN<@89liFZ>-WvD zu}MN+C}7SVoD8j=Y1oyDDwI@sB4N!WfKJLYq-mv1P@%(Klh;ztN77Q9x7m)^d277z z>eu()_l3QW8*{f^%SQ`8y!w`n?+o(7d)(mf@fgg(EVpPJG(NzULw`~^*l$UV2O}{- zx#met;%rc5d5$)D18GclMYWw(g|@{qUE&zq@?|zUTt-T-jVW9n8A#_(9-9sUsa5+`ySxx9(^8kFiP@HLZ}Zfp|i zxlTnjpH;aw&7z}<6<=0y(WqNAKtva2#A3vZh-^jxr<4qhr39A8Vt(J2r;LK#>U38Y z-pLO3^}cj6l93fzj=S}_nBrd$Mupwrwhc5FG!gW_gyxF|GgoHBw3lAYGsXXof8oIg zX&&LnUy{bm+~k6x^Ru# z^wW2O^c;a3eeZRnY`TvNa9M7E%X>+JgrOWWEv21ax|5By9@AVeYAu*t5yQ^myQSXg z%2#_yS>UwxFxa=qF}?8*DFqIGr9dZ6%Lu5X5)fCV&uBQjuKV(d>*p?=?&)s~N1{Fb zUwvV6OYcBK__W8{7~OTz;I3%1$BXUAn$+-6E)xk?dxR&xf5(x@F&gvhmVIdIzV4GZm&Mi z4DGFC!2w<-BWJDvq-h??$#N#F%UhUnXCaC(SO_x>gy(i$N;dX?x1WK*)M``>ttK+E zjgXWE*xI(Y4IKLTJiKTSjyhD5DamO{g^4&$@NE%*Tlq*+5$cvm@epJksSFL~zD1KpR8 zjt;HQ#G@{ES2D3DmXd;XKJ#N%Sx)zDoS2)xWbFE2(C2NHdlKvR_a~G@+$+3%aNor6 z1hAwpJv^{E+nUHYMTg7pPsBQ%!|Mi=v@hWEZ5!Nh#fF}2kJ6o3JC}~fy3#33JLY`^ zwBf_NUkVRkev~K!=45^~&3mKiwMB3B=xQK`mq0Mdhy?OaUC;8z4&f)=*HeYe*g83t$l;5TC2T*Kr%7Vzo|cw zj>dwL!)Of#C(^0DZNo#Uls~|S8rqYC7lA)1!2L9%&j9xdGzUN-FA!;R@(`OTD6&omK5^i&kC1HMHg7sm8=x&7g-eD{Yp69#pRc~Gjb zq?Oy=cBt;91y8vfgy3au4QqX@tz~T;wRyA`2t=*Tkon{T_%f;|!+ni+d%U%EHNKKX z&i9lF^WC2|oIW>vSK$f1`!3-%w`6l#T@}l(+pXqGv!g;}_&f%D4qz^O zxm&sX+7doD5I%$DFRrRt+W>rC1stzgMUzz{k-&u`#d%h11JhrpPg?g+&)FD(`<21| z`Ps?w&h9`k7+BXgHM4*2ve8^x4)R$~$|r^V9+%hK9M5!b>TgeOc6-YlW=EB~O8DLJ zLZ4jcmx9^u;n8h7wv4aqlVrZur^LF`z|Hw0e`rHY@>(t*qZ!SXWG6WDV*SP#S@!iN zE=yAXBaBHTF_V69hondosx@MF4BzXLFpHe^?ijd%+UO+hMcbIA*=qD-wlp`SttL8G z3fPj(?6okngs{X*b`a4zqkIRf6Tz$%a zaAdGMJ%#y9EbiWVBAxCE1T*PV(4(ijvccff9&bZ5k?PB>Nkqaf{K@jJb*a|09Iy5X z4?cG6?klEJ3Sa4vrF42UI5j2*KRdhg==4l3yY}S#uJOt4+>p|`W#aH5`&iF_lBx|< zyIbR#-2H2Fk!ai@1|v#4@n1-2$h|{c6}IyB66I@E#Bkk;YCo%$gSnR530KRZl;-W_ zv}q@q=h1Ps<6r*moKD~dV5(`!q*d8L;m#!}(yHDQ#_(S~Y=Z`*eHw1=(n*=`iAuoEk zD-a3#D=weGm=`xP=;v#QY3*g(i}RD28sNoz5idT$C`^D`QQJynHUszKR#ELG@xcL8 zpn~?|YpbY@0#Op!ynzmdaPC2L+_2T@I$c)N9Njo+WujzqBZ-m(M992z!P*=xBb3_f z$~!|_b-F8=Rpg+fPpX~C-w#q5Nsaf3krLT4YZ*s?OWGtGh)3;}=t%nX!raT~lM3WH8`#$U#NPW;@by#O)3EbJ@$L_wS$Dn$GzH zXPl03Fqa;i=*Z@r4!bDHncU{#Oj-^*oI$(YA4sN$$JQk4d^T&16i6k81`?@^)4?AZ z&ShI-=r)Q0DH>0v*N*H@CH;YbKN%nF-;iFTBp~eUMr$C@9PjKNoEROI)hKv;}pIs5Jwuc7T_(g*But_%mv=bD^rv zI>;crIs^#&>%bO9dx%A>X?`DI36KW2Kv-O20Fkr~FI~|pqPS(HPLAUj0H)(b37}hp z!CZFB_>I5WyN}=4(|g6XJtOPWok~;&r^sb4AL!1-B7Uy{Od*z1(j7CSLm9YkzvgmD zaw^l4R^sGHsB(p6FlwD=xDAhAw`H;`D@$Kh3lBeDcy;EARz)NLr^ft~@t7>F&+VSQ zCm~0@figQUOWo-!F5WYk>yE~KeqI#AfoyVkw7)Nv2odv$<@&*oneAoFfD$cS>VoxE zPZp#A>O%|++aCx~nOTUc7#?CVC}xK}{q*zC8+JVZJd1geU5fjPoSWNn!7^p{J#U%j zUGxZN@ev-fQZ>#Al7_{g*{ZPdAxpIy(ESsZssRIepS60^Q@XwS{E3piYP^9)NW5~E zI}ZE(5zY*2fk%vu+!dts*L>?+%evCfi=^Nf?Jz}_&irEIxBgr2=0w$uZiAH$5sTzb zbG$%teiGmK<3F&^bQY$oc*=Ostl{6!J#3f~vd{5fI$rop;n-i%cm!^ipEM2{UT3hV zEm_gzCt|jgRVl^eQj&+qf4WVb;otemd+!yvd++_fywlf8gV*1QgL!4fJ9U;`6}A>H zSn;|J%~Xwf4ngB9NuRfvM2&t&cL_-HC=mJ%<6GZ zW-6zMhP#-6&wz$AqP7+Q2)1cC?A5oaIZ=xP+?7BEIOYj55#hOYItUs?HL|4DINnx0 zOAFo_4{WhUaiOU(LVnf8$OR=ckAoEQdDP>rX@oOUhtK==2s&DBEm(#X3PcJD#6l%k zp8?kZ$aLZ-ZR!tLSst0ZsOgUGVu)s?vmOyV&$wL*XR?<~9JuL{sr^BzN|gL9{?uq# zmPPkhjZSeuPWdT*=I5DUn;z6*#$qyo!ldQJ+uILKo+;@ z-tKN9xQE!bdYiI%lfLCwR3*8%nR&d`&%iABI|9n$PTfnjQ`FLMY~N+(5^!_h1&tMZ z7wg9^7PZT;SEW0>Pw7zV`s7>dbtoMd)s0KqrpmX~p(XXWxG;EpBLKBYT)1e{5H`?r zf_n03FF;Hk%;a&LfOeYFUN#*+p+gO1_5OVZxQ4r&u0?xu_qK;fWMAymHaq|+ewi!3 z`M@W@;W^EJ6Bs{jYY%O9y1v%PHK#X3b{^BgTN3NK!o1Snvoz?EzP+Oz-Z0&qC^7$% zleHxMy~%VEVP3NbDq~4qT;cnMP@(JTDEky;yzXWvxl)uVVVqEsC%VP2d(WBZ`BE^D z%Z*LW@7Z_j9Z%nPY$>jQ#b?)!kItsXd~S!G7X-6!eLUF#k>1_c1o_(#?#o^^_0i;7 zAWyB&ZHav0Mt7Oj?UTDxNocHIJ{sRN_NxaD-n?gOa%fG zYZCnq}hT}r6 z4%$V2ZEoBAU7tR+cc7oI52VsveH#Kw%9$Do1*M6BflH=z-ioX^(-`z(3+Lq?E_#Fv zmL&Xx&@tg3Tr^ub*v6Wfcv6j``E*pycKzZzgvu%hRoEk%$Wdq!!F0ea@nsPg%ogyT z1uL~@vfp^kgtN;Rs#&L(+C177xLuv$kRRbC8Sym^W~x=+VF=EogeF+Qh+O3Sf$I@r ze*!nIc`eLTM9NMSW`zX*!dSG| zYqpmOfne>>7$nL`@Z#6-{vj?2UHj_d3`o$dc(P@CpjoviIUX~>9GJa~E0ZI?ojLMX zfe+VUuSQg@q(^sRyAuKvtQiqhty997$@*%CMTQNv#|d7FS8z(;o5FdQijMx(mZD2V z4om0NU0r*MNGWvb3UZSyofNnoS5F=8gN`dD<3nQueXA7cj?J-w;i=iH3WpKf$@NE+ zYQ!;HV*S~P!WZ~H7^x$bjuW3P{DbL`+jZ%|sq~s;EGh*=YkdIJk?Y^NaU`B_dym^4 zen~-0r!^i7hz|a9qN6Vo&FtO=gn=D}nBhLit}Ny&-%eWSc@M9LP(=6e2JrrH>vEb0 zuG~dCSJ4uGKU<*)twrY}O_8GKuEYk4?%cFj=Pe~eVZJp!IlceTLqGl8@qw>->l@m$ zo!!&>r)IkP>VlHAE_dbR{)vN`bSxY>A@AKVI=yYrBZm%OG8v5t&tPL_o08zSOg)lK zMOzz)*do!Pk=gl!hqup-4#lIgF?Mfx5 zXAT^?tDy3od#1Lo8;C@rk&&Uf`F({qOoztCCklnduN*zHWjd}LZwL?Kz+HD-GrO)k z6hu-b!H960;ymTtP;tcMYh?Ir1U{Rr44;|ugvbkm2W1#M#aviOrmVb-oLjJg_4rFM z=%NQ)DCi=2P8#Fqjv3m|ea~>e>ClNn=kbE)MDe-D@Z2&`5{oljc&63Fo@u2Cv;Bc* zUU*tLi-cTw+DXG}=e}>KI`?ZlY5BJgEI+Nk;~entLEvE@c}uc{hmn#sgnXREL|c}u zp#(i|9eZ97?}$*e0;+6>rLVM;d9Ng3-uI(RLCS*W%tAo6>+X_71O(fj(R^*tdN|P; z{4o9!(O$q|5@i=Km>K&W=@iJ;sSCN1@iZ5YUAA@q;jbK++d4FuNC!`QBNF1bgO?os zdUvi%lDl);XAVvF^=ERCxW6zhjJNjoeSX`HEAqD9vv@dWRMpCdc4 zz9Z2ZZXi8pWO(SGfX+LHhvKnHN43`i*pjp!~15Odd<_J_PMD7G)FJ_Y!0vAW%hccIu1l8!PXj>7OC^tstEd-{M zKU+R2eEHYQ&wU-R$_Y;`pE&n(;p835KQGd+g7KTUmLlH(CNSjSRWqAwj682(T*6?& z1Y3%NYLw8(Uqx;w4r>Ft6 zyudE9b@1}vl3tr-8b%W|j8?p*6K-K)=}h*G*FMeqJ?M8YX^mEL7cZUpR_kls=r2dC za={>&p+&cf3z60)C?PRw^XR;wZ{*QOF{lW1X@l9_7>N~C=~lj{9GQu34<(Rh+s3Ae-TwfSsfQ0W>9=fYFxV0JRu z!06vYUZe`ZMdgYxu>mI43??2OCeY=O#;X}D@HdbH$*TkA*_VIv5(7X50N_|MYKAHX z83U&o9OMKQD)2?q1s^EQ3|=|alp;>S!g19e=gFT4?@&q3sb4NvngyWAyMx;tU80mT zoOtJ;QQhj#i5<3clVtnD?`8S{_`^eNcGjp(D3WlMd3Jp1k6g zLnps<^wz6pQmN~=&VBOE`wws5wPAQ77Qgqp9iKQnyL0_;1b@TBbMr(?!g(Fl%>^Ov zR!G($Bwdw<@oeVEM!Gtt!VUJ~X;a<0He$nUAXk{vf-v_HSt=@@j02w6HzglW8Yekl zp@#@#2d1}DfP=3`v|`K5-oiHi@FPPb<6{pMZZ#bWN~z57=*;x!SUM}o%P$F!4-OqY zJU9UD1Mn&wVDRdIm*Y}!LE?Rz5LAmO8b-^jm#`rs(^XB2+WI22Ch)yJ4M7`Gyj^6i zicYOTCcp(r49gjHlXFqz8WcJR{#`OoNsGj%7@wfTEcQV%PqP61Z&jM{Ewr=>j zqu!c2DJml;YO^CAQIzq%OgbS;froC~J31VT{#gJ&zW3JgnLV!lXschcA&tg#o6T(Y zdE4TH-Iv?anJcG{-1gc3J06%w9#(Np+{d{*ioqaZD#25kY6q%Vbb3TGRiL2qm~lde zD$KOIO|25O04A9fJ&^=WB@;U28zx@+zrOh6uQHMrMT9dPYNZIm=2QnHi35QR-TrDK z{3$EqPjTKI0uXZh zWJU{F)1g!?RxD@j< z^yZ`stRnP6n2cAqDQd%6Z5`fkov2mfRVRS=SLv_!pP47VL9gc^GtIN4ZFIk_Zd$_5 zLN#-cZG_)t<0gm*v@1je4(blF>Y9xgZ30WfAOEOl#U2w0>l!dGNKdGAYGp|%kP|Mo z4VasSzVRr>H?$=ubfire(USrlf*$5jm_#U|XUTU`Voc|C%M$Y`X_rMTKOdQcaEXK> zP1D~%7IAxQbZBhX*qh8JV6Y9>;SiLoqG_w=HC4nE_uNsVN?Bfa49NCh&oy_M()(MIkz~ ziBvr#Pyrd3CQ=3OFC~S=jYkTBe>A>&;>5dt=@K zP7z*8M&WviN(IK~Wcg@JH+ph~_oYlE=Zip5^D?C2mcM=GsZ0L%10_|+C?FkY!Ngh% zwR!YhKyuZTQ7st`l_-`nqmJRHIoc8Rz4K}$CaI|5bPMEvv3{4o)$Fu7?2Zb5ZID0w z-Q}fkLpPDU@#?q?b9Hpu@N!9y$2(adH@HsW7?H~xzk>euB~2y`uzKlC?&@Fv7xin^vQ?Eu zhZ+~Pmvaz8gA49tJX5TnNiC+^3nf5I*#*Rd4(y zJK8QTtZr9uw2j&`xgWi87wgZ83mw@M`q!{_Ewy>P;|f6AGDz!G?HMG8s19%|2-%G4 z%)q0jx-)rPLF(|DjM|aOd#h32cD_2qm!W(V1P$vlY9OQ5Bheb^Mj2Jgs12Ds20|CE z&g3!d6;~l8DT;a$*-~b&bh*90x?ltHgQKz4ZK&d0vleA04$+D1x%!aA(C$w+d{47} zBX|YR-wH*c`pvR`=H1w{m{5Z*k*tE6!+Tl00xBPAeQ9*E94GYG^FiqHT|8;@paIzc zZmm!%joD(5tC z!$Iiy2OYy>;_lr8^@+&2LnXdxih;Jux#gl}Xe}!**;&X-Ff-bM-H9|`u+_nk%19Eh8xn|;Fb$Y9WC_zep{R?gP`Cg1pJ<+pm=@Iv9g2k$ z&!pyl{B`PPF+>AJO_?!oT0$ze$x1Jx3MEUuie7*x@%18qihtzA<(D6ajlNZQ@Z2-Y zj|qdioa}>~d-wLE&aapJ@s?>$5A&S_Uh53y* zM9WYSN_8TrZfDVOY!{>9G_vI z5HP3rfV+dw7GR8Uy> zf%&FGzdwp+*@Q0{P6JkE@=+G!DJ$dYnYN#AWTWQ+A#O=CA!-Z%&bPn)^DWd3cL(|n z%)z6XD4Ec>#4WP2d4k&?4W^TLF5_+d?(gz9JXH8@;d$Xp!pqB&uy2`M+8qDhPYd(L zqXmkm2arOn6lb9L#WK_NEOIKX3>r_qJ6U-B7Mi;qMpbZ`evS!i=2VkH<*N>YI`a(? zcfnLKpO7Y)m`)7#igHblyyN*F&X}I5EBp+lZLkq1pv&(ujvz<;GStE6*AW&cKyr&0 zu_Puf+KQy5i^N5R1zz(Zip^rN2~gXj^^$cVWIMr~%-}T5)V2)(%?451Oa@LC&WbQ} zh|96FfwEm7yEZ%XzRq=sd8%QTx)!?mB^SZg40G8|Xy%#=aizSk7Ab`*Ov`S*l!(Nl z6Np4aP^{QNy1B=x2Q!f!_dY9ACYhl75XsUkg*($Ji=L}A5sj?NUe-VVR;B0(%Z(mmLqpsji-oKGHh6}-QN*(MZ+vik{EX5%HMYLH zC5mdVr?Y*ziGZJv?-=NhhDE#4*f|(W)FO3>w-{?&0|{5}JZ03*Og&mq#+ss7`($^S z!RW9DV2@>@sfZK^O-vpePbNZ$Id-PgmziufxHAYp1nw~469A30Abzl?C{^kKq{Vif zRBRxXd<{XRznFD)5v9wL?)GT8SS2^LGHv&ke8TUoKI-OcgJsJ1y zfRAQ|gGTLlJ}SB!mQEVA~F91lg?<3@bg>_PaJat*4HDnLPD8GZDrgTFWk8Il94qC779FX_qc{qnZE9JMS}m_AyOLg zk+rFC*yRyCRSu;c|!M=Ge9A?3(F;zDz18*}oyC zvR7|vr%eZ6X_taKMz;3!I=*HLNQq4U@YYXknNFpBej&JX^W@s@Xe?1-M-qIjv%AMW zqofeAMmp@&^w`vJHr)s=TI|+s= zc?aQ+K)BOWq~SqE!>d5Ut3+)LFvTK)hT+6hQHENJuUbXhi0(D3K(uB-j$mduEl~^H zsR{yjdQfj{X^_qOgoy~OR(q4F_NJV`u&3G$|4_9DRbK5)=;Vn^~+^9*BtuDn}>B=Z{=InN9kA z=iYU?!jV*N(@h)tYabN*X2v#M`{sdzPY4?vLjy+>aU~Y_*9+leyXO1*>I1Rp*x>c^ ze^EWtv!NZe61);e-1VwnzmLEB7=P2rF$AZ>k=y`iCIBXsHGP+pP(PLr;qCL~qy$tZ zDP1>@k zwA-uPx$sqo&kY$)Guc*{FuZ9T2KH~q!cX~Lg5AYB+r;uqD1+7E=*COr88Byx;G1LM zL#c;$HIRLfMAs_dc`wW>Z566skikQS*9@FWm4Wii8lXEWVl*cbx-WP{8Sb;hoc3-$ z$vCImj5q_l6)gUU;6oZfF3BdH8pxQzQ3_0?bw@|(I7o(^r{}@%cDE}d!#|xI17#Qm z(ClLFCPXa+7$BseCGnjgF;(FJ2trO3c`8~I9eEq| zWYlUW{3k5VQIb^dN}hxjea`c2pw!9~I7Et_cRp$`^1RU>kz(O=qGxs>7YifX;!&&3 z>u-(>XDJ=N+4NlDK%YHowfk)5a$6!E@wqGQ0beRU+;{1+B79{?Ng?G(q*!q5V?)cN zMnird#f#_g&Xl{lx+uR7 z=ZN#eScBRi+md6D58PFe+nQ|G)q+Ck9!#r}ZRz!6R3LyCEw~b`7EcL!~5$2_Q zLEvH18y8IUmB-Enj}W&YY|-<8dEnp{-SFhK5vo_RXSB{7h|E_*YT^2eA?T6(R!%IA zb841x#^RC`=%IgL(nb1WuJZTokOV6dTal>~qJ5~xgC3{|>|f-_BcMaU81M!frBuBC z!1^I*K-Iyhl!>n!?dp~x>G^!Qt=cz~$;RT61bWNcY+m2SwW&ljjNM0}O&T+0Wnfx1 zYqKqp4uk`~N(Y}vUPGH+6b^X3Ez01~Hb%1<(5%nnjz#-2lgoF4h*^i%wL03JMu%a1 zz@D(#!>EAPVQcse(;pw>@(I9J4d{^7cvlgwi;NDi7r>Y;fpN7CMox>Mv{SQ}gEJE3I{qZ&Rsd^-PWy*o25>xT zw^L?Y7ja3s+WkQQ#G)UX_0eQ|gADTsoHE*-9e@8cgHp&Q4Pc%<(7BK`4?nHcIl-YTO3HHuw z!8zceXrOoQ)8Co#jw&#X#W9^@AYqj_M&hgn4qa%{_`R%8=7yS`Nq0E5Iaat0cE?B ziv#*>`!U(tz=B66SudEA_%CRE<2 z$TZ~!r&j4@Q!cvBDpU@%>ftfQ4ibukU1RWG5Qc=|hisf-*A z25K>rMia7Cc$!nBGsomidoNi@_FP-4H`~$P9D{A__97uWamO~KlU52o-p|+C9Uh+? zOhVs_SiLn~VM2NE-4y>=hfTJ^^Bs?cYoX_mt+e&>u{jj!xLj?i(W!&`hR2i`mSjqF zB*sa-)A^%t1azC=F6Q!NXfm;;Z?<7?#|*Ruqgm9NJ6C&b_vu$48tf+O2GKn5(@qlm}#ljaGS#5$gu8Z&Ay!s^bHtB^-xP?{OOJiL^;|EqCAgNDCpzKs8tj|;(FlQsqRQ;u!1K!CfOfq zlt0|b0_Lmhm~&9IJ2g{?_+=d4LWIie8pG>=w5t={JXis-9AxT0RCkk0%3BpJW&7rDS^Z#O$`gf$mhSu@D@O0Xj~1-;5Njb~_u4 zm3DJ=gPd&Nbl*iIJ^i3Syu%>{ z(x^xWjDzpJi8W(loDa(f=c@r@t)gV-A}Le%Ppg);_br)HtEe>>5_fCJ!exu4)UYb` z8Y)dM6Uiq_Ycm=Y#y|{|ye446DV@W(k30c1|vbkakXZ^>_|J2q3!;H}Ah&puo0 z>k%cl9Er!$KZF7N)?0^{Cs0OU6s)(}&F23SUcfut3Os!sb!{2cjO8V~gPKU@lZ3D3 zI=(Wq-3>*2E#qs&P88E&i8CRMFTI95H(9f*4a$8wh8R>ixTOzSO z=yf6Mc534W22-qmYj_9qQN?{quh!K0l86a#E2WC!r+)OS1~MmD6@^)k<5QHzENWF% zZ=ZSc>%YF8v}y{j87ZX^aeUINv3-FU5y6LQT`aNVALRsNRjJ&Lg~l|l3X@4i2YOUf z@Un2GK*3D&6Th}uY;LF7Y(t8nyXwE5DD3#YF|*t!yMqHck2@qvVozFFdiNQ6r}qlT zO?VFPln|gHkuIt=tS;FZ$dG11GcelVSyoOA{z}T`las&s{`q%AnkwZg*eDVuY6%;H z^8fk9f3U+MVjb2cElS5$FP(YfdvEH|tAb=0axQGe(2;g}Q0j{PTF;!vL#TEfyK zP-~{PbjNa-Xba_55&d@7Rt$^X zwQ5vckfRMaIn3H7)<#&{OzoL2=}k)8Ee9`NShYHeGh?i6VQrkX3bg>F<$Zv}+NF66 zc}3rfczqt%5Z8@o)EKSV2=`DPqh4_`n6aC2*JH(IA7c9K7ON9~&Q0`t z76Z2i#M)T|o?`59bOTH4O8vjWM4bl3W{u zk~Jy3{O&Wt8EfZ=y-S?5ud&Dd%R`KYy`bUOfbZqpyG1WbDYg#T`~KKETcMT$>tsn6 zqw1O&o1kh|7(|(OWqM&y(Z$ey@k=4X{4?MEA1@`?M*Gb#UB(dS4@cHl9{vN7_2T`? zk*xoRBI_#;|NoAxd-+3!W6xkM5&N@+WBje(Dg31Hk`NOdh0FQBUH26^dT^u$>E30peUZ%-k7aCmX#aa)w8rNc7XrV25E{Zu)L_LO#YRu?~QhD591;HVY21zs^J1o-D1CM!`-62+a zYGN%Yd450P@I5Y6LKjZ}rTu|Z=z=0m5Dgeewo&ehUP(*IC-6`UGO90AP>z^>)Xf{8 zc-3fkI;=h;{)7szfpW5JFaBd;Yfy>K>>r6YMtv@8tz~3=e^LY`JYo;WGcA9B0+th|9~t=uN8r=zCY=asQf#qB zw@fL3M5Xbt%oll1aUcSMHKSQHxJOabXR-3%VskNpy)ECICe5h1RgVOun`tjik$_$} zCIN7$6_K>AR+xF%kMDwqZ^!6V*lADZ$oeqB>6pqNTNVVVL;KR|W+>t&dAqU)uJo@XJW&Xv3Mq6c_KOXJn zuf2O{_|Tff^@T4e@u(Dbd98xA#v25$Z7&?(nM@yYd$GDfVu+vbi^lzRm27Qmo;zI_ z;isA3w}E3m?xOpU)IgLd7r#nt%|Tf@{cvH#a`5+u0PoU#chY=!(tH>5BK$Pph(6JL zM^|bF{zh8huZQ!YxYw;ldBnscZSURG==E6yYisXVlHb0wEzKVq z9=W6NxxQwaQk(Ih(aylpSGa#Dk-^#=ZsKdxLew~Fh`B+)lhTopE8^8XY?=U`cGg(qP94pg<*B7W<8Ss!OB+*w8T3sU>GIWRVlff z!GVSHq4DU;UL!Jh1dE?!2Zl!XkEgS-Xuxm(x|q&hJ&0v)!ZvuXPz2n*X{N8Y^0dwC zZi|0>V*l>p5iCU`Ja&9`zGom1G@UqMtMSL8nN*KsCXuT3C3F2F*Uk(Nc4vaYj`nNq z{i$R!vDS9-q^(uCXykEShG!608AZ(cDHF8FlmkbFil!8SuM0abPw|xr{FWz z>QJ?(Rk?LWoFooRpYt9pnmGDk>1GeI$)u9GkIVu6%=0S<$P!_Dj?a9f#*1}ohvtVf zxwcqTcAc_%-M(O5SlV+v|M|i-Hb<2h@yGa|MuQEo-W}x++5FyQG?(pJ9+-&7gx!bu zn(3hdtS9HMtgQ1XkzB@K?-$)=wmk<5uN*qiAIn5#MXI)zRl8+>x@s(wP>@uAJU%vh z^F4&;ySbmj)3b+bYfcw!yPU1hLc?N5tri767OR4z zfjT-`7hp%v#C!kwA1^4LaQvM4=YK5rSg4Xe0J8_yRGGC7hgO~}a^xk#0wYz8U|bij z!pVL*nNqFm>GCu2C+J-z?4``645S9{?*N?)5+ zkhtZ=nogx1ECDezm)?Kx{`BnC+rx3UYt@z4Y|X974fU_ft(m=MJMJ90hJP-V&NLvW zfUkB%rM2lDYciB!;Kfd64WmV}y^VXp$Evw!_2>kvk3hmI<*F`<2r+>a%do{HHCWhU zRW<8_2dPT$vw%Fkit0G4y4th~kSA6qt#A-cR-ojYe*40~mi%;JZCt7us$hApnh{P@ z)Mk>N{%qpkScW~*(*=>O`hXB1>~O8R`t36v&+CUTB)giZa@B;KQ>cYJ7=~b~W^eEcp5brg_dZ*g;=2on_=AN*c`RsfK)`k%@?rN0N0$2!96wli zfmaS5KR~o~LGQ63XC_afZYDeo^xGjMD`B zgRpyj{*jMtK5+2UcU?SMA|m?c|M(%IDDAdEcxlU;+dKQWQfOh)sb;~s`{Ctd z#cOtaclhpPDk6(tEJNLt9F4^f^z`vHfk-;)9(IOj`#vVg4$()YPZ87uq9Q!t%caIA z=0>Lmdop8-K6hO1O!TIw8^WTy7MV}k*ib4F4hO}`*cCo4Lj1j8=B-R#0Tr|yfB zsbM9W2!`wYc2~eF2U@}%1G$tE^}@qU34X%8tquM$U{BI7mhz)f>cBA}Q!LwCY*> z;h#TbeCjd$5$`gPf7|pl^oSU8*6-l3UTBE?!fpC53fZAf(7J~Bb)m&u_Jr)PFK%IZ zzl)d5vAs*!9<1votsa@B5cL zTv513Ib}?PmK`DTp;d<5<3SYHWJ@@xMHB#at@Q`+bVi+r4>mVs?6J z`^4nXhQ5U2tKFJNoch_}@$tb;8`kE+@hTD*t>N6-4I>-I#}EJP)V8;~K0K zW2t}l9xQ0;4>W|8{<)x3hZXUpZ39Rw4*1=6_Z}}E8_DGQw;_8g;j0mzn#QW8BLn>{ zNw05hc4qD`Z@F)J`{ejoZ};k?7a==uGS=TcK0dj9`j#7apW22eH?Ph0jSP;T+&nna zms{IRF$V5<~#`$hap0D>vIF6!&etd1recCR~#-xyGU;6dc5 z1~b`<5sn5P`h`2NKK=cu^WK7r3^k#sx#Z$127Yy8n>xmLFYrWlDT{&PZ%`p74XjwN zRv}eEZOy1-&PTbX_?pam zAcp1wKSN1c_5bf)mpz=7Xc=m?eL+`hGphRA+fBlfiR(<&cB- zBLERkrF-%=t5*z$Yx~Bm_nBK8BkhTc@DmTsQMbFYvcciB+t)f2ZWr}PDm z#m`~U@su3(OLp;S#v8*_8|M0zcmSbnV`sF%UoBd!xgnb}h6FniYo`W-@z{pK_j1*6 z6U`gT%I)D=uQVddP-O%785^vpCc3aPZ6wqOFOs#~!G5EG)~UPGC>c(nCeaCNm° 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 diff --git a/css/fonts/LiberationSans-Regular-webfont.svg b/css/fonts/LiberationSans-Regular-webfont.svg deleted file mode 100644 index 193d756..0000000 --- a/css/fonts/LiberationSans-Regular-webfont.svg +++ /dev/null @@ -1,262 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Digitized data 2007 Ascender Corporation All rights reserved -Designer : Steve Matteson -Foundry : Ascender Corporation -Foundry URL : httpwwwascendercorpcom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/fonts/LiberationSans-Regular-webfont.ttf b/css/fonts/LiberationSans-Regular-webfont.ttf deleted file mode 100644 index 0d28f4a169abdb0bbf19f89ba06ba6c472147873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47408 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

h^`h{AVe`F>qB77{>5O- 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 diff --git a/css/fonts/LiberationSans-Regular-webfont.woff b/css/fonts/LiberationSans-Regular-webfont.woff deleted file mode 100644 index 9fff1a7ecb0c09649af3321bd788b1f0b207a20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29356 zcmY&;V{|4>wDl9)w(W_XiH(UhvF#_e&54~%Y}>YNTNC5vz4!a`)mnR1pIv+Rsp{?@ z)qUDcL0lXF0{Cu@6#(S_`c~%ui~l?R|C_kDiW~p{V*SnHeFI<19vCMfDklETg?-0_ z-yjAd27oIlGyVAHO1@*AZ|FZ^gn$^?7}x^dxBE z=v!x_@|}0@8z+XtapX1z!0)_vT>sBY42lIdX=`9(^37>{Yrd}<$PFEuIETHRlQRHd z|GidFr0?^wi>Swu+B=$jdmXL6y+Z%t_jtQIaLq_xU*8xIu>Zxe0X0j-K&Tfu*9_3N zg`NWZH)gD_zXN6n1Bt9}s1M$!AT$Ab^t}$m8W0M=|Bjoo7-shLjP>;KL@uWK`zzrJ zv+5a38lmp#o9vky8GwSMK)}nMgJIM9unPI-8P%``f(7>3VJ?k-1z<<7+Td_fFf&hd z`)2w34< zi12|mPrX%88H5#HH9J4o!OGtxuCu!T2`YC5$UIGbQ1 z^QT&;({gg{-#Lf%Mu*FI6T$k^#a4T49yJB~z0Y7@z{RnNCOknsb_5Rg+<0%*c&UL# zZ8-}!(!f-ucih4P&&N&tIp@_zr@IwZe{X?8HowRF9fru^r6)WC|754`2O8z0T-Fe? z$<)SbXiOHhu|C&thy`dsZCG06_e1ol1^|F_L-<3C12O?!082m$z!wk&s01VdVgPY~ zY(NVj9q<=W0H_1x0?Gh2fK)&LAOes8umhL?ya8swHC?54dF`Lbn+Ql?{sSw-+-vCd zX>p*}!5osrRg8Tju14I#YtcFfhB`e^io{BRk5-W8)XIf&fpKu;0{#kNNonli`E0zr z^-fc1tTJQqWo{Oo$E8k~lDoEnrWrm|g==DdP;>vH#l_cp$rw0TJr3KvyJLGz*$(A# zh1{pL$3(>E<#RDFTYY~B2JQ-cjq^bTrkJK@YnhSo2laTd+FIPO7ihYD{M4)E(LsO= zL7!LI_&2OF_LXv^V}sMg!J6)7PeLk~3TbXx87(xQ!&B%X5Mv1A_+njwKv`TNI4Wvy z@I!Y|g@Lup)jsEfo@b>{+Gz&_u|_pJAauU~CisCN{D+K4P~ZwJi|_z>sIWY@Tb&?{ zqCi3ri(SIpREt5Szrz7LbIIg9e%FMl^15~?vk!{I%_h@O0-``&9*20)N{j}qK4^TL zl4@7pkP}lRNbABUD>8+?`|G716=)?d2MUvkO_osp##zl*)h zQe_k+705z~JQpW7&z9lQ>2ErZzS59Xx2nTUk;yH-71g7dH5o$(kSt>U_P`{>hcj&6=Ke&o}Kp_4UGKMxEX!s=*G2AO=+ev6QN`LD-#w+665BsEvAotfZ&yVK*lj3H8j!309`6x^l5xnyF>Px* zT(!Ge{dz@2_gUM5K6~Z%I&(7ZgAjK}ckd9n?Nk+Zc6}v=x%p|qH{laHrcUFm?z7?% z{$YBixkFFaUxoaT1&mr1NpMwWGHDEKZlho;On+=^k(*cvx$PP|HEjtt0KH!;^Bdmg zcfva$=U%l$y7Z6xZ(P(7X^n(=eMx>*1+eThO~S<3zf>2Y=^$dNLn_7Aq{C-4>}<%B zrExHedX`{XwoI3Jb(0nKYBY83gqtU?lHg)sITwfvevd{E|absJvZ&ZrMO+xMDW=yL0NFcNeEw6ms1q3H?=-`sL z_To79h{x&LL(u7y^)RYHZrFp$NHfuJ>+CrJ9TC0C)4kxTa2WOeHhE=13z+3qc@_Je zGi)w444S%e>0(?-FO5S4c)65N>fn{4X$c+;pH%gVE~|7Gh6{PVS3{CVVk0vo5Pkg> z>pppYnNdB+X>r28#M|clT>fHMW4VJ=2DESoQscGP3JHlGar+Y*C)!7GUFunqEhSqnoX zn9D)DJF4bfGXAu*IhE%@AZYX&h$-)M2}7!ScXY*jL6F47e{edq+TlSGzO=Y+u5_0B zl!}dwrAjz8um$Q%&KD$5Z+x6A%&vY`A*x2H_y(R&;6EZjcxcZtNLTLM=Y{2-?i)$O zbh#eXZzF+=Nrjue%|&3BiaB+j7SgLag(0zzOIbh@M4wGMb`HE=oDgI%q1z_3*Eb_R zIY*P9cwW^ybSDTISU9T&+MvpKNNQ&}Cv zVBuXLX;#*`ES2Hz*}ScrjJHO7Kk0D0E~A@YHHOiwxrkr6b58C1=xX`AGb6fXxLYCA z>-s;;Rv!E#ZM2NK%~k6*)ha~(6IUoM7Ct31#~Xxaf#r4d>%sMuKe4gVmQvaK&xIU3 zuJ0==LFtG$e9cm6_!;f3f9*W|Oj;?q%QtKF&Lal->F?CoC7PYPzkU$PD(!C7-ZmM> ziGawfy2(uuWaBUGzEO|Z1dJ1W8|g3)cX)N!mKL4veJZP2DEkWRP6s_~cLJL$(*Kb+ zCa%d$Dt8yd1_HsmW~Cbg%w3E$Wdg@!>LW#p8*YK-?_N@=pK;LhC8ZnUt9)?64xu!p zZZ$9cHB_md0W?|>G|a!J_@U0~#4L>;%771rQ(d19CSd&LbN-Y?G0h@hMc2nox1$Mc+hW;wQATb}-g z!4oG8Z_6;c9;!5re|cxi;L~5Bu6OF6=Mdxj02h)P4HHfimvyO&d3A*eGDa|m(pdi6 z8k!FmP5$YM!lP%r-m2Nsq5VU*EH4A1j2Wxc%Rz6A5Bl4{$F@&}GrWUzCb%}9T+7pF z9i5UR)Y%i+Z9hiQB4c3%HzHg-Iji_|CxIOFP9snH*$w1M_cgOg=|y?zn;{yQ@)G zdqYw4ut84o^S(tL$wg*Fk%fvwF>+LVHHFGyov4Jr`plxt*jnoLOBc=0Z_FK}+gWrm z^RXICN~9QnVdWvo1|jLA-HD=F1vvD;ejLdjiqsrSA5z?tYNgFvhU;2eFvm+*}m zUDjuwIftBDH3IhCyC_o5bKZxZXPVT~j?GiJKUxz#kuC*)G`@}OdP@knbv#cGA0uAB zP4u3YlD+xbU1P<@nK|{>j~<$pYk6}N&?aN;`mZFB)VV{kArn@=TT_(k%h1X(Ao!xF z5PoeWezd0IgLlS-9XjqGn$hw*IC#D8?D8T_6G*5I$NIQ#?~=9eh9h3`yB~~CoRU#p zb2%@^)7)8;>gGlYIU!Milu<#qOS7E(2pZPqvMb8VQ8{@oom2ChQQ8_?r&FY7po|-L z>5Ik>-^1JHd7sH4^a&aD*+oQW`h0HkZ0hFpJ3%V(-%jtyD#lC$IYKD|y-EBD5~OxN z5&^;|rT{RAwrRAJXhL{L?5sAdha^iy0bC{p$*i|ANR*Vi7*cI& za_ik0VbE@^SlY3PjsfMxwIVjuU@nC0Erh}ghHmf=HHQrb`FmTUFupreb&RuidE=-$ z`1Av;lfODE@-%@|3TCQs5Zoh}uo%fNh*MunUwG%ME|p2kItfkEj)9Y&+21GdxBG+A z`)1^dKmdmZwaFq+pN&R+G*gfmku2Gr-EZi1K`cGsCHp;23DQ=+OPmy3F~nz;ff5|s zNU{II+*9r55pxb$`SC^bb`?no*x(Vv5*_4ZpNL-VL3~kEKiG|`^P?b!-EoDWuL848 z`7Y9yA^Ew8O3;|%hl>9&nIw7-%TF4cmRW)W&2zsA7i%9dxFJk{062P_)7 zcQ#6j+w?`g_|!MKR_vENlElfxz4mNvMd!t}?WO|UtDDQ%(Sz-8pYO@Hy8Isqvv43? zEL~r1{vWqT0HpO=xix*p^5Ohmz{f?bd=@rQyr>c`j-bPt1k=|nSijLaUV%~Ka5wOD z<1)1Fqit*3Z8@)g=pxTrPmT+9D}kR)=EMurS^(*R3Cm@rkQK!fs%fVNVp6e5I+wXv z1fnUkb^+sJprwAF(4cl-4lc#1c{F6Gi|7G`Lqi*2#2AD*uO54iBtyZs?5!(SviRRrIs zuEJ2|_tf}}u_J{Kek)jZ#jl}^4iGjN%L zEM3L*M19|e-8w*WIhhB@S+zZG15dgL_T(1Z*v9HGc*v;3DXrj%enWlA&25+Y8++UG?69{Md3JZjCDA+%W6w1b zsne}XBi4G(s0|8ek}lOVd0XzaKPm|@*`KQ$@wL4yaS2-w`d?GBR==L=2=%x!lXyD< zwO^B+sZn7saaLUKo33P==aM)066Hs-EH2^Wqe)KiNOIq(O1aCJqfQZzj19<&Jq!L# ziV1LapacaD(_>R*fe#6S)oSb?Lh08N%8tHM>dSmkPDH*E-xy*MQnEOtyA*7-pG4VQ zT!E;F90tmt2%*op1U?!-b>MP)P>zL_o}Ns_FN zo0|d?kH;S~w`(C8tGHOv1!Ldsm@Z=;M!5V?2k1Txt@BOR)cFQ`@I}ssQm|!zpI<_c z^M$_RC0~dmAaBOz8|5(shv2Ev=uyAVx|~oy7gsX(<%I@`Ki+JPrz^ z9$76r)dJT0TF>j+Qvs9zWD_j(CO1!fm0)i@S0*27vf zwtK@(SDf`b7d6^Ii4O&2iabz?{#*hTOfF3#A*(QD* zJH%|HX#@o4A}YV^(Lu2G>Eih;l%EPYQ26|-X(&Nhpk5+;rTY{NS8n&HV>wMzcrdjk*c^YKPn$;)d~FOR+*^f?L$EAfQ~2tl#%w9~rckViZvDz}`%jK6Kl+<@kOpZ`UkfSqa^}EqJ^3dZZ0%uO!JqigW21ul zbTuo`Lo33gBVe5%rsT9YUe3~HSw&Hw7XpE&L z7b;A7xPO<;shl(_BroTFm}oj0fi9R)KUi7=aW0S2I6VCJTq6yQMD1#mcl}yUH0>-l z2P@t_OmueAVGuf5c7~}^IL%rr_O6$JZ9OX0iU;RNAkqN|0<>W|?Q^Y93DbF~!3+{! z`$sO(9iBQ0crJtyT815DQ=5M$HiLDaIY|ZHCXr%fBVE={+pkNq^kpKr6eW)aGNa`_9GF$Z&* z&Q(%gi^H=qSxq+*oy`z9%M%|A2%anIUnXyAglTgIL!8D&>R!NW+F^t8#;wJox*7(( zHpG|07!J$%)uVdmK=lX!+76`Gv zhXDRO5I>EQ{4?iyhgaUp3cm&U26rqiqTF7d9;AG(Gt2^yqoG=(P}@{4+AtqAcsppT zekCcxRzb54>+Zr}x1jx85EPB$y7W^%_8%ACckbhhx1S_(i39e=ruOC)f|ZnpN?omF z8`zPwqyB|IP-5Pk^~&RtST(tE{8>Q$J^5bIzRk%9Jq<_LtvqQnDLpAE1$azl-6zBOTn`=q-~zF_TCd0X+q9gTciFCo9!L<+-r ztm2H-oj$S);_p6v5YUTQ{M>EVmSfB^h`yA0Ay8G1+CaUahtFI^j9Tku)M+Mz!c%m@ zTt?5;F~WpDf#8Zsb2ZTSylNvbo2m-idG+pV33==65_5A}&K|yv^X}yAzC^(uw0ppC zC4A#^s1HK&-y2?k8FusV-nK4GpI8W+qwS+!b$0- z!-geG+z!OV>+$_~S`9?oZ~dgf$Hv9uc6<=LY&8MO5}nztBwgT*T~1DJeO{cha&DKE zHk6PTztyEB(Ms#fa-WGAkn#)siF+aTI6rug-{$4wnBCN)ayj{Pq`+stJ=7_UQEvW$ZbAT}WBnI+7M>t6VyLbP8jDcKxQ36uGUSf8B(*3l zU>xCCe4o>0#{&%l3#CElioT|)$dk*k+dst!*aJIX@*j^(v+K5?U^yi&J#f(UbBwlz zaw!8KqrlyB(kPN5I+<0PoCCxT`lpBrNk>Vw-t!?cfRzo99-*cuS48t`_j-ESo)_$E z_0&L6#B>Avn22=f@T4pT`FW{_G0Be5=GH7{(UQ^Vo-jv5=i7{#PY-E`3UBRjP*P&L zAXNuW;&P5;;baOZQ>59kmH2IO{1=AY&~k(7bas4f3AY~C(11`g{GXFfVyRAXdmqp$*w7>C=(AjI@<1)x^@#QW%ZT5gn`Z`K-2jZ`u+UPwo zla60I0}l*?`zQL0>sZPGd5Y$N8-H-_~^&tG{5XHoTFg3{}8GcUgtrw z(_iezW7%v|5kMZ44lCP;)2LSabqM@QN4C`;M5VR>QEpB`2wq(pcs`hY8TS2LWc}Da zILBT4L7D-X$7IQk?^tbJX_1n&mduBR@A>9LiL32<@ouGuFIy_8`Xn!B6e>`W<`CsWL5^=>^Ya|rWU^`@_42^HaC6K^U><; zV4?QqEfVsKi>uaC#+M#57U9s;G!}ikX(~1<1|u?Zo6FsB*;tr+9+|)o>?x2PB1Xzj8jIbq1^ta(-%cpMWjKGV5D(7`z-kVJbL?R zGxExx&HvH^byk7tQX`yK0v_*p!=|pskO>yMphRf@oS%9ShPxM&FVTytE-IDp_dC5k zI8vaos7_~>vbU-)S3R9}x6q6d8DL%qB@_s9(&fofrW+}Ld}yyHR?b33IfXzv`9kb< zxH12UE9d(ufL}@@pj9C?=2#s|hU%R&N>(muTu_b|;k~{j>ESF1suVW84?K!ms zL+3KhthR}xo6hGZ#RRiUJF*^3#Dv?FCAR#AOuWh^>CLY;Spc=X1axSLgubI^7@4`D z>;g?MBPxi0=l4W`D$*a|EXrPC9BQ%|59^@YERt2f#pUj)(|09CIbe&CGsugOZN@Ff z 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

b$+}6ch!wG>n;QC>YP+XFjs+=&D2tHB@!?K z`gQK5rb6DX+W@^vP{9q@nPk}@aO@2F>cR1;j!eLhYW@4hM-Bn{>iV8cSaC_4KKy5Z zzA3W7)x$l;l60Tz)Ugk={fH$YOWRfL^~ko zLdN!HxZj7!{Z8SoFePUD@ub5`<0ic#$--#jFVBii86lG0fDhRaBT%i=w5K$GK;VQexA*8zg>QsXPnQSmBK>pq+HS6$cY&*Gigo>kqrE8x57ZOeHpTfqY5Kn9dH_ZmG!>P4nr6-J5@wB$tkrfjZi+L#mGGbMNCr(cjvJ~CN zO)*qOmkV@0c-=|erms&foHQul?r7WxUB3Lx24LLmZqF5hjNhbP|=|IRSaqP~MkT2+| zQj~PEE1gin{<^qd^wuaoPkmQViKaRS`%>vh*z3VP>lu56;1NcKQ%We{PlrPB*xI-f z^7*O*qGwf0u-;!K+w4v}Vyx`D`zF{g1ary!bFAZiM91#}WcDTGd(kF?{9;l567z;Z ze!3|CA@du9{6JB@jk!{i^Sg`k^GF~*;oe(U_;cJaGs^5_9%cT5$=w5b`XP00oURk~ zByvr#PSmQ-xv6AdVs2OaJx$ma*{06zqB2WD+l6O`u$s3;56hS#O1&9t>}HW@t1UrT zly)U@>1nV|(kX1uej4ldW>B5Fv^MR?`tC`mwX`$aybcD^_Hme|^sQb8n&vKdICH+b z=7K{|cm5fCg34m%Su)@*#8xpnfho31y~!}E!P9nwi?E^O>p({Mm0ro&8_Ou^_RPw6 z?KYo39O(qQi;yT;P6>W*Dmgr~Yi4v~vU~H$$8?C6d0un|1G@(e2rc_>q*T6A&4~l7xbRHG}nm0?dnREYqvT(j}A^#D+VfpXe7*?0~MzZ!Rg{i*_317mM~BjpH@VIW#8$pbx49wLG-i6N|rKJd9mH;-k~KHuptJ+Zzk z6AC$;?eA+0iK2IOWPH`wO^aNtQrW0P-CdKdt!3?>A5O78oO&?d~BdE7KzGIEY>#wZF~d|X77>la09n^JoFJ= z*{JL2TT9CKqAdpb#iINr=Bhz{x+wpluA@|bpeWzQ+@Rws^A;E4_K;Yfawf&-tDjM_ zuuS>LNf-r*=&_LiYaszEqAST7wa)E9sq`p+VXx`u^CyoTJH}3a`OEp46DQcWPMn}| zJ&{{)aC6)^Q^SOr4(1lkUDc5iau!&XYS2|UL#%ILs`Zj+YO=t;lB)3X&%d^&7&Krz zo2@B>zyNA-+W?*yO07nmwbxX@`T>+s>m#*wh1zCP+W{rExNQanr=Ydv=^Q>4_Obch z0Ri>I;x4yU*gZ9PeD7Ek3-^9iME%>a`H`)%fZ8{->al(3{GHiQeA2 zg7p^kaFnO|Nx#>N<$KYHL4L6)FX$(gA1KPVG1LYp`CsHZ5B9;()CoG|J1n7y;d1ilOdDeV{i7;#M*p{mWt1PGjr&4xBDv`)JAnI7K z*;Q4A`A@Dr(}i1Q&Rtz=tI#RHD4<^p?(8juAu;PA90WNJ$;I-xU{TQ{ld=YzVu0h1D}V#yYJqy zgZ+U3=ioUHA8I&w|72%xt)D&r-NQ4JWAQiuN$Sgn9LFY;4{kYl z*^tsdIQ=kg2|Qj~;@IA8V@8;Vm_ziduPsyOx@ll>Z6e39goQS;yOMneGdCxGeW-bD5zfOVR}uZoMM2`C&-lIEpu{8Ih(1R~^KM~+FYfvvlp8czU0 za95}|TB#Oy2?1~snq-Ol`-6~c%nRTGXCD0zXtF9Bg7B8gIttX0-=JqZ1Qj4GnAh zwrxN9=!ZAO3XnJ>2WHlfM3W*o3|f=JBkqFvIaFK|$Q9QFuAzr1Mlq+cPns_>Ww?ic ztJX|>pOrKj65M!Zp0RM0#w^Q%l?3o`j-(54aFw9t@`ZoedWn4p9Om}?d+zUj5BE8h z`ywmzyBV2@;ZafJV{;MeBlMRd7?zXxju3SgheY6E1cx#BhvU%2LU7YjzepuNhbxlmfB7tBi6by`PiNv}j*LJHA zc6*aGa#*n9P1(D`D>Vz|LvdUib~^*Xk+?b%421BxvB+>+>A2D4Sy|LPR0HEJ6*2w_iFhQiCBVVq-UJwSvJg zYqNr35EN(YgLQzePs#=;bGXXjx571G1~dSQJ#)fptEj6F1{z8R?_vr0;=97QDQh9@ z!K8mkF*av6GxczmgAAgul!gD# z*{Nm${+|L%QIBJp!yDiDbiJ7UOmlAR!a$$DmtM#5+wRjZ6?qB>VWZb_?45Wq;> z9F>5MKw{|N1}ep@h;N{tfVt|?hkzuRtzZb0Nw!X;q<)2_!ULDyQtINS8{!0>4_AIF zQsW)_0^Y{WXx|^H@r;sYOnN_O9M#>=!aT2%}X3j{8r|3UD@L9aoN2O<3fq*(Z_oK%SxF~U)k zXQL#Cf?IZ^)KFNGWoIOqOzlvUfv}6+u{WkR1zW1{Xue!cCEFvhLh2u5LimHnUuG`p z^Y9PpQKg)qs(PGN)?9|oX@aa!2)wcxk&!s)f_T$Hi6_d7yqf|1vI_r^`~rIU40`$O zCGrnnZIn66ZX_`{pJE7w1%j4?CMzRJa0R}K*bEK5;RyKv4dLfV4F44xcSBrYr5Jv| zhh&fI0r!PZrOshNK9C$L#Rck-_M>S1vAl*h8UyT^1^4)g;ys$kBE+J5)I)%Z_b620 z`>>RPfHYHUDQu`hzehdDXNh|>hWCsv8OlS(^86(3{8NOpbTyMhI!7Wn#5I=kP+&D; zXtWlf8PTtwx5P@(*7uK2xIGi1d5(b~QuDw5s%a;X;{pf8tt;G!`AKFoGsEOIfL`?B znN&6SDjP{&^@i$-h?XwqRc8`&m3AU)RUw=ZWG#u=`VG|rIOa(bjQCoPwQdF+Ej;m> zjjc$nY?Kou`=v!BMkteI`mj|vur{5}Hr5jsO9*0B2}Bmf0}Q6rMU?Nx40TJu5}*Lb zxQEDir)r51onmahsO)C}WdCX9kk}aN%#3Z?GdVc0%^$Fx5<5D#_NG@X!{$yoIup)M zvvA~#;rw>1y6Il{7w-72=K(t_m)1Z3+c#!A_jNb zxi+dK%M)4~;oqC9rFzn?!`|He&c6~hR$4i2Io4rk?RB$eJ$ov%^PK@wQPY~WIt9&% z>q1c1boSH__Pj$u!K~tJxfPtwm829&>436uemPwMt^r6ZQo2c5MM@8pgQ8-*+R+~lsWv1hLyDfiBt|(!af0|0(7b{U{2-mPa6&{LQ~-ncaO8&;dFUI z%UWW~D@Dm&6>g3!1vcfjlH+PZO$t8r{f{gRLcTVv*!Hx63Jy6`7r;1Hx#bivcqCnf zmX)uBb!Su1v;r99Q4H_-SjTDh3;CO$XUopK#j>2Gk*~0E?6JQ-D42Mb{pan^012zL ztdTW4ckGzo%6@HrtBIe#z?w{4IV+Ak13rQ0(6?{iK*wHiaxT`&&R;;^WCf=nHae#{ z8z(yEUmtww_bpaZF^Y4g;4}7WEs?wSWV+w>_1Ke|iAHTx#^zQ_dk94f?_l3)6E9d6! zjG2FPun00v`lRvsKT&%6Aosy608PK&a}$~v<-hU7cY4|ncvc;=`_?UZPP1mdAS%od zx0}Rxu4U82OSE=T{oS|ML);dtvQLtjXD{=-ZkxjTo;oKL0-tl7L{e5z88v>`*8mm( z(J=|&Bv}F{3GvS?8Rl3HhOPvRR0N>x*-PJ~pI>vU8IngNKgr9R#Wp_-HKcSxnZw(L zo=)H#m^m{*#OYC?yj0xL@fmoDy!GXAY$zlH*ko|1ZWHd7c9X>vaCEXO+F0eW{5Evx zsU27OiYm@lVP(%F8F$27ZU-Bk|LIOvwz(9+>9%wEpP@jYDagC%Tx^^92J7Un7IPU) zW-v-gE(0>=GB8;aLl80XO@xxF>_$)LfAs1b<{NML-UfSezKmFG|pY%}w0Uuw?Y` zZP1*RIntEKQn*vS@R8= zwT*6F#@9cN&s)YEgLpJp+12V3v$gIrfwFQ|;2sx-9yb@H6SQW1btZj&GhLmrkWg>g zdR?nI3qT;8g#~CfQu0tjV6jK80l)&;@TJJ%LqLsqz+Gcb;E`DN)D&5+TG4G1-L^vu z7GHv;)Fg=cFs{;|EBfL~$d~f^Ecd}Ojl8z7N|W-IR%y&PoI-&03r^(sr#t=OXgE$5 zXprCAIUt3jil^qk07xIQWO&+RU}Rum0OC8f2mi+N+k9n^=U@PVlNOI}!RUVp|NJ-@ z*x7(w4hANWC;)?)4J7~o0C?JCU}RumxBchG;KCvIFX7)u4h9CG2nzTN0EN2-MR?k6 zlD}(HQ546&dAUg*MM`lA(rPI#iUcVRv1_NGBB7BGN{3J+glxva!J$YAp@axd4vK

Fz|Md|55~C+^5eYu?_)9(i9oZ<@`^Y1|HRCG=P5VPT*USu(J1lIK~{ z?^5WN;*=VGD{Gh-cO#_?y)4@{?iAA5fmXZ~iBHi%p0zlWaB zjpGTj2oBcqxg4C=JCpRk#^IVuSi#687l6D2JW`1e%_HDK{fa>jpyFwgbMT6Pv-s)p>)CTqBh+{3ON_xX;6;8 zAn8ww=^oC)U5Chu-^D!Beb|17>8#Jf``et~#oSJ;em|)nCicO9^Dq}`TuaXXV!P<- zz$7_7&})--Qn!0CE8EA7Ac{}3Pox4)sSN5;<`}L_(KloZx$9%LQ^+lHig&V?g8j~n zkJ<{ADOxQ54I@*VG%Yu=OT-?zo9N>G0Wz?Q_ejO_^93w9ayIqdH^R&nNV332V>&f-4A zbBec#cO4%Cp9fzS-v<61fp3CkLVQAPLJx#xgoA|NiKvOVh|CfBBdR3&PRvd0gt(me z83`{*E6FU$eNr0I*JMg$&dGAg+Q{a~E|L8p$0KJT&mg}{K~CX-qJ!c*r8K1n%3R73 z%Da?rs2o$RQvIT~Mmrovb|>4WjD=kk=;7GU3SOpF4^6)du8{{zR14LzRP}^{UZBy_PZP+ z96cOE91|RK94j1K93MEna{A`X zi(J>a?s7fmddc;kn~2*dw}0+j?qcpr?t1Q5+#k6A^H}BCMw;IJ2$WP zPRAR(RWh4HtE=ah=!v~Tm2zI}G*hj3M-DgqKTPHFhdN9z{sKYlPiz1H0C?JM&sA)b zQ5eSY|JzBs&fS@BIA6c6hHtFJ-JQXtgRzZ{0>cKuH4qZ+AlMBMTmu1aAh-o5fonV@ z$SrK^X}IAeC%@-C7jK?}fsXU1guVRl{Ajy^fe=CoBOD_pA}|w46w$;GOC0eekVq2A zq>xG)>12>e7TIDThg|Z=r+`9=D5iwYbfGKV=uQuM(hCg>I#x=tVaI_J7rp62U;5FX z0Su&!at2X>8xMmS!cc}WoDqy<6r&l#SjI7)2~1=XlbOO)rZJrv%w!g`nM0+7aG3RM z;9A=+Kd_OVY-1lsIU=EKOuUx}_H&G1{Ny)>IKf?RbCS8tV;5E2 zrd!!w@nlvC95o!z|TIWO??nXhbNK6NZ$A@wwHfJPS4gpX$YEM^Hy z`NT4o)4~c?v69Oiq?OgIVJ%)eoZ$&gI8OO|9yC&`gq$&-93kU}YvVxzyIPP01P9cpEo zvLax)uCyv`?drP4rRENGP1BSXrLMFpOO-aIUFlFdmBD>w0WE5;#bU0htM&V;t16ql zfhXOgs;HGVPpI4PYiu9fs*k5U(5FpZX;rE|j#5)?eM^(q_Al6i!5$3GU~v5fKajGi z0Js7Fg|GpQ086k4P*|}60ghR*Mg}WbA+QixORyADSRt^0SskzjD_mFrumvDRumdYZ Q0k8%jMX&=aL|L#DE90r;j*ld+xSr-KsC(b1^gsn9hsc}g?B~uJ}<0l9N z8Oj3VN=4B^RJ>!p7o7YPX*`;YBqd{UXijQMNV2+>f~7TfSfe7;Y|HNRVgR0s!Qg?R zF%l&`3%oMb4}#>rA}Tp=>eV4DfCzs{Uw$(2`$7)LY0>iv`JUC8!s!0w4?&?LKsdD< ztYeJU?p)WKshTsH?|QYwhuq*0^mLTBw1kmoO`>CP>>R_#j+w1;i=i3<<)Qd7*isRU z7>n^2E>yTITP>Msw8$(KN*6@K=*~p2l6Y;HZ17t0`1x+1Y< zHIuBIo+O}-g^o$7PicpkSt0zE^~IViCPyN}@;I!!CA55+>cz2d^yPJjOF}Eo44zPk z2oH*WqT7yz`#EYy)zGhb8I)ny)qaogSuayw!D(5}5ETVnA{uhfhQ^Bu9Np-)*&xf;AJ3(oY-@ zEc?Ua#;o`+VIq8UD^OZgRE9a(6r({gOp+_9Ogn{)h4qTdI{4_VgTTY$JGf{~p1stK zGaYSTE}|r$lCU`#4VQuLe!1mz%v`W^cTL*FKL?W>B{S1M$0--Fbe&gar+4IIk2S;V z_rB4~b7X8TqP)|ntV8jl_M0V**=&ggvG$Am5@r9rk36u zQmVClL2&W+gIY@~rGcxyGPDY-;b!Iz`l#4ayGN?zW_bAYy+eT{9;lTekc?3`>qs%M zcSE}sa3=2dC`f^NQ*0ukWj~ixmxgj@wS7E^rBIBoF>jo^0kd+VEQ_XyE1aG3h= zWOOz|K(BehC!n+ppe8MiJbgRkmuaK9YB^>d%x4ovcg1OxoC>vMQaxg@8j=zaXc$2;PSN4j*iimD zZRYuQr<32QAe#?ok^q14H+)b3h%)(**S zgc3zN@Th$RAUsjqS~4HfkVz;2=(PejJ5Un&6bZd3P5oF3xxN(gn`i1}(h+V4UJ9pe zp7{NR_nqOw;D+}v9t;YJCpV+idHq^?dxr+iK}?Su^R*5imz?3(F#>ya9^oMQ$Xz9A zf7+eiwhuKsOFG0dOwqRJePiaajVSEx zaH(z|Oxm&pWpEEx^q|ZWH!K!6bokBffT7GXwNjg4|nj7(NtJM zqn6CKEyy4mwiKIsa_BZ^nfQ&@q~$haBO(Ka@l|J9Ns*fCWGi~Vx-gB@;hh{0uo#l_ z<}-ZHSHf0@HVf<@`Se^aPhO3F(LN;FaLWc$GH}b@B&$kN`J*=_s}Mnn4qr}9(wq~r zRKNl5PR6_B2NX*kL~?CUc+4Q{OqUSg-$htKagef|uEL4u|GNq0c{n?vB-2Z2Q?n)s zO-fHjJI0D5*!2+0+mqzJ3QEKDmG6Yyjp>BOMj+tO;NIk>V@A>5Rl^f5U6*8m9;0$XYWdctU?VLdB5p`N~|{P;dMNR z(`Po1xHX+PZ@-J#$CUEoiniH?*#69kL-DTfwf+fjpD*-%sowHUrm3cI+yzbZU#uR1 z{>@IH*!MpyOHk=PZ-|34-wS(Q@IAA|51b0@sISLT&tTPG$?4cYAN*1dQ-V?Ijr>Q4 zdQ!crYB4N>M*AQJCsd?9@zZFnt6cDvcN9AR9xXIZP?Qw+71@WDhJAY7&%k%|F9HGI zNyxcxEz6+xVolr671;JLgFp;-%IjpM&Y5YufA#U4rq1D#(^u~5qliDG4C892YAqpU zzE4M?B_@k7@RD8>PP4;-gWhCA&oTUcnd*qSH>kW#gSkqqnPF1!cB}s=^ToL<6m{4f zWda>yh`R^;v2G3YPWbO~m8OG9nMqVzoZXf)PD)7)|LkpMW90Dpz_UdVxkfJI?gnsj zoe~kFJl@F^X^2h&%wveg-tC$L*$n%1SABjNb8A&0{}lX;pncY!**L)IyygB^QUUC* zv~P%;YF3ab4d))u6k;V5#-h&0l{vnK4@7}Ti^o&mVk`Sk^ww~r2qKY$dmaISN5Tb^ z?+Wke^|F@4H&9=Iv2JYY*#q^tW(-}+>-JbmM&g|s+=J6F!=fi(B9z`8;Ij@pMbQG8 zE+*dRYNqk1KACz`sTO!TGC|Y-M6FYj72)!!+kssre_I|0yKmta=H~6sXQAoYz35rR z>sZ(j)9M#pY4jL)?^xmKp1G8559h(j;p6#c!XZVgtrLGSht+&Xu0B6UlS@m-rq~4} z(>lZfq{4edoQw%=Oes5Y0WcfFG$|VpY9-jLBa1CcH5( zB>Ndwbu95~@WpG);iYY&2~o#FbS{No z=Dw?@J0-{rF?~B$auBrrcFm7n7j6O_>&@hibQ*`m=hic?Dx+P(2!sN}5rF0N;wK1a zNF8OK*qCNghjZjOCR5N_Pi>9OYp8LS%^VCQAt_ujqU)_vA4fO48iHg?DpHb?b{@*B;Y9~RtXaZbep6JP)MO2ksVpN!kp}f`A{EZeV48OOuuvWyR zyg11gbcB#;hYRTecsdTg(V|PCV>3eL{}iCUX=$A}3)PuFGaDB5CWrfx$o3&foH*|D zx>r+;6qsFR#rS}n49??N?IRnBdg1~JYo!5lWgi|sbT9<5Ut2*M*rbW_X;h)TN?fRcYA?bhBsQvR3#qSf_#={4YJVIfJ1;CYt<*UYaLs%~YUjvI^!YVDob%is z>noYj*fI-3#(m3r@?~AveN}@c!TgH(HU07@4u-KJ9x)_u&?*&9KN(X$&p(={o z1NsjREC+%JP~ZC!iE+%(R?sJiGIOBrEmIvb2iDZ?vBdTAH&aG-1tpn(4xza}nt`cD zf*p%@#j3FrcB3cc8y$EJ9mzoU{J}bO_-UECaLA*p;b76pj|kM!u);la|C-grxy|Nq zY$yn>iL4xLx1G@*fh$6w%-a>OFy>*lSdRN@wQg<<(-yCVbBM;G29G!%HyMu5Q`+$Eb^KR zU;_-HFTV{5`=L~AlkYL5-}~B3Xby>+DeTzIJ^HYDdYMr-HTBsxk2wv!Y4N7Yx|=3@ z36aaoE+B*)*=hQZaLFJKRbj|?YK5{&d?{-EOCwRDguCFwg)3pf&BYGsb{-45Zu`VV z6NSf<0jAaS3PL_|!w^uJ7vm{G1!CnO(_2ERjFmV%j6#o&%xF856Ylw8N)&7-2O@H| zi{=reKUHdV_>n$AkT0DS&w`%ntS~kTXcHLn!iWPJTEoadspD(ZZX5TyhYTQ1;8rt+n3#ol4V4dJy z2NlGBEt}|a%~1doHpbk_v&w;MQe|x{=qRO{xs$GwlwyN%NXdpsDNFxkkh4TR6pTpt zV7HzSM$2dj2Hi;PZ&u0^s3HSDm7mcUFd%?y5_mAoA89*}t|OX8u>Prt)Fyd(5xsaf zpvyt^wFlzVJLjUb_rA{qq}CU;r?AbNBo(1HHX^-|T94I2MG?zsV}s1wiX_+d$UrSh z9abiRKLjh=Vwg|n$^DG{(HoUp%mSG8{#e{6(vV_5pttJ}xjR|nAf-Z17cS4=Wq&5- zXEPkLD5D+)B=a`uc!EiS{c^8<)_p5QKC#i;o8xN>W+va$Z=ZPdLMp`IZR|xpsYHQa zdwlgXS9BSx7;-e!dG3NOHpkU&{knACrc;`71$M9$(5PX=XBr}518<{c4XEcCx7ZfT z438lbWgWBj`3T0_9CrLx(QP}ZGyS4l{T^zY?L&*;&$V)JB)1Sj1yc=cS)pDvD7I)3 z{Pt3L#o^C`Jev?#;D%cM*QcfNk`i?oJ1An9Rhdc|)n2V04aD6aBw;GEsCJ(@)NOeQ zz~Ma%RFH!#rv41+HRIAn!hwPzwTz#?C!}X={8DoF+v_4i^Wj}W?x04Km9H^j(+)5oI@2U2s*z9NPsC@-J9@ac2hxf^Vk!ga2{VvCaT zq7c-_a_S9cMInjj+I8H#efQG+*xvxVTX(J<<{_wfW?{i-=`huFYQU+Xz-KH6MwJC_ zdSxY0GSD2;PNNH&z%5CbP8}T_;tDzj326Nq@D5i+wufHkM`&@zA!7?;1J%m3(>6zP zXWUj5!(P%llvAi@?}^t1TFAI&8&gfDR26Q?@o^^CO5Z0m=w|{!6$7!Ogt`QVb`+5- zTaBWStN^0g6#f{v;?YDl3fVGQQRZ&OFDY&l#25pAEN*GNi`o4v@S%+@e{zKFd*!k4 z*j?0*P$c$~lGi`0JErFAP?3r9faCvqj!iB2Nqq{f#9r?V+((M_YuDr;zXF1{)JvKR z?w_3uW^GL*S}$T1y!t*iD5@rM~Fn;!@W|D5ywynoO85jXbrsAkX=K3Dv=xop$ z=o{B$iv`wtJYCq-FOo4-(tUd#eM_bgAqbCBEzG4pF>Q#yIV>NsRlX^B3S|>sMU=ac z3inC~nv}tzzx`$BJILO|?On8>R^sVR#Z)cy8If9o-dVU)Q(oe_C?*o$QVQzk`Vmj2 zvTz$Si_2EO8=W58g2CC9=lI*+*I7S0Pe@{jKnk%1;ajupd|$Ro6xtZ$O;|pa<@xh4 ze)o^fw<2_i4e03RFC!*{4(;%!tOI0OPN7&#zBQ;5gp5rOP1)cx;%NO_lzXMYqK zc1DrUnthsilDKHa$r#>@Fl|)*NAHslNP3VJxK&xZ^yU2dgu+=%`;2s~76F>|v+!sf zqQxp8*;c0f%GSj0u8?S8p2iDCw!s|C$hFh~V2!e;+S-(9^w<-ybB;@oZgL91J}->E zGEl;g_0EXcB2+!P;VI)d#gtW6(l5vDW?v#A_1!=G_=Hkt$AQ-|W z4ty#8+s*GB06_;WN?VIujo-eD%Sxr;<42{>KEQ*<&VcK8E((;+SIC)4!N}T5=h?3) zwn>x`=6`~|N@slcrRUN_X}2%=k-YbNM{oz#Nq=a^;iqBZb*<@a2SwCiQjLZAJ=u*j zSFj7lp1}Yehz9{aHrh-QJdT|iU;aSCA>kV%IGO}`3F73N#Z_G;FA*sX6ogPSV!ids zdmrhS_dZCVrQ(M_s&G`sFxeSc;Ak6_y`wPB&6>=r3;*dJS$9w%CEqssuEUUdTR#VE z4m|%YT-zEV@x`;qk!F4A7|lY6e&y>G4LC8Qe!MK{>8gZN>68&e?4guF$jLfs&nD>h z?4h?mqGeQ>p+_1!wNgw)Lz-t`-K}x77}t4%SG5Xf^IrFfPx@jtHPpDm47aV$4DwP& zOY~(cYTe3j9zjxZxieig)Ds~Dxip-qweWy1c$k+cB8P3$v_p~n!Y*O3BTT*5B8P?3 zN+T2*Q(uH#^KRjty{E_EcG8@_cSt$Jq>Swrt;*UX7Uk{9y_z6Gd{m|cmd?O?;)L+Z=3 zu3@b%BX_QZI|L3dYAOk%U(mgM{ZyGw%XiXypPqF2iJ);mX4k}IdcwCo7=`%;%1|tc z#KnM2*Sl*P7*WhL9RB6$V|8nV=NVeoIdi(V`#JIz_CNR>Z@TM~)9^d;eSU`e!XF;1 zWPZDviAe5;JwN)%fqByypCtJ@%7$qoiYwZ@$2sCvllQd0G0++vm$LC4@hCR zwUFe(WhM$LnkDhP3E%zQ&wnaT8WZsASK@GTo@StfJy%d74gph)N@*6K^1FFr$t63g zw8@D03Yok|f$?P${FUl#Si8ZeWp++=yXX^IqHySzN3gk&3}Om)?@39fWG1D>aUP4?k=a?dQm zzA;1kr{TZxaHM;Ks8CwjIw}(qr#SezYotI3rtBMAk)@83Ijj}p;8EnsKdNhM9w@C- zMg&sC9zbmt$uWmGc=bmT&T>L~R!AmM2Ugn;li<8PuSE|4wSw4y`tt5cJ2$9{4>{-g zOhI7@1N%ZPXVV)H(=ML*?dG5L;|gpk2N!F zui>Uzsgj&Sy^fsfNGW|^sAt^9lf!T5%`b>C6&M5S4)B;Zrede{kg?#1ByEm+PcH z%xY^+V>*|7&F{}bcFj-XS+EbZR^o{7VV}(k*=;0EK>1gCJHp^suk_1N zdA8W;t3Cqpn1qh!olfzr3Dnqgv4EkCOvIbQa)RuW2RZr_)@Y{*=WMBV&)2~Z==3)& zv=2PC9we>ud79GD6=GOHm6LRaf?!z4292}9c2eU@0tluV9wRw5Ks4Y!589$R&)#Ql z?%oAT{4cHx9qKlC04~&WJ^vNy;Nl;uTu!7>sEgx>sr)jK&9@;aQ7qhZVx}*qs%@wD z53;EBOIILm>I|=!Mb|ZCk>uTagj?S7wmZ0xB5-}b@TP_$@`xHKkZ!~EJGf8Oso;AiwN$Z!WOTrW5 z5I&{BmVBr}VqyhKq5HRge^8Or?h2O!*?>q%k z3EaLzI6wTeY0|Ujjzg%n_gd*ttqvozJ{E@$Wd9@SK-c7lWE`=lv4RO>b{4|uM$Ic#+2Bxvm)Y_F3|6POlGIirFh3@ ze!{})YM%c0KOqOlO3-3fGQWveE0U@C~gOka`g`K zj%3TlF#B!gF=3D9PDW zqEk-z<+V3(@tyYJpcydk|DN?eAGkgVK z)`!`Wj2)geuR-{|wI8xv?(zzqS=4gCZ$hedu7;sn9EdS%Kq`E}ENovqxiiZdQhN6B zmp^uW5|;|(F-{=PIvL_60M$f!Rpnmc#;7Q4az6$7eMfwimPu(eLyN*b0LG3wdeHUK zQ$_5R%TC9}2~*cZzZ{0>k#a+ikD7R0s}zMHz5JHnyJ%3zHFb&N=HoOHE-I-eALkuS zI0dM<(^vYOdH5$Y@5TJkxL#cbb15=5x=$jNjeYMGH9s{DDGtoB9i4LSn@#N7GNRb?_ zg0bi1=;C7};fI%B1%b)#pldw=Y*jxdZRsBBB0U=4tp4jE7Pi6{%?y9d<~i~dj6A7x zS7o?&8LBYxE{bTt)71HhSll?g#;mCNLR}FxgS!l$J$5_1*rIshN^8}l5l3(mnsPUs ze1ayek%E92u!Cea}L91!E_AV>T ztjBA67k=7=HO2+Oc8oeHGo+nqXg^7A!qmjtWF{OJ03dfAXM1Rz;i{g=-k2YiJISU9$u}7S!`t2b)n=b>|^l+aofcU zw$aM&n}yMtspCkBoHRfyR&{eF=q=GQpsFgClw~2qp+7N3*~dLu&|8i}Kgok_&wE+i zbdeMd;>#y7j1eAMK=dDdfk+}@x5f<)iL7w>J!VChFG=!XHavDrgi!MtL*%l$S34mq z)}iccB-g)^asmMuT~koyHln-mtHi|*)d;O8z4bgxDA-@~^pq#{!F2lITNb?{QB@I% zXXo5#p@=0)RiQ24fV!aZl+OO`N0lKggXMdTAQgM9RjD$lcDqWYov*+#wrnUdPn|$j zHB|2vw>>D@KhOE(1)s5NtU&oqSnM(RtS&{xAeYSRoJ%Y7-)ZCqJ`_6$oSh}_!HO?@ z?23`6&!UDNI-wLT0dKqn-kHtU;d^9v=Ni5u}1;h%}hq!aATZY zxi)*AKjZWu=N2b?hc@Som+lSgnY!eP{Oo>nG6$9IVkH*RxVkS$ANE+DbQkeJJ2?kd zZ8y7sfnnc>i%bnl#*(nh80e<&ImJ+_9z(1oL2IE-1zWzd`U|Ylmo93ue;)!W8W(!* zf}Yez_iqj?l%t;ki50A9kunRgL?#_BO0Gcy50)5m_zG;QD;lz({@O>oYb%q72GwRc zke0tk|!GxRC96MKPdK;s>#iS znuHb>CN)vNHHDyyH6K1=v6UbkOq3d&d)M#6xmGCl~qv>Ers^!sh zNg1*uX>5c3S_`SdYDK`C@mJK(7$-BkpPRHfj0>S~PDC2C{$P@*EinG!QZ1}R^v6?e z81eqR=;+$7qdG{+hNp5OYc7_7G=cWMubaJl7GdiZku%bhu~y6EOE_(P9dO5}vc3+^ zqCG{2YBK_?q;@Fh7ZvZ`K`ObdfW1TPdKhf1V-w6uVmI}(za4>I)_G_%bRaoaJ! zq0jhow#5I%WhR_rO`fXxM-Ay^DWWhVInrpiOrPUn|z85eWgV8Yo&DXDlQmQr)3#IGjKH zbII$ezwdQuz~zVi>X`@L4>Yj7ovuKeih=A|Lvkm8Z7Hv;nJ7*e{r6fMjk1>neEA2N z_R+=?6BhQybaXhFAe}*#uMWCq2CI&g5tU&yWb5n@BQbtDQpS9n%j9qij#>a3Id~qO zfQpq#;0mn&!>^GvE?(E@ht+ixrsQM~wcY@qCX1Em3e*f@yW=ewHqhdrdcwK|`LWa; zis-pK|oTWUOUBMmC>sMTe-Fi zV1`mpGeT9h-n>sG!a|iS9ni8J)K$L)A7#1R6K+7ocL~te9e&}LA$O$PlDl0^LIMah z@}>5%Ej-FeE%xc|ikE7T7ol70)dOA0cgGp@EufhfF@;_}yNGj17zyIjRl8`m>L zzQe1FQIPkP%f8qR?;(BH8$hV-@vEsa>b&p;eyMUHOvA}9?{XBgcv$o?1v82&|D6$1 zDI8vi@wsTOsq{^po+&o~UkvdfSnGVD1`Fi&qC_~6=^z z6KOsp=6tiQaY>$+7_OhN+byhtBt;C}h5Y-5h!j>cSsja}R@#ia!~{RJE|Tui1t04P zGFz<@Jue0%CRt^daXq2 ziaQep;~87s!&Q}%Q9_wx@FXVdpxGAxn81rEBE18I{ife$->k@{Ais~Oeb8DH*>Q8- z|BTv*k7F)?#%_ef5GTSlu@|v=YVT>;xH69$b))klr>0AwHE7sc5L?k^GldFiejopKE?hS`$QuJn*Y`9k<-cxglnxN;F*_j?Av zA10P#D2mIf_I#ZV2}o32{IddxX?-Loi#Vu`<{23;hjsD|>^ixGeFyzpHk5PMRaI<~ zBCjV`sFiBXqPe2v@-2qr9TMkleKZp57<(=q4Ge~v~wP1QGi2fg5N1Mf*hsyBG+ z`q#uyq_nXEHLa6XsN<1xCw+vq+9EZDhEHh%K2?j2c!{64>CmV3>6RZ)B!>0zv##8_ z`Q;ap#NQ4B@}yuu^^vCq-@hFh%{K0OsM`gUp_~MDtjLQZw59>@hK$s4>cSb4o`VJ} zuKTDLNVmHK@Z?~P;FZ6;$tczTUfOTDvPwjT|6}d@m0o?qwqMT1(pqja!H@b1& zG@E!y+x%{MitkTM5I3i9rq9Bi>=pVWqjD;xEk4WW_?saOf>0?!R8_+k>h>q)jysxk zmKSgKR!c0Z+kX8_XBX+lUz^1@jl;THQ|{y}WEDifv0SI0N+vg%L2%$%%1{#}zx1Gm1@P;~_3K>zy1%@%)r9W_&3?#f*? zy+}GKh0V;7Zukp_IF@k{7u@jFNm`9X$5lBiLFKY*n}+m5ka6!&uEQ+7;wvkuiv3GDkw|yCyl#*BAm`*S(Z26$;CszbSGu>5OND#YSn1XKr5yI4t3>-Aup`$npgT zB{VeXW}08ToU95<+~y7j!&)s3UAVjy%#WJY*scg0ej-Vv#+`-#5@{vf?h}Lh8=2iM zqbk@HGl1Bxr}WxzPPIo4F*a<;pugb96| zQnF~^u#v#~FrUguP+&vn`9ufkvqVYNS0tkw%ka+I4*)cdYN1_OVV9c>h>7)b#yI$C zeLiB(GkPu?PXl31h;zi9m=Ottw>f={$sUJs@Nxzg0NkrdO~M-69lH0PePD}FrAAjq zb4I=*=^V?-&^b+*Q~Tq_$Pfje521>|{@`^X8!MScZ@q+o>=a1(!gk9|@GQO7zg9O<`ZfkP>IuE5B{|&sW}|`g8l55- zCYqki4rW`Lyt0KMNhGVixz_`kc38s$p(B@&WTAKRc#a_H9wO%%5#-JmV>5y~9@`2I znlJ+xn1mEB9qD0@c&89tQ0ryXHXXSh^K@cnf!Gu`&tx5L6@70sCgV|VbNZfq5xn#} z20Uy+DO9JnRQw2Z_s~?r1vBoZ;vkvA7K|t_5%mPOMFk6CzuAsZq?|8VDBslUl!x!& zpIGsc?qDg)%V`uwsoiLs@(`+tveL`Q;*I2Bi3lxpE`IrZ%x*Bb*hi#c-8E%PtXPw; z)nyHB9RV@jDfgbNqVFlG8_$J^_Ap%_Wi2A5BR*c+8e2kVlh0*vQV0x#c}iBC_UTw{ zdu1gJz7UVB`xE6YfrtojvM>zZw;@n~4<+l>sIa722FC`UPIRL4l$|@TW>P3<`ag=+ z9Hm8wiZdfLfx&-M3d}gZ9Wl28Zq}|SzEjSOYWpHjEN>B=72>t02g_i)63gfamLtWM zK_%Nj;o{a4r$u!Hq}*y^o9sNf_FSun%eubYMzPg`dPmg;(h6$p{h=HcX8XkBBtMV% z^8HD#pfu|Z6~m_*Fo#X>X?zzZ74vs>%@!vZ1hlW@KI1Tu`E1MTy6WTgkk zXjgGMC7Q_M{;GXMh-#WRNc|mxlQ@DyQ{y87HNE~^nXGFT&rY2fHK)=ln9y;dFe z(0(F5XqFznPBG|PsFqc-s2d&{!omF4u)1g(=-^@|wpnA8+&Gv1oQ2<>ainwnHX)=( zU?;6JF|!JU?*EmKj2Mba2G(RZs3}{KJ*YH+d68W~2-eqamW2@$;Ac#gV-;MYPqN7r zFTs*EQAC74!eF2V?&^WU;e&FJWp5*qkmYEK0yf%}B=yaVj>HTn=Dihp4mPw!bXm>m zU?Mt`7}*nBzXs8aO8>6txl6F%_%19;V)oxGJv5XF05z|U<2naBSpu;qr*_vh3r0M1 z0bTEnoS!|CLJMtQR2qH*#7IEV(e2zfaFwLh^vWd!T%9UJi0Z6N3JOBLYBsdj_2*DU zV79gA7H_fH_^|r#Ntk*RT878O)_cV^z4!&c%x3R$7$(XZ?X{17Q>o_uv^!BxSeE0A zfASD+a+#l4Zl^i&>rAP@`>Ok<@i{s_K3V6AV9kyMgVm?+NC z0ct=QyzbA;-^(_w1&Em=<^WEURzwz!%K3@q&# zK1}zQ$L5C6B_opD2Tw-@lWSyH;ZGJeCL@RYT&@954NoJ#o9S!vgiI@klZFcC6fAq4 zkCwDB+^M^>Lyu*TJTB-C@*){9KmrO7a#-} zv8XdNItS>G1GCbyd7X_+Ox^wswYehYCCYAPI_#R-rjfa%U1d@yU8Ik_0O38BZ&0^7);z6YP^=PM|{|K@P{<+(`T~~l1v{Anz zB^Rs3kn`WEn~N8i=y5N8PBCGGF`@%cC*UV{Y|RAxhIWiZQuo+V>;P+H;d?^_FaOCb=gJak%Ocu0xugAK+arvaW*^LvJ#>1uzs>=5XwKD z7-QT(`bU(_io!V>7(G;UV4%1UYUC%R5mqH&j#kHPs5V#T6}|}al++O=prJbx!E0_d zKI}Qb^8p4olC%WV;dS8FGiySxh6*-dgnT`3OjNKPRSNo2=gBsSYGPrA!zm!Zn*AQX zgAO(pz$o~v&$!7}@bAmthLeILNQZ%Tz^9qnpOgnVwnDU#iNa8L(VEMQU%ClrpshW4iTj>wU~_rDU#9FfPINV z;^jz4Z{#P?!1~V2^&Tmh;$@uV-(rtQaa+E~`D zJHOCjsbL`QQNw_Wnbo1@vfDvlZwEbtF}(|U#if*E$E#Ta2VQm#_uSsH`V=Qdxn5F7 z8psb)o?gGmC7QWP&KHvb+Fy8oI1`3UaCRhwA>Sj=a;OvLeQ{Gggb7a_#e&F@NEi9H z>KqsSiI9xMfn#xkdEu9gn*fA|-dPIkUz0RDxWAZc%ZCD^3%UzjM|2FBC1k2WL+# zDp(maL`kYStH@dshpFYGU?PmWd`kT>%mYu3Zg+_y)I^JWzMxzm_8KF=?*X=uN_}1->r&-C?)WS&O z(j_r0o4kc=qxVbWPFUBY8MTZAhVlCWnBof~xgjtwHRLhhEo78h*2_zz4kkh{KvDWh zG}7Ha`;*WcW8xCI^1@`t+uY2Vf0?iy;dE|l5l?D6P9Se+0Pt}*k*Q_-r2tuklyYHQ znRRd5Io>3^G&LK2?M904Lx}$OK4x4IqR^!m`Pa(qKC9G#;J=+zFQz^y1gB!42#}nQ zvubpZB&-Gf$nOmmD|@9=2x5pdflgsk6zO$0D+CDe&Sd4kW5{qVfCA)`j2eAwEcLn7 z?048Uky7i(EzD-$g7E(#Cj$I(o-y?pQAd@=_K@+~iF2&ec0mO1 zN}^GA%@QGylsf;=dCK|NnA;CgC~+GVjaSeAv6F4O!+zhz*)`V8WWgaUxfFw~H}Q{} zSCUh>Rz#Mzb0Uk!g?aINR421n)WSk`kkrfGtT!6o7A50q+0`v}I!m;vW`k4&L3e0F4E$apUL7mak z?B327`F^qn>LNEM6+?%ITAn6M8q89JP>Lf)PLVQG=&XiAS$NP;(;zCEkv)HHTg#eM z_lCdEn*JAXSZfR%k8i@D=Y;>mt{gB|DW$~wJDD8nlaef!39K7`UV4MEQP|NW%$VYU z^w?ibbss8&d4?0KZj2dO&sB63(k%LYybEJPeSY$7s9cuu2<+WNtr~eMpn5KvzWn!9 z`c>NV%q;zD@UWuFY%p9x`Lw#7lld4q1OBpqG(8Ok-BJOxYGzO>`+)4f<0l*MD(X9} z+x-D|x)>sue7R2^LeW!sc2cXart)WynH~)KN?BW7Fls7c7$A#+4aW#0eN&&6)$H*a zLBcDIF^8ELtWB+hX&Q@gLs6{HSS}`=$@)@cnfmDr3SzwFrz(zkVPF{#`IVgqAK8Xy z!e@Q6@B?yY-V!N7z5Mq87nc<8Yhqwy!s)*9s zHh%Yn{cpM@A9{tl-P8e^cgoQf%}CCDGB~&^?28g106x7n-XxYjQN9jwFyjYRpL9rt zU4u+aiQ19eF+~ey3}yggV`RHrJkjLiX)-U4O2T<`6e2#FYf~Tle`E8EVF#8$>56y? z%`x7HOo(zz_4{@F^n+&0Dc=@st9}mIwIHLbb2nIr?ULShKF!7c{p`WNy}`g)DAMv1z&n8y307KO+lEqL^vsQI zo)Cg%hZNi$`R#(tw_hzYRF9kffbR+6MZ_u7%?7aJ_bsae>SOGW&ON;%4^cJP3;$AC z)$mW+utBtJBY&SXB*)o(Y_v@|{}^a*6Z5BG%#g4UXGSq|42zz zl+ia_)pK0o*Hz55KI+La8_P9QESkG?93y3S0Ap3YfA;0ob$R2#G3GM!e53WMvOaJ5 z+k{pAP+Fa8XBiEvi{-myABv*K(2HJ+&A3w)7QQeYCT>R58Ui1LN{0WX#EqT_*F?MG zFarnbLt;^a?^YDXhi{mI9HC^sTWYoDtPr_JSd9bikHW>995(Gl8#akodt(M}f!&YEMB4)7 z17TE6yD^xsV;QmQ^-gYan2GsgOFlbQ5zK!4=?O}fg5CWG_hsk7ub(e?rGb#GQLXhF zDejuF%k6>s5)+88xT2f*$X6#c5-n(=%dhI*VFvef5lnP#DyGU5#Dsc0+;9mqJqNz3 zn)S@9FJJPK3%SfR7l`aL}}Zo3Lu18&XIJ z^&~NlQAaA{vj9}DnY8f?l9(Q=N-GX}>)?IONeorol1+A)eeXM`Tdk)e(f(!=rnq-< z=CdU1W?TNTH77CEDu~qnQt~|q5ssv*O-!OsIq?f{i)_)~3wLmw2CS}r$N^uC_|rsy zU=4%*+3Gsk99}F`%z-il(Uj6f8DqXBlGQq-l&QTeF{$t#sY&(U(aajCPB%l3zqpUh zOP&xu><^=8TOI>1BCZlo#jhHOfO0ovU`*a1v=9Hwbuj_n z*a1ugfG(oFTRRimZC(ua6p)l9c}De4!9T;_)Y!{WKO$$wGA17qf?zSYQQh7ryS!$6 z^_6OH7XHhi?fEVsH8Zb$L@~y$6G`dMJs{-lX=4uEwiV6%>*FR26QUiPCC0R^4YG3m zkgoX2rV^)5{6AC{c+)Nh5L62+W6ZR16K>6OWpwvM?@<#wscxvSZHS_{Ago2ABQ`w0 zK(4s35#v1e+aU)}9_1x_b!c^$pcyuPYJHrkTq6!l^U?|Chj*DpU9XRq`gC{I58$)| z4pqGQH;&#cF|67{7ynhD%^HbxI>d1Lkqu1ERR8WX3!7aFdX8iS1Vl-_H}Yfq$oZm^ zK7?TfV|uY@N$XSU{XG=*sX{dg5Aq1ho|9U#xp2L-L;J(va|+%icH+Qc_tD4H(S4Z( kqUp^qTux9Z6kF#-7{CUafPNIP5)|gS;da(e+KmGK4{V<$y8r+H diff --git a/css/fonts/padauk-bold-webfont.svg b/css/fonts/padauk-bold-webfont.svg deleted file mode 100644 index 92538d6..0000000 --- a/css/fonts/padauk-bold-webfont.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/fonts/padauk-bold-webfont.ttf b/css/fonts/padauk-bold-webfont.ttf deleted file mode 100644 index 6a5d403fc2d1f7ed184bc9eccebadd26188b1386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45896 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 diff --git a/css/fonts/padauk-webfont.eot b/css/fonts/padauk-webfont.eot deleted file mode 100644 index 5b1a269ec2d06fdbb9a1156e1c8b6c91d61c2495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16581 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/css/fonts/padauk-webfont.ttf b/css/fonts/padauk-webfont.ttf deleted file mode 100644 index aff6a06006aeecd45bcc99a76cf8d886ce742eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46292 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 diff --git a/css/fonts/padauk-webfont.woff b/css/fonts/padauk-webfont.woff deleted file mode 100644 index deddae4c4e3449f11c5b893c9d135c4ea2e1f586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18192 zcmY&Awz0MC_U-fi{q^RY>m<2yBQwdF$xQCJ z$%}~rfB-*991(!>U*5R*fA#;$|9=t_QA}aR74gS;V9n|7;!o*vL>G8&foLbtVJ=V1EFR`VXiwu;!-rW;Q>Z^^Z*5j~^4I zM*0#n1E(Kd`2XY({|5{Jl$o`M=?}*M08st(MTjusEf>?=#K8EcyP!WZKmGx1U@2-X z=0D^Q_n%+OVe=esD8+`ODqf&ge&uv-3yh><4do3GtdX2JSz8 zx&FH^g#Q639caqdz{cc<8~wRHLjZs*i%yT}u`?`_7 zvA+H;h#?3#4B^;d?|AR%E?_VQHUf4MRuXnhz!e&iiMfzT8Dxz{Ujxg`kssuK zM@dYKgq%$(B0@?^%o7sso^XPQFGR{EDFI=V^-LJG)y(#NkrC#xbMgG{voq;^zhMB5 z2uPcSyasyYIXwlz+ZWK(QUp?N*>1-XkUjt02)OCn#=me9{zLpHfX8!o1*ZFhZPYG| z(4#;S6;&Z1ko*qY5Envw7dX0)vu_tn{T-JdVFVcbDZra=Q3#}v5N?YB2!=8=V-9aI zp#3*Jw#a}v_Ef%TW3Z|SH~?+xFY5zZW~avbm(tAH!CO{$xgVo5i2)0?g;6gi>ru4J zK?fE)eY(w&u+wT5Q|jbQiY-~C7_|+Y`rqZKCR3XR4(WQ=bk1qI+KS5T#|DR|3?JhT zSAF(1ou^t}lb$+$&Q(c{m8?eQ-6$?*ra&%~>8OSa>-I>TU^IIxlFTS;b*z2Y_RlMc zMFOXiEw}oaEfcqatv$Y;(VBZ$g8i9SV!h)H{O7Yy@*0xK{U%X1l(nzg>Fqdnr0GGg zQ(8}}?cx@k`w(DIa@P$E&(gT^m$ex9KTwxOrNL) zSR((b0tvAx;)9$p? zodk{%NYr>@#ZXkLBGkH$O|NDnR>r!zKRSGyylyks zZZo{s_k7n*Gh09)0I^jdr(WFmy;Z2$Ab`8w=NACdi~pOc>H7@E1L5Wbsjzi&<#NY| zqydnjXyy+90fI9Zq_Bdkr$tHY1Ex_A0KvJ@hk)QPfuXYxf)Ke0M352y<_9H&B!UzM zmCA?J4RmzJD!74G?yW!!S~0HC4U=*QDc_Y1AJD2r*$%aIhu98z&I8{L)2YR=+yhw! zArQjz27SC?B-N+C2$IhO;tLUbk$G~2tnNph>?hs~Q3*8>l7U;8%rbpTw=hL_kPtaE zhggrWoa1vwY|8(8Ldq3AU2tDY0GG$e5>Y%$qbV}68t|7R#>$?VFKWX9f-lJHR+J}L z{00+$WaSo)C&+G(`vqT@C>TX0eiBV+P$+o~ckno~Wke9HC8{Ypi2%Q&=P3`k!&e zzn`M(Y(V*2ZauO!7>SD>xy|sgpe!B~xy+reOD)lPQkU{qwe*c392YEt6WR z8u8H$vKJ1`nRtdZbuFu5s(qRkHnsRoISufd6qPWz1x8KN)bl1?Gq>7N()Qx5%$p`x z(Ch=W8|qq%s%BOVF6(sb!`4d8WZR>uw@uzK(fE2JEprmL6t4uYxvw~jg6}oC>QpWOtS89qhsJz7D~nq(6HPl%fu0~Xoj*1h##lZoMP|u z8V1&mab4uNFiv{CLU*LTdB9;t_nL=c%`mS@g3ybF?dEvJj!{ea!?jCN(P+zgd4(dXSp$X z7IL@?bdv^uF%mUL?)>3pK{jmRAdHDnN}`>gGjJG_?zCL&{B4IfC3p>Fm+Cgiea@`d zOfR<9?Ws4vQgc>anxJVYC6ElHa;0ce@vEaWIw2qdhs>ET4mCN0@)wzk z=BLV+@K*!sZAHZ}fBCqD3f*rk1v4rIQ5y(NkTV+4VHJPF#1Ru*XzEKO*f0TTmHI27Ar)dBH=_1Z3gB}rlU0rFx25c+|MoT5c;1>qf z6+YD8n;Sj2sbKbdh6j7Ec=ArKTiRZVwNg(DZfG#SIqv6|!lyK+o13ktr|)kpeJ+=O z`l^p3PDl`i!5bM8Y@%tj&xJtkeuLg9Zht`Y8}pUmhRri}%2oBw%z}0y$C)Ah*sZGBz$IA#9ZQm$SaIi|z9Onk zFVU*_h%cf4ge(_f;5L>kjSBy@LHWY${!>-!qrWY^CO4#K80PMJXy-oKqVQ*(^xqoE zly8(HARsv)!~yOA8yvhC5_2l9ZxEyqYtE$- z03}Iffu+Ie0VYajf~Lai0w+srgQvsm10qafgrdak1S3stg`>so1tCshhM~sph9FOG zN1(_5?cbZX8#h~f6FypclD69V5-b9K7C_3Np{=O!p+^_G@Z^YJsw}~c4{@FbW9r8zXd+U z_9-XP)Bt!cJU@?)Y7BzVv^IShcX|JU0neOE;bp|mb zy^gU6C|TKnW_&FYE!{hyO2>L^9+yr1FOn5fW2*4aJ`6q5=P>_&y_$z57L zc(p3RliK70&!`IN>ASIcHxb#P+BW@1$jz?YvUHwm>Rorbdjup0A7((%s4sKo{Yxs~ zjfbY1#T*_~*puD!yP)YTyrL6>ubyI|r%v;~;s2Qc07wAv&leTY_cs8Xx#zpZy-2Y8P^zVv#&zq6$0lrsuW>OWFZg{jK?{Y&*b%adHb;3z2n=?z!F!i6RE z?oK#*x0Nfmx*ezl*F2waKa6la;90Cwwa<|`2z^bceN)lC*P!wwWW4TKu@q4LmQ}`h zl#Wz`u!@Re8f{0qhPzvIl{FYLd(4H)3{-SkX=EFxI6rFY%ZSFcab9n(+eQy(OMalW%f`Rb zFhReCY75#+DXO&2Pfd8<6e=?qgN3=P#F;f)HAY*8!LU$MBFV&NL0Mw9CxqscU}3e_ zg`JArXnd@)M}S|w7XO1r%Ar(L)LY=^(WhgSFC|gteltUr2V<8}-9Tz-5*KLChSS_} zU9>qYN1b=JBc8lh|FfU#`<5)Zn`-3jD;1?F{N$8o_VA7$Vxh?G&3foYAmBQ_nA3D=VPq= zdL7&2(}T;?lfUuk$YxnE!h*$ME?+CF&(`g3M9cmsI-eCgUM!!J+U8Eb*^|~ti=Ik% zRbJ@}q~ETBcjU#3(kpr+*{yJB8#%u)SQ+Lc5_W$17OHtni?{*<_XmV_lU4xHeh=wKzuCd>tEhL{EW0#OOe>oI8qi6WrBy1ZG7NQxxQfwZip3nS(2@;9@ zT5gfP%7mzoBb|zr@)vO4UZ1{x@t_eDy_FTJo}PS46xq5x1^eZ2(U3i)+UbF{5lMwp z_Et7#e}1l(%fPpb6X<&mK(&{&j7)NxJDII6l({jOCdQ~{aC`MpW9BETT+h!@26zta zk|DDynKPtorH6+NPe&(7O@PVMsz7IH;!4S7Po<1w3=1P%>;=pUY*z?PkJXc8-2ZJ; zpgI(Nmg&AQ^w75;?ewJMawTR>$G~8*cJW){|6drMyZ=kaFDa%AXYzKk_}v0d_~ z0VD`05&c42PSj65PRFdfAWE6SeGH-0Pw107@)`!3;LPaUJe}HzxFaHd^(mtOg zJR19!bDvK(;WR@%A5KPrB-=v055~;llx7;*g5!Yn{sSb=CsWdH)jYnVV{_S;2rn$r zXyl#8UI?n^1yTQB=jW$T7+MSqDiG>HxFG0FE&nC6hG#2iwBWfjRn%y?82=janQUtR zrv3W4EP~UX;<^^T6j#4)<`j-AX&CWC!+s8sPN10fUnGd=VF!}jsiT4D6INT$9qc`! zqQ;q2x{!UcO!|F$k*?;wExobLu@$|%2l>YQUT_Luck-E0JpCX7;9);8m5yHU2qNgN z^=wP#7sow}Gw|lsLN;Y0NC}~N3F}`Vt60|DodIYu`-H~pME2w=o*?ws$INe7CMPeuB<5s98yEszVY^CPajXIDo;1)! zL3OUKr*WW^r7Rc$%{pAe=Jo1z)1H8h2!U?oX!y|3qj?Y*VeLkaD{5_ePK(RpNdgmy zNZ}YYGYCF@PHz_?rF-LHqo8vTlvt@N=hZsoL$MSw6cSDr=2iu%^@9qKh={D2WZZ~i ziaSQFSJyJ5Ph44Qvhqh22;ELd_dxeO$MUpxsE$vd)!!Dim zVuge=HG=9E{^rw%k}sQ4FPx+7iSH;Mtxy9wUovKh1yOn&7QCqc8%m}hWcEtjU%03A zXEKi>Hp<%W63A8dgntWgINd%OiFq)9g9EM&;$dlYe9M#{NIYLiUV9u<$aA#ueFm!NKZbFX&F# z0Vvxe{C%wud6GO4;QJ^&iRey71kvf8i(yWvO$bdu3?2q!6Src0&!VOzEgbKl(gePv zYGj!A`#>0O5Iwq{@x$Y?{P4SM{~5;T{RAXt1&xSIm{umWOk9$8_2jG{yN zI`olp;shnSPz-(y(lzAW+a-9_tdS;AsQ|>~YyhDh82eu)1NH^+%3h(Uygw&yse?Pv zu6~8IZ2J*rIySdJn#K0-A2e3;qvTtRxi$>BTIu7KaNSD@0|mb^VKx6O=%n^xnPPVV zd>Rd{85mxImg@3@yYP-ILIYowZ+QGG$Vz9O)a<&Xav#LN$PPjEmaKfJNg_Vgi*Cj7k=Z zLImFO)so%z8xk< zh!`3k-g(;Y_Z`N^Pau$!Tb4MsDY5dblrZGG+<>T)luKP0nXsq^lPk>F2+q}$n4h0e zDCi+jroi*k=D;sj52>X$-P<&*snr+<*vs|9;XdQ;?iY^lDlzRg$yV>btQ)Z2&bimr_*lT~f zBaH?h5<;|mZmYYQsc3=^kZ}jJQ@Fx+PPwByJak%6pw(<=If(oS^hzbX_mro|mX6h& zL(GwFz9>k+HO!rOGZ=TVb+8r8h%EPqL(26a=rkY|PEh6~m~yk8AfSyXT;L5ZWV&w; zac51$5P|H(pY(R*{S}=TUQ`uiNAe^gC_brgVQoV6j1i|e7G4N>0rDaw*2LA8VUIxW z6@5A<2e$BTI=?>O^!4R!bf_$CXsW5rP*>XU=x+2ulhYr(D~PIwTlYp!n}gejE90@Q zLFr@bW;8;^k_ClHqjl4m&(D-6C5s1&4KT~l60yyqBwAiRoFRO`AjDdBYMNyRmE;;m zs?knZvwhT*m1nuOhXr3s0xnksU|1q`_-%x+5XcL=6#R+EQp!6MD-d;OtOh}Lp!><);Qar-MY~g0f zRwa!PSYPH=u8GrKWm3n6PjVDl$<1RZx$lMw`Y%8a^yp{H;ZXp_y{WsHHQk0z1}g>| zGzduvtO~Z!xiPop)T2Sfj27-yzYVhwiy5LHD3$r{wm;mCVGl2zdaAu<^#rG&A31{# zA)5xw5XB6F;1gPO!YF4`#`SR6ImXxFcUBA;6O3A@qgo1tLl)igqC{6M(3(4<(Q z9#f}Xy_Q?r>JNr3{Mwa#mU>p2IuD~@s(hz+<3Ai8Mh>O$m}%PS7j4EKAM;af(&lz$ zn(7`*4wtLVG9|N_z%1%KCuu@6up=7BN(ac949mb*s-Qq37(S)vfkQ1XZd^uDP@)vVs$t_kAj)^Hq(;jZ(lPQftA>NX_S-B z-N`N*0`j;3Vyi%*Rxmwe;50qpS}5;{MIl8NA|!AYt$*2D*Dc5_JJ;Y-uKr=i??kZ! z)!)b9eTAnx6e*LLg9#o%IV<_BS0ljQDG0`)omT;^6wF--QZ+JWJhxdRyh#Vpe=wNS zVg7{R+?UKu($G%lx*9e-Aq;OhC89V{W@b|l!-h&!C;X!M$CI-uM5IeKsIKGe&Zotv zPfBEjR*pu8a@Fz>Mf&h=K7z^Vm+zH` zgZ<~wAxcMVimi4o)%4E#BrH5UZFV$UQtYBT-@Nuo8PnbG{9sIK9+2BCvG1PRm z9GAQBfrR-d(&uc?pGX$pF#nif;B?qerlhf8|6G<~L_tZ+ATUw}F%{XQ!A(YPXK<^h zH%hKC%F04J-c7D{ze0U0+QQ-97EmyD|1Ds;>R}d(OSwQ+kXKWcxq|Cdb=`k(3F63E z>|wmSFozr7SrLzK7G}%(^(@1BkS6tvwv+=FO*RLdszdAj4{pJxCQPV8CckL)OmYHg zl}a(vmqw$;nZ9j9*F^ND3#1qJ(Qe0Kt1Eu%jj6vemF=zJOvc3t$-t`!UQ|m`K~`oX z4nA)EHvO!S0)sQiac|8v>ayHK`^B8uftAkB8#Fxk(#XO1$6?CfXqJj)kb*{W>6x*5 zi)kEEKoGsAH#-EXDUE0q*Zu#d$SYWntHEshe}G-}L&pH-Wd*TtAJ# zokGv=`d>Dl`9)}9aqu^=OXMVE7SBZVgv`PhFcijcM{cNC2t>IK2sve_a?y?f&U|>K zadvj5q*=JKTx!g^Grj&JnelKkjZ@QbBh)3}jt3y|>U6(+Ly*T5xsWHsg#NY(bTXKy zuRabE$E%ZKgW-}7zDJ_1QJ*1{^5=h%gh*pUVGY8LMtBDED_=wMnTCBIC>vo7*w~6M^g?zJsy*scy+(Km+}9_U<`U&b$tj03a^yT?o%B38j}#@-M}sED{1bW| zzq$pU`i8o7Ho&xUa)u-Mg@=qwT*U2)g6Z z2#fLlij`SHM3~DW&T&bISXqfQ3jdP|lKdMcqh`0Z_h?-0jY82V=)GVsgaL2pS?lZp z(QKa$RxE`Vqtn`dTJX%;Sb~2}K}>&JaU3_xttz~F-jVxrrwlQ*g>-EZ;*x{>#ThHh7UrUb<@QK_~4(&95 z7jsAR`#A=E(FfF<*_Gh8ta9^qNBdj{?1Ly>Sut(}`Pdv7D=g>=tHhcxTq9aHmP^<0 z@0qotg3t#IlM645)4eX72dFkf*{lvy_^PFMonYT3<07+MobIiXBRn7chvf%VyNZYV zuCPXv>$b&(ZStlXdISNz_A)=RB{DECr|f_R28|R-C>SY4D>qjI@Wtti70^la{@z%r zw|yo9pE7*1vhg`r%zlRi9{~~lL!ClQi;*D-wVqxs!CXqG?@UYQ(I$s@K3??*-SPn$ z*eZT4oo(&#CGXd=hy5yxX}#`lb@iEWy}X$Nid56iST{9b=gWU9D_?mQsB{_x*@ zQdHlq`dm(gmG$mu-l|8FhC#eiM!j=(rtplDoA{6?JnqTpKxpVuPX{9k*e0QWVv|Gb zutYVUMVfYPTQ92ok{;KPem)*ywMg(u($AbhJ zQfBK2vBrE?#U#9$*-?S%Fo1CK<|Iw~_HBRt%l)t=;(K&4w@Bd`7u$i^BL`iql1w@- z5O^?eKvx6?q~un!EQyu5yx7+Q9nUhDI>8u!H0EfQr~cmXwUPts^GmhZ>rsmB?k&Um z=JAqCHvzBY%$*AU(O19QQdQsnnvjWxODx(;jm;ASQw2{jm;ws#dcH1$@`^W*&X3GV zDAlH>r|%1S<4(HPgoL5TnK#$MM%{^`S*!kuHm%oIwsNv zO3LJXe{^)HN-AW;g}eLe7|UKd3BHlXW%WSNy_&TJ(aU;xAhl5&BCg54GiIpCTF`?9Os<}`_SA*|4nMwzI%Xn65(UCp z{@{KLa3~EFU%8mULod`i4MfQAKgyUcYY(AtoL1K48l&9j`HjflcY9Tx`m^)J9d*=5-N)_L70_I`iS8;h<)$%AG72J^8= zt0Hf0dCcrF8RLcFtLg_qSaztehx08hTrajVcqDHa@~m~uv}VHe^VZPpN87v%mQ@T~ z5QKNn%}HHZ8l6|i8jv;wDyHtes8IGF=5pD~#MoX`pyV=NsRIu?fUj6EXF<2~EN^^z z9HZ{OForH2S|6Cz=dzq5Pq<27unJM;!-q*SBhKjRcvu-aRj1SE2pM?U;UpW#B= zZR>~kk9``lUUt<>!>dloVb8=-_(VTlThU$Pn!CTJV9%EPsvTt@e)P`S^=bL9Rzr}q z)mpw41q`dLJuxm-5pP*p@=|iy;>-H7xrGf|NXh_-Ma{6yi&nm{fxyf)G;z!Nv8JXK43k7fSm5-Wu;Ug*ALXSelXAf?PhigK|n!EV;A!kbiQq4c~Tl_wzR#ajmr}EFl6)oZ$ z>teRKBO_`(8nPv7J$(oMxYBIGXVG|%9tpG}GBf#(B-Qf^B0`o~>TCQ%q9Njj4+bQ& z5;MOy2^k+}%F0vh_sMU_Ukp^lice10Vk;hzS#*JaYf5SlVLvx~fAz>E*l@zOLVHTj zviQ&+XEw84_o($$!$Znqqt&daqo;Nsj{2Np|7D$`fB?zy99Ji(=Rdk7AL#>FwcZJ-XnB z=h8#X+${5UB71}CzW4uwVunkAgN#D1k)SMmBwq}ekik0w{#?_|N#B5(-Pts=t>oRr z(-@fPq|nVrgX@T!N5FfcW^IdkD`}-EAx0xDO12!{nBow$-6&(6PY<+O1+%Z0^ND@M zAHVB#7iDC;`=$4G+ipytD0h6KshU60HF;F{4)N(HvQz^6Ngc#`mgjfKwn|9{o*<_I zv?g#6*h-^L0J%U}h80jC%r)mwqbaI!8}p*5i}#wd%1`#5r16^vw0lkP_Kpy;DAYJf zQ|yGCC>6Nh#2w4OSdF9zJ0If2KqL#v>=4zHa+vs}l7k{T9a(QQ#g9_zynB|tXrnJz z_`KWn2BrRRWuoQR>{l2C6My8mczzc~%Lv}Nadc;%m==|d&q|e@1*+Zh)qUnR^$9n|C;KAy4 zm}_gAS`JKRR~`5KqH_gV99%37kNhyP>8){krp8VFG-ngTtMiC)$8mnn9Ck`&7FlZL za_V2vG<6KPT9gzu^027Xzfo{lUoeUtXQ-t?o=B=p|I+U*w-Il9liAL37~xI~DcS6& z#stW0?nZXpX_z@$Q))#;<&4fUEsHOAVgNO~7oz_w^3^!b1W$M?CtcB2G1%QycfJPm z0EJ&~CP}Np4eN5|ewr5G@^Rmb=-Y<4hCthNl|apylJO(i;_NK{cgn;Z)B_}YdcqM457nhgV#8eD#;FtF?;yiu!9LQ`WuhPzj8 zZ*mA~i^IrzC|xcysVsASS45U|={ylB4Z0o}N6{5O!O2HVacD%T{j;=Qlj-DyS_UN( z`|jNl>3AR3lwECWDEaO$t@HKD%tuJ~vk*;%*+x}1-!iYer?u5o>L|zlebI@N1%E#? z_y>y#@Y+W_ssZVhjoP*Hk~*6sF-{vPj&_JSkqYD}2bc=?2$U?FB%3BPon~F(mH*0C zX2g?XIS8?B-Tq?N^A=0zKP)b8#%BC($04WUq#lM`4Y!gJ!?L>8fy}DG#G+ETtzVm5 zYEowAXG;~4ehgjqK12;H*s@VG;t+Cb`(@*fK71vDd~`RT-&y5cH_B1t+2!$-tvI*E zQcOfWh9%2oPP@?36l_z^MamE~^@)XCY;mcXD4KAElp}kW7+gI3;(q))bmjEGUitt2>TQ4F3vv2nhLU0F0<>!#S!gXAgP_VS{a@%;0IwEoy z997(%30YC={(23am;4!!KJF*)p<>qC=c!8~VdBNb({1w|u;!Xa9|tE6K^nsdg`xKkTmNzfog;!ZE0D-8rn?nD+`v*=Pa5t4V9a| z>^4N5e^Zj|?AHcba|Sy2!cbO;#$I2lSlwI8vlppT;_cr@!VT!V83`0>F$_br?F@}v zg7=bz(U3vQQvViG|JH=;LeE0)$|pCAb$L!;sZAY{p8aL^ZSZ-%b?nsjUWq9^w(wls zLMb|K7I|Nh^LX;`_U~b>^PrtV%(CaTwN6qaWBVB6(nwu`r{h*b-@m$7>Kqo~G&8K_#$Si&JyPUi- zea(z<;(0EcMxo35L_Og)Gy-3Adb@tj`slu}k6 z>EAy7ckRxRNr4ro7Q4!c;Tjz;pAd~r-sr>6fs%c!V2?DUeJ9*ijx|Z3*uialdZKX_ z#b_Y+kO&f(19Z7^+EGo3k3$tt{5{IeV?xPYAiR+-v0ue$17>>c!O#v~Oh_1Z;quf^ z&DNo>7mquykyJIyM=7~IuF;meI;2f3S5umrDxqgyDfX;Yhj|&~US_N|4tQt;5mx3N zTA(d$;`y8olFC5zj|$Pg3L86mUZATt$9Ye!t-cCg!9B@#0X{Ef5nMGaO$XyZ_K#DLl%vJt-$BT z?{D2MJ*FZX^~f26jnmfPFv0Q)Umj^CZk9Y*LvZBI8B zzN^k@&Rk2KI9Q#5eE}^m)OXcTLH>8JItt=sc}<1d(~A7h`B>5Xh348dea%#g+|YW$ z0Z96-G0ul6_^w(f@w+2i%FlGhCFp6&ngSn0Js71)HmbW*B=6FW8JU=PXWV!7p%V@} zazv!L(QbTqV#L`tB%y_{HWr><-y+3~J5`t}ZwUh0PI!^)dl^|am7+j7Kd)OTN^fHP zh7&LFX2^H!54ein(H=iCYN**dIS^p$@V5FGS%`Perepr2%shP_&QG|F@F;-aBmC5| z2gX`(v}CGiVyDXP+E}(2wv>6w*nz5E0@odIn!l0Sw~y;f(c$T-y7>Eja}i|qQQDOqNVy{HWxpg0o5dVSfzn}k&9=+?)32HYX~!phncSj zjZ*=t?usW;qs$-sNUZPZth&4*S>KVF4^6cWO!_;|e zd4#nti-D`?vJ90>qKk{`lG$)D^gt zHI0o$(e>Xe^l`6DC#h)fiagbxbJDs5xOARt*mV#kN}h2>%oMe>^Pb7wy3YyduW+CI z<$jXhTMeyOF^4|+`GsaaTU{(J$G@Ow+qx|C5S`lhg^{?ry*$}eTP2sQ^m^~n5mvfq zugiUGh(YGJP}Nq_hq{2?=oldHa9=syV^Z36W@MCGUzUXNTlz*(rCJ{IK1_Hh{jlK2 z_0oG@8`#J7o;+Wz8hk(PUnk_o^)mVIzo*_`atISE+`%R$TK;t=9IAvt8~H`R7?lT& zulicR+R67Oas}S_Ev|tobv*tXGm~$&3(wX0d~8uGI+au^?Adl&v?`dCO*_tHWqep* zts_AuGT1cN?tDMJFUj1;WBF3w+!FN*v5nB8q(T>kkB&S~$XOkN5g|7Xw}Erm6-w3> z4mZ^yderxIZjf_K6k!U+bCdiy7X~$~Ct9r?B`1S(-EH6XAZeps%nQZgdl5Apv7AZEp?SKv5E2pZjet1rrkuuks zoL?w_@o~w?(dO!L^NoLSa&-&&QolvMyMrF$4if6Hg}Bz6JHd`{|I8M{rSbQ<9cjg; z)~R)hR&k?9D-)BNo|sTXSZdDpo_k`)hy>f2-ln(o>r-YC?8hkFkGg26HGa5%Mec9_1A@Bu)nQufr>}{ls78zm`LBl8b(4oyav>#A~IPs_OX&bb{KgE)^j#aXN4X zYCUdnAdSCeI|8nI$zUsUUD^9Wr3r=Y)FVr}46vDob*Bx*kp(a*;S`XUtPMUAUKBe&IM~zWTQ{Nn59{1Dyged1K@?5DV&Fkaq7>t_7L~cq zo^N5C`mlv#82%+D8_9_c-W^>2GAi%>9 z^%q%l_>g1Oz#eNi3mE$gyD2f+^`1u$CH{UU0`~hZBllGc@nJ?MpBj}1lOO+E? z{H*v9uP-aV%|c9%6|gLQ%_5m;PuWy-n-Kp6Sv_k0%q|v$IrW0qK9JnkAFD^7pv#@m zbMQ$VJB|0O0ltGTZ&mwswDA2dEkEpcBP|~}x%0h@5KHW7D5z}(WgJsTfbX*b; zr-Va-ku#`Ob(A337&?iQxgU z*IS2O2V2~q0X#2bw0S)MRso%P$Vn#ebYe5|QB5*;uECDV{fw7k61ay&L{Y2(wbY38 z>jbQbed0CZutE{be}s{Ly_W>%aw^I#`eSL#RvV6QDs4E9kn&HN!Lvmvoq|6>@Uo6xCcVp{yzU+ls^&Y9q9(FLMVGN zCa@<(2MKW5Phnp(2UNhQ@8wYMKq}+FMGpzc9dOjTrM(Y$Fs>M%z~0ZatrVVj@>>-` zjI@W52p1NpyLzaC)9NUNKFKEg*gxIEj+~64)g~Ri&9wJ#>yDZN7dOfie6Nt+z+G~E z-|8%e-(Qo9wEgY^?WLEMa613L81&hIek#}!Om>D#BRa$1h7S5v1{!^iVJb1Kf0`m( zK+b{KSlI}gT`uG<@GibNEIH8a*B!3*K1PxURfbuktYsRjj1UDDRLKXOU}gm5*d-AkUL2o#a4z` z$6WBP={a&bX8PawZ_-~VQUU-5*E8R!S-|It8Z{}Jx%Lz-i@Br9k>Hrzod9eeHu#(ScIh_E<$i)XH0{;rK8 zF4QR!8bRDZ^^jo&>bCWf2JuPBcBA6|gztdH*a+f8<5bXJLpQyyd{8uS+mQwcM?D|U z;GT21dkPqjeD3A%i#=|ZH-^*rXVumbCb^v{F4-rAnHQfjk4Ww*YAH zYSzEXJZ3(GH~9aqea}D5oR0N0eKx-~y~Z~CSy&=$&pvfcKhGSEqMBM?O${0!EyGSOk{*p`WiYqrWMo|_ zd8TBtH8EjNROOe=DRsl2o|&bzN}rB99X)I?W3W_<@1%QJ(3KshXbQLIp3sHOg$v)W z;->Mw9n$;tmyGp8?-=GPo=Q!kG}v_)rr%Od%rHK>o+SRBamx5TA4xT3G+q+im+v8x zJMY{#hxu_~^hl%wbJq3QH|M$X0lXOI1Eq?U{~UMaN-X2b5Z1HOXc?*^U)wONn#R|3 zAZo!wzW9Q(fPQU#dJ4QE zV{tm`BEjnxsU4$>HO7(h5T)hxW*X-h=IhbK-EMaFN~NU5zLUpG_Af0)E&h>Y|2_Dn z@#W6#TKx59S{EIo*dSxKT6D!~bU%qD(W~afEtwQqGs5Pd)1--3THK-r{nebGKrX$n zG2N?|Ao?ufSaxPjcthv{LCQ6)11WZ#Ktorx?eg59cO~*CC>PNaLkL}R?MnPxRM{Ew zd0(7!Y*VC75Y^tf_M;PQMN(HV_VPi#CFu-0Kf{QpkN8Sj4(bv2*`?6EB@iC7C)e<% zMQ?WQ2H4hi4}&Zf@AWxutW4%`v*0x(hr6^P&g32u^I>O2W30a*JoWglgAfcVcF0?s zA#utwgi0CCgff~Ou@7ONI#e;e!4xM0zW(#i%i4*d;P&|p3NtxiyaMAjDE=?mQV#Az zQ-DadDuaIrv*0M`Vtt3B2cT>BzwbCa(=)|;wxvC}~pn4JxO2MGN67FDlC^FOBY)hM7ySva9TG-ACGuS-ULx{!$@DKPq|8lM1ZP z6LZKDZlSK%;a=0`ZvVmz@mj5UB(GZ@!S1j4M%p$8e$~ibRg0k62#d0+7@|AEUrHB> zHHF?zX<_pw+W=BxT&nCnGZbtv17h8F(gc+%>05w)_(O;>K3km<^h_{5#J{GIn0QHv@AD{*P9lxsbWI{dz$tZBKcZfqFH3>8_G{rz`!dMwJ93X3(SM2a@%HZ7oiFE4nF*Br!n$bULN+=vru@Xu??*jRQfWx-!8muxuwp-c0$ z+?uh{l=J|vdTfx4j*kDa1np4D_x}Yj2G9AWW?$x5Jcq6Q7PY0X-nl^TDwZdD*3+7- zKr}vdy7L(EyNMhn%-%LzYp$9ed!I~wL8g03W;|2hQst9sE}kb9-bnV?mq%NwaX7zrPMamDJg3GL0~a9!^oYrh83)wPRw1DS&Ye& zUuT+&`RczqFZ8uQsVn*lZ#mQJf!(J=AY-)l7y=7a;}dOTxK^ZH(J z4mi*r8$}p%ucaP`vEn)g|Mui(qSd9ZYJR8!^b zEzIdx*Ykzq8}Ag?(^3m$nwQTp@~$!$n`s{GE$LJBB*hkX^Ey^DQ~K?k)wwuRW3%zF zLJ^Eg@cBI|zYMwe6o^X7PXE_*BE6vxFy;BaBI1ZrH=lrDi-6&G+TJWC}T@&i66}n{>aX`o|t{9K>+; z881QMoyLUQNZ*(9MOm*3lWjE3&I|qXYP=^=qzO+oHrbNs*0MEu9r`TNq4gQxayBKj zRb^VWtt%;sz9VRa*N;_^SS%#d^OO56&p*Q4(eD&$6*<${-5V- z$t#|&F%4DcYui*q*RC3Bk}li2XZ>5m4)W>3oy+8SlQRq?Hm9eVz9s0dthpC6qs6@2 zp7lzFD=0}W5S{{Z9d~5Ti276FgSipvpX2SEe{Xk%Hx1Y31&zGKGoG2?4Ool3&M8h5 zkMYj8jwk$l2b%Z-HQ{p_cZ0QLjZ6CFwST8?F%sPK-PgeLSS_Vteyi`PHnU*qlP4e-81?+slqXq>zat%Gl&w+Svz=(%vy00q3WoTZ#- z&3!?;^O$Eu*){06fG*0|8n|Shj&HdeJ3AtA~wN1cuoZE zy8a$HUy=lpZmJ}YoLpPbsbyqd!1@{(RfkNj6bGi}1U7rF)Zgd|Cr+LT^@%>V9Bnbm z)^hB)ZTy9-W%m{x_WU2?J^GnadF2q5Q{9A%O>2S^eeZnU%a6aX;S^kH@0Z}l) zzjJz4tDO3MR%F4GR;W$%XZ`d;k|3=D+l8zMOlLgN;&tUby7HJcHQ8jvWV1 zT)6Sz#YY)_0+bUZM3@LsDyXE2YHFyZj(Qqsq={x)Xr+yII_RW}ZhGjYkA4OiWQbuj zbPPrq#Uw_Y1WCpiXM#zlm}Z6)v!ux|N0xaOSY(N1R#;_?bvD>!i*0t;WsiLhIOK?9 zPB`U^b1ukc-zgsVfcTh;meEDr3sHGNDW=Qc!M+C|R24#7|u#&JjWgSJ{6twqvKB1gCd5=3GVgS3e&Fc{4iBO|x**23NK zgx9e>zi0YC#p^`kTw0Q|$_gPac`>(CmQt86Nv<)Dd6z7;%}Qh>GcweaD#`3_T+8YM z6R4yN3osuH8?bf^2e3DcD&R~QHK00RxIj%YJizTUe8B55>VPl55EO7%h&QmysxamU zumOgDHo?YTvjsL6ni6b{G~1vYYDQo?(u~3Arr81G@sBx4^#-2^UD0bu-}x&CLw05yOmzzSghp91;6j2XZJ;0CY-7y+FBW9R`I|1r)0 zm;V$F|7nN;tN=y;^M7FZ4;%nC0N?*||I=sxPyhcvHUJ=^Dyj7UOyhq;C_q#*KqLwv z#t-1!K%YJXj~T9Mj$6t)`*{14s`DDtGZmO`xD39)&i6&OgtIeXzFGr2lW-zxwTDOL zB;*?*K|gpY42p}^RE>OXJ%>y;E`2oz-=J^#LR=Io6@kTns^Sk z5d#s|>N?oS2l~m2fkah}oG11&>e0|g|0Rx0N*t=TM!Jm@!x6=+@yaOT4_U}BIa754 z9=Jx0#v08EwSKqx$`fy`9=;V@KRN8_Ne0?KXU>8eBiFC?srM5#Pdgq*?gihJ*m~f4 z&pAGVTrC-Lyl8?7Rkj;N7P3g#ipoux&`==ywBH2lt(LWwbM_|a9b zdNVTftb+Z0U|3zZcs*4FVX+U}ZZ;Gb6wr#F5YSma%q9hn`gXHk;J^A8sbSy;rw~m; zp@-*5{j*_1w#-dtI3O?vqmzCCtypKUOsS-|3P3N0gVJTlLYV5&@`kITA!3^SKysx> zMD(Sz;fk$=aO`I|>>mSjI;Rj6zL*GV$>aN?2D46Yg~&nG7=1-%U_B#agw!Vpa862#$J;n8XGN(ZbQ=FEE%R4W^~P9cA@Cc zq|8rv;21qH!YEfHCk|&9cTQexWPei=ikMk7l(Gl~8XuY))*1;PDd?4{0gooKY&e<( zk(1ug7T|=c6AHN&yeo1Fc?0BNi?=&0YE|`Mvb3ya&qr)Er5ubIVx?(8T_-%?W42&@iVAF_&=8DKXc36OHehV8-3R@w;AnHVegcEXmFaQCfM6Zzm#n zW=1jIDfg+k5L_M4$1lOG+&KoaK-!<%j#>$Ic#4^GUTH ztHK2C*1Yug`O*BswCE>jO>RY|jh|JLWxCA4rjE7QVm|f8oS7!K*g%}zLdDj>*9b^1 z3nLsqyiOYzkbVd>g&}G5al{WI5;(;Cu)XUe8R}&@pT6s8dj63(CQ5`Pg*OunHzyeO zBxL(9kPSXUQ2b7>ku|NuUn5vM@S^8Ari3;=OnCk|ADKTkxJi!EV>mh1HPN4h4bq$ z5MGRJ1~8o0ob7-Zsheqd2u^%DjAI`gOr)k>6H15(ACm8F!tBp5i|B_}f+1mza-4Y7b7XXR;=&$aG@8-`&otk!=o-fCJj zrK>TiM+I59Yp&Sl)9hAS^I6a3u<|7oq~Q_}nSDPODgO93+2}Y{b85}Ze!56e{}^+- zYM7eI$*bIys)b!5-<0Ss6x=qlwy7lna-GN6ZkqrQDQEo<1v0?fNX3xx$y=EXmXUT8 z>S1)sI=jo_NcgcOQPcP$5AfWnK3ouI@Uy>6P_YSu#jQHETq_9XaE;l`ok27R8OO!e zZL6FoVptN&TjGmbNY)psONjb}G4HoFB>9)2(gr|X>ZL(cgCf*&d*Uy-Xiw#rQ@P^> z1=Bo4)pJ$UumH()Eaze@KDFc@7_iV@DkMQ&u++h5P(lwSl!XI2ax%jRBkWv?x*JKG z6-@2HzmG&!z98qHA3}m1iku<)L&^g0IQ|^-vHPU4hsM#+amuE z$4`{0%>;{j5M_V5Ih0g86q}hGtl5E+3Pe_nTTqO)1*|$-brI1fuCR0yV5;!g@HZte>Ny}xH5 zw%NUolP@N^>n1q@0yIt}e?7Lm*l^TRzYv>$o|NnYD(9@s7dl@jQ}A*qiHR42Gp7py ziM~!LB>quBhT&*Q8`Tj%;&45UB^%nbfvyt-3)@0fFp?KuWyQ5XWP(+A;9(5&Jo6KY zWZyZKxLcuajSS369AdDpn%f*?qh+S!La;@V2;#j_GyQ10i#9vdK{vWi-^YBl3%BL|fW3lk7_)w*TWyft_c*%%_Ub3%< z+H?&QW{sHA2!8^7GAmmjCos=n_zUFg!udmE=e1Mta4rgt&?#DqSkau8?^{Q{djq9N zN>y6Gr?H3s77!!{+azUD8W~p3^@KV`SVHe+D%yD#gM=wxP^?VC=U824#A*EOp|K-7q=Z~!)=4UGw1;Deg%&WY#@j}{Bj~>zP}f!^em)S>`TK;f5{<@8ip8u}^Cv1nV1Zga5XQd4Typ|*q2EL< zmVAt<^IH~XxrO98M~WIHgs42zVh5eGb4`RCH_Z~2&_OTjdJqCgGKhHMgqlPQ;h1h$ z!#%2VKm~2!0$mw>rnan+3--;Xi%d$nVg#aEI+?onwt9gNwuD54B1zBXXcadBp7c`5 z>Q4r7Q7GcRxM5%fje4`z8uQIs;YwxOlp;1K9HI+VAEOHkw($nw$ww3R%;Zilr*=&J z&`)ba(l9+LC6a!K-OWA`&svKYfcz93<7#R&hbBLJur>rM#g`Bos>V*q5BoC>so+^l zKu(#Pu5K@{?IAb(HD>`rA-hKJ2LB(MQ9h9$DfT>%)-Sf?NL(V38w6BJ*fp`n79$YM zZ&_T}h%d6oEtLCab^B#hbEEiQx1S+iB@K*a=N z{6G}f3BuDsaUw_aV2S#{wm}?(dafWdTIK_i9b{7q#l?Rq&V64@<)8DHk`>##FJ;Of zCwiYB)?fMz>Sq!xmB+KT2io%a^H5eGm2Er8Qh^5>GLr{Mn$yG$*oH@|Du%1g+?&H| z=uwI&#Q+BLgs;|72{R5SQPNP0W&xJv-{JyBg4TZ-4Q}rVlfP}o8gqngzr9x2^Z(A? zxprw&%+fd<_uHY;XYi(nFE!K&ocX{xZes`rR`3=h1;TUp4+#ZP7us9*a015=hO~Xn z;TgJ86@iT&OxH;}bm(f7iVq|izSU!A#QnVz_n0QNtgBVv(@OcGd4LYM;XKoLg+LF3|H*RV2U=IU?t= z1`tSyPmb1D30tQGW3dfPIhV=AP)3CRQY_`*7VCsJL0wt zoX4#-SxCgb5thf9LSGg5!kS1NAlFj;4&s}Mq4{`aM~f7~8yjUM z%Ua^yum>xcs7EIZ8z0gw%r}ET$KgTCUBy(Ese*zft9ae9`q`5sFe`$fcso=+5nnD9 z;su-Nj0vYxoX5mz%ryyyTfI1A=T0h-XE=`edWJA|TIrCXfzPQ6YU1f!rUNMyiJ<9k z6Uuzi{axoJ=XsTN`(f~_+y7PBb%sO{SinHCfiJ2Z@H8d>Z%-Uhs?7A3ToB_fSzwHf z@|1(3ud$@hUFRBy&Y(7|_|8$fZsoe#LzPoFe3*gU?5nK^eD5hyZ)w0)MheCboXskr z(~*^jk3>M7VFu9qc4Dvq3d|aatA!C6G{az)PslnSH>5He%gmruEk@6^p5`PE6RMz!W${{BBIF!7r00)%i#cvt+4`_Th@w~ z_J{^bM8ZOlHVAk10>{UkxG@LS5{5%C(P4$ZcSle4Ssv=KpL)KRIvZQ0ot35>v!+wDJJ>KHca4B8K%=RGl-v%3z-oFqQwl3}E zxs4)%4m*o99W2zI>jGKtk%kQmUvj_Dn~z^wzN(p=o7v__kd2Yx@r@+i{8e;2RG4QVDtZo{eHH7cB4hXWmho zF`GN>7!Ky(GDrj#?&BoRgGX&+J2b_oB<$;g+rU0Hvr(KnWvJld@52*I7&j zIgL4b46eF{$zO)ZjH3Zrd+R>7MhkOf8r%$*iCHnq(l?8?F|M{P2CwkLj0F{prhV3wOlnqGm87FO8?egBb9|IFOkN&jg>5OEvHVqK zT|wUxVtk+k(H|zT@U)Pd+;XT(ecUL6viWkRAB>_f`=Zxg(L+Ge{tAi!_GRe`Cw&rQL#ngI z4FMQ-PX=mouZDCjtJ{RX+0V=^KiJGq>9V|+LNxgeAxGa-aSjmWktylve(e%w{*kN` z2?+)X6)6%RDktxeC=u*@C9;c|1*_FB)E_Dkrx=3DNuw2CD6p?cpC_fff%nBj#aYtH zn4IJMk>pPX^6yyq9(hyPLAfcyGTPsjOQ3}|d2r_$(dk!BZ|Ze)iaiBa6?D$eFtKj< z@-hVNy}xPkwpQhmDAVygLUq}+Qj87Q`mFjP6;!uAIYj*_?Y52zZ`G6-?%HSo^1j{Is?O>MikAJ2dcubR@EM|R}h&xE( z8PXa|nk3Kg2>OYzC_U9SaI%3`&dH!-hCZQCK(_p!CdgGf%5!H^;Rt_*0|#QPX&W3w z_I}|k*Fk9*%5bJx?$7cm?{I_F=P+XSnTi?Nry)yF=p3HJEmi^hCc(5+z4Zx@#)fi5 z>F?fUX6bd*dRx4GwQvQyFp95x`x&aF3=2jZ6a*>F!XND{*HA0-1-|qbSZkh`)^Zs> zBOz?VhNebgMSK!QvX%enO7N(y2OAK<` zq*7V>OpUdGrXmeB2g3G4LU41jKqq9Zram}^#aZO^fsc-9zZuUZwgZqq?#j`n!nv>_ z3Z*Foj*cola`47c(5444OLVS1@cf=fbsV@ZBJE*rF=6Sgk-%QDs7ajfyP~oCmL#U!8 zQLl|ySkn@8RKSHabQStEo-WLrE+{@EoIGzd3wq;_9IFEC!si zdE3g+6bM9@(D4(9wS|n*1tp&wFcV-+arDlMzhVM49XB47YvMHGQ0m=de0!E}m zYvMi*sh#rHNhB~7wL1Iv5YwRKcLg{(idUdEo-nXe*^55|dJ5s*jgRLYj-^PiD{oEz zsmrnUC#;sF7h1{`YO>H*u2y~&_b*#wBW1I1s7O+GgywT0hKwN!_kaTSa23k&Oj~jz zQen{{Y(4S`K9}!q{`)najeUO_QwH!WNClOJ_S}o5%|P!sUTDc={cAN{pR>ENfh~ma zvh@(?Cse_I6f8L5Uk&ghFtk%gGvO8SJBrtDk&K;OvgBukp@xwA3$h!R zJY1Pz<~hc^jo&aP4khDO854zHUcJOunoC2J-rndG)m9m?^NKWKazRq2rYdww?`^5#WbIE&V+o83lDOaX zP^GISfbH@LCDyG_l~6khrP7Jbo`~{@5>!fDz{anEEJ6~1w+Q5iU8QllhaVuTTnW*# z0Ka%lTa9htkU02qnP_?gd4sqdmm*#Ibx!Bx1@NtK7n=30)aDR?$+>|^ipWh1k`U2g zEHo4{zK?_&0L0?zt;Z-yYex&dxc;ef6_@g6d=ylIZd?>O%`O0+@`6cxOe!}FX zQ52gAXx${H2kcSLp}3N+9gs9IvTR^_DAM63ZY2W4MtbTA42`60MIx`M(K z8+p}5Y=J!@*R;gG<$Q0=xT2TIgxIgI4KvcOJ5aC2@<)pgRBMfDgqk8*p%EW|CV80y zi@rg|=rP93mf}C{zZ(#zpHy6p=fIDKYO+AGY(}xm8Izh1FHD?rv&jIhV-+nj3(H{PLgpZ6-G}0IxNoGWFgglp4pko&hv2Fve_4h&DJ5f~aHA%iVfro{V70+i$^cWK z8MsbPcbkQOL#mXuAxIlbC!*mUW+4y9OuaGuS61pt6&RgrV%ID3MzYkL_P8A@`HXCJ zdckgbm8sy_t*Pj1T@pz~_Um_qjY767L*D<~5Ni$^QQZsw_CPNsQJ zOBl!bC)_U~sZWXwz(~fDCfY3q6L~3T$Rx87_F_iXLSLgUjFb}mA9*R5NQ~04z#~#0 zx7o1f`~(F7nS7TzecMXPYndJ4YWlv-HAwbOEk#T$3jRyYx%PaqpX@2aq=RQOy8C$n z^c0}u^t*)D%$xTbQO4`uFVW`(-Hd6x)3}&xC(uXBk5Zi#@s+8+J4>ukZw-h!?J^WT zBQTrU`vN2?pOm4xKt?g2b6MFe9;AvxN^dm;{>>`iv8G@a@@8w{Z;UDZ3@%;Pp1g@1 zD9{~R8V2FKMdn5PNrA@guVpaBKl7mXJAx+I>I-GbZTIju<7Uqtttaxa?mJxJP&-oS zte^8RPniY52;to10XDI8EQxDuSz>Zl0UNXm9N(t|Gpl*;;^&orn>ug+-_X|_!@3tN zrJ|nU^yUt5DvWUp65bJ~SDRzw?_T{s&S&Z1>Vw1?$7w6!^x=tHSDD*ME}y$ImLZ>fn7lxsiHQw^N$vGac*EDCxv zY_X&1{T;DvxqYn0rf)=3L&pJ+BN#+0txQ#IFbB&_5W`7$x=<0Tcyw`%EQeZ_7-zbz zQJu00vbviK1A4M0?7QSAwrr#?Aw^j8T&)lqS(3^qzj=>g(n~1)$J7-nVVyC++TC`TeVPZPJvN$CNXiWuS9?7teGiBdpGvJrB z=(N2N3=7j9{D=q&qvX5V6;S}{^jj{yd73zD~Pn1llJ= zL~%K&`bVh+IZ6CJOxfE>|6 z>{S9>0UxsMh?I3Or(-9lLYAS~QNdtwe!$FIh&-D|76v6|eXZem%U;-;Q+b#+*wASL zV9}Fc9Vm!R+24NRmr3F}DVDhCPP zklnag-WkNPT31#l2xELk$Ywo)^E4WtO-roM#S@v98*pNK5vnM3baOaQauArBOd)Y$ zJWMMkLuHfGi4nmFq%@$ zXz5DT;n0{i*-8r9&-`>T-C8V`K~cA(#hXTP-|(~it)c-Xvi48AQw2jp#2?l#V;cpQ zax9s#8ig}<5t`C`Ui=}r{%*b^Fw3$4uy|!6shSRFZ~vm%iiJO&a#~JkY6vIi0s(i) zt3$U>qMBJ;vrT|u!CPQca!v|^(7(|{5vP=TWvr83w^0?O1A(f^)TD#ZHLfUL$Vj47 zSXUcOu_!qxr?gyLlbKH$^$2hO1i*6B{npvbIYq-^2h|P!(cex&p+)XD-aWg5atL-~ zvaHV)GM3jnzbg@e44@_dIeFN{^3a-e8^WW_t^N&xk~xRKspwLi?B~25)^8Ie#}()* zWIK(s_$!X}`gkK+$mlQ@5jCM)S}WK_Y0Qu6dDhY?X^Qf59O>B8$AJut5u6KKPrRsL z8T5j_@QS4Tz-o!Rjfqs#u0|=NMzf{jNkbRoo>VfFy+Fjjh?u8o8l6;FV((2 z+x5VhA8wxwZ^DNVHQMUGcLBP%yucFM)2*ajc8ontanY7C?^5fgf$9gj_3!@VanVg^ zWS`P@fcDtX2%#p>W(&<|%3lr~YQUXn55pK2n3$E^3b8$q)>#}>_ZHFMYL}y_lT<1t zwb<7Co1gTmu%UkK!8Rr?8D}`Aik0T==S>!-?RA>Dhn+q*f23gPT}6;2l=3UVcJqyd;~(y$`r?`&%4rkR55|b-8xjLba}N6T!mI z!@h4XPX{hKDK9bOWN7ISdf!#<`PRO{t2NX*pk)y=iNv8o8s=1?AKi16L<5!xDol-V z4gW<>#a%G{iI@l?aSjjAev=)I=|31hG8hk0aAJX;A|bMQu}YoNgNt@`Tf%gN`Z14F z%t8qL=k-C9>cZMKuyD$q2hs#K$vHe4P%&jtXUDwFw};Am#6zrZ7z$gwkW=L~imp@D z-MJ2JR8N?ea~6uW`sBpX4x<}hpSEOvUR2NriYz+24deWQ@;x+NN*XSiF$yR3EdDI? zb6EwFhC}UE=6;#g*e8mL_<$L~>u@TkU!X}0#Qp39qbPIvIPH?EaFfL}F$S&!vbe(7 zK`)t*#l1g+Z5ET3Uv)2;N1${Tlq9%OSQS678kG$pEWfL}UDQhJVlqM>Ug0g+jD z3zX5lKZegDmEw@%%!Zps6pQJh$C&D;J7&H;u_8$3#=2ZbuX^}sSm<5)tDCc@I!p>l{lCRUB{sb_hMpI(#(G(Yt@ zYQbqGX>xyq%~$1Dt!jH1^d}oBfS^nxL=WG#88^rO}NBw}(!6#EJ;g z$>&Y7-RsY`Kfct->W}PnWn*NqbPkt}npcT2)8%Tp&n0WUeey%Pztllg(#=5qA3{p5 z2s5cD3g2dZ_{(}z<;F3jvojUrU+TgK2h`_`ZGMs$$b_#-L>zF~$TxVbLFhGI&8$Y# zyOnY(*7r9s`G(>|N;{YeMq(~;2ScDUKN4@oh!sHy|JB!G)5qL1Z!v)tf}9uT)jbs{3{r7VDFW;cQyZmVAdzvmEkR+@%gFS#`IA--(`M%c+sS86b;4;h^C`R1-K_yW7_|yb4Fo6 zolv}-&7!DN^I74cF7s!^=`21^C+iIzHvpsW(A4B`wk+>H_2~ARZS!5pha#QgzbJBm zRbLqtWgtyi_t(fCqr++z^6^)Te07F|%SwM1JvHv?Y*d0H?q6> zPB<%draX3tAp~@OP|94yI?}abXDzXLLn9v{N7Fp=L6FdGdw3Ar!4P%<6bc_X$35MI zDw~>5xyvik4MhtOR!CRoe>}Zdd~bP99;kDmZ{YKI`Kw!8C42t7R>{WzH+>Vto_ThX zVJreY5^XGI#Y6&2{8YiM4E@?FLZ*ZhipL?ARnr%MrKf2)v`uP#EDf^g@Qi?%0cHrq zgaRx#_!u+IIsolKHkg#P#kaCE^E$1ayU1o_ePT(CO3Z&6o$xdRvm0=cDpP)EitCw$ z#X19Oa&ZyP)6Hg0Ptq>;L0Gq^`oPIuQuGr~A(o3dORTl(v2*jZ!V-7r;) z%HpU|inz}=LiOnKV~C3kg;+B$gbBn6%of0b=?AH*HXZzLDVG{`vk^=wi3@2~F+*C= z@8gK-avE;6tv3*RMXvsXw5{TAbjvRJ$+~w*82F~!lARV;DZk-kUk)DojEQnF=FM=Hf9>61}+1WIhsD2eYJc{SoIi`AWZF!*0e8<$3<2|us2lY64W zOVf~Hre$UbmxEZ5sP8>n*A0PDU%Dl2;7o`QUq!sQ0{epjF2^QIIvEYAGKOr$N@{14 z9ExlsfqJx9KuV09Fe6RvPyUy1%7OHBW{?K1FOKHxckq}-xrv@7)Vf8`I93w1(-v4v z;!(|?pnROut>#QUXxoRku`-EAl*7_@gVhMPs=y5(R`>yfgM6usPW)l92r8$-iI}$w zq>xS%;>qpbFvYCmN7tSdXTX`CF%RNU=4#s;_!*jM-RD?n6#D)xg!Fj*NG!53y`2By zr;&BepvlRfmAS<>#I8}q1uaI!}QdeT5o%SY+PPsY01|`h?d)zRkplgRyGO;%%#oP zaUMg}W$jYFJ8IMuU$18nt~;1il7ES^SaAiYPlM$=TKe)ichhsh3aQ4@D?4$Q;q z%&s+_0j0+>>+nSIG8b0E?YdfjUT2TUFoxRvro&}D(J0?dz)}^aG(0vRn&*akf>r1$ zlVA$w1^6DSqb3r%+nvovdq~6H_%Br-`o=+Mri@IqxFPx0Oe2z!3W~)yP?S(1ROBb` zZ)L%GNH!P?{H#x51qp_qxva0($~bUKRt8szCf%ogv|-5?lQ3wC?X5J*P|+V5;>ZLB~f`B zKL-q=*6QzHWTHS8A705g#tE$53ixX9g{DoyZt{ney z0jey{beYpNx#AknZZqdSG(foph%A{Z7je<6XG;14{%)~4Is-;5ErM!A%*I}w*jp^N zOGP4+B_c7Y1*EF4=6NmRs_>Qjm!865Hz$g+$RyW@CUEg5lI`zw4`0o-1&RmXcP%=m zs*^r&+4(`g>aJnDIm&v|oQn5vU}w2#S`-ytMV$hVH06;*gqNhGNKd7GnLrZ1=-RIn zZ^ddu%nmjv3^agF=iZ-*s?$lp3w zaVW2N+E%zy_=v8{L{iTp<{4^n@Pb)$F<0(~R{m-Uu@~-$VA5!cPBX;}|TanGTDx3AeigDYjaod^PGgcA2arz88fh=p0|VFpX79Hnp| zC~ZPUw!{c5_UQ#_Mk$dRUHMQV4DnUsb2z*cQ46jYR5!~lG)MyS3Y>Ak)zQUJE`lJPVxN#|A0TKkKE?A|uji?y z9Ar#4=salDP&hxWqA6Keza;$99T1Udh@q2}_4`)8JT6_LZGyOx6bYKP7x|u~w*-4y zTWUq(ME?f%+-N{(hi7_(@QPC`VhsM0yI(@c?JP6rG06}A?_3Y}ii>4!{~;sCmkSo{ ztD3Qb8h0ODNmeWCBdAD*^jmg4WA>u|uZ82|a82f0B_ry3n!ZhCdG1C82sQZ0pu?pM zQ9P@bGE5Ek;2B4QRO zl>#9WH+w$h(Y+WJx-{^UsB{C^Oo~+lW{ud49SHyq)hD*gkSVCtv2g?Xp*FY}8qX?{ z1%kbwAc?$Ph>X)ya0h`$n&jGZ(pPX~h3?QkF1mG%(vX52yNDL5aTvw@LUAF$kr)AC zXOLj9lJEqK>`Oj3d`!uUnUhCXy%Pm)fVC_MVt3tN^Wh~PYw*sS|5RT$59IUfln)qS? zQWXv$5IuK*6L!+LVcatsKO`2;xr!`0PYkX^hr2Um{e z8gVVNym6iOr?k67h8LTcoACfNZ3J7wtOmd(Dyv~6bgdx{6R={YU@T^+>O{S-k~J6X z@k#9*vjK5jvSB_zJyeu1Rs%ol!qiWlZ!i}@#Ah|u8n@Hkz#JTi)7=7zDrQd=CX9x> z-CqaE=r`NMvoc?<5Kc1VM8j~}DYl^4w~ch@b(V8mFZf82umSQ%>VkqfYn zqTTSGGMG_jr&;mL`v;puR~WKO?frhB;}#8$OGRIBU?QJ2n*1>OrMRntN)LLqWnbr@T#mpWEk>OJ*ae;IbNUO^ zLp8HrP`q`^0MlVe$-gmlu;$y$SqaMb$_|DqkFvhj+6-42A_;EDyG`SBFPt9p$cLgz zG(*+-(hWj5C((wWdL$t=rs?;E1d&a2DMh7tTtiZ_N)7T?FOeD(ZnomtK(pb=fSE}) zPMsvz$8UFaS_*QzG4U?3ol7-KO_&7+2IVx{HS6z=Sa%7}u?MMboGk^~>VXP2KdTRU z)mv>T^7{1R{?$7;5)Z&Mh8Iq`5$PEfSf#zXBJxB|YI#^{65_~Pr%hvy(K~Gsu*pDr z9k~|r2?_1OPlY+Vej&i`?fP=m*rl>Sb*z~qv_L;-#BEBNC%d_w+yX+c^2b0DbR~hk zmKVUxngFEiz){VwQb&SjoqSnPiPLh~d(?qW$fN8OR5r4m7Ydf15CJ=!s7fKfjVwUQ z<>L%+uyN)Gd6Y+UmkpHs`g;@Bm=0y`%(WtW?Gk0I^1`W?-ndvoYcA7X8Z8DO}yg~SOH zs&#U9scx=S2cQ7*Z}LBbg{nfqnVir5J^12>G?c!IY#Cm&rRfMyvu&W)~Oz1BHhM4^P*}>^rhGX;7FvXW-PQ@p=swM2c*&NJJ{hZNL5|Bbp;kh7*UFuRZs?J}%8R-k0NHBMsd(G<6=Kp` znJR0ZW4tW^*G&e}Kd5TYA7t+7yMGpJKR3+xyy zujjDjMU+X-8&S{OHnCPENhEi&nL-~{g9I|>woo>J=xlv)>CU#M)jS-pRJ z95D{*nP&NypAEF|cUOfUFN{=Tzmt#F=qJRai)HFikJKV#mQzT?2vCk9d<$Wkcz_6s z7%dG-ik^}V7}nrxjUwz&gcA9admT}QU~+s-$=&Hj+`yt>ka=zV-fIE#xD0Y!@OC!o zXAL#OQ)EfmpSrvFFpbFZSuZ`hTgJmsi(AtdA^4N_-O7()BF=?^PCCFOKIXu)kQZrz z1EZ6PHM3`kG@Xf;rUtlaf;pLlze3pS%(mH;EY;1*AK&n<>;uMFvn-t|WGc!zb`P07 z0g{_4>;g;ddLm^&-Q&N1HT+IyBk3h@oy1-Z{zPvaaK9<28u1h%bIjC){>Ck%pFop) z`W!eb>`8ih{)_G{1`86^j8H?9SA__j{wBHaTJe+!cJBLqyL68cRN~?32P{BMCVW3D zX)C#z)laNif7#uGwo4wZg){n$E1Hn1%uGJrL^8M{-wmFfdPLJHQ zjPw-fzY!ra1Nl8yPhm<0RN05sU~!TXK*4m&a8VBanc@zw34kihbkfk5)rl~IW(-re zRI9|UExC7IaFOD1)jIRM;wsXNcmS6;NWdV`y$wLS;5p#RAIKd(s0i8^IW{RoXhA17 z2E`h{iDIFAPyYfv?@*DPR51POFZj+U@%U^XVE=-7Yf1H z2f5=#+9`?Dq7=g_^=PfmJ$D|&MLKSkkT7622n${14Iwv81TdSpFG)^c!LM2a7=7{u zR`Bz@=cE5=asJ)>@(|_J*XYsU+U`tZwhYUi3Vo+0`o{i)^?)<|3(Y|Yp;ju-`b3J9 z&91OTosDu%%Yt&SHbO>J!g@UKfDm212!CY94_&U4oXyHRBFHlUzgsHLoaF<@Yq;AZ z?hZYIF}nB7ZEnKls6(8ZxU_W9>?iipiejTes;kE0!nLV`Gn9nR28zsIq&2%LiE0@! zfU0_KrQYi%0Rb3A6)zqrBblB>=iUC}$PTW3RYN>Gj=dVso6GPaiT7up6!}llZHA>i z4RKwyyV0-&r%$f{yqqTE1LH-4VAhP!lc;`d6L&OsO*qGnV!oTXtK5g58S z;ugdqNIhVjR1^oVX8hVY*Nc4LQF_Q*tE=4AkuRZ|XkF*fiUXYowpClG!};nuNf4bx_G*6EH`t|XR*IpS{)B#DGwBKvp*~4=hwBv z@6qA3ye#I;wZZn(hz}&^>~Q9Mn*c z@N7}%kqA(nKh{mzR;#aS$GNR)Y=#g&<-C~884sh4tlT!POUBNT$Iv4Lv zzR4ak3+GLiAJhFMK4Ic>F@AC;VRM3s01s|h6oUsas9doSgVx=U0<{-YWw#>KL_pNN zgE%*ezXJrW4}3N*A;NLHnL4y+Bv-Z)txcwCIU6TvB=M7wYqwR5U zfSqp3pqlHopFAVxl^#)jD(T-n(d`469TnuGL!js8BbuGV z`x*Y=3-RAPHpK)R$XSI!jCvU?AknK(qALbsBui{Ckus6xNp>@K*YKNo0lYHy1>dDu zYT;R(bTlehiZej&h63jj1xAOGK><)P(2|K+@E@4lXQb-`qbx7N1W@{&1bIfb_CiuT zP?_^x&BV_ql1&i_DD!aia^s)@OiUCdXd&`F>#xc~BpHtD>OX^WvjS8 zFFRoHon5ESW0?p2uE(S z{4OLeN6~9TOK6b#E2TXh!?rbW1N- zO{IEQbt6*w>^B!{+Q_CCEkt(EuwI%aq6X*Ed*jpShDrZXtxVBoc4I_vkIF@pvY6Wc z38)%ZIt{2?wwIozv=WuD=4MQU;G%T4uH?GVCdNz?K;!|2mP>Ka z@;pZN{wI%;Drcrtaa%+J22eNaog4%?>u|HlK^OVD=kF@Z0bWpqDrH-jx-Cv7dMgGh zHyA~6GexnAm}w&nQt?*kBXebe^2!)hL4;6|oNjQuj^la?2ZFRIAug;vX_o6$nW#Xo z_vA^UN{YS?KC{WuYDf`ANLq_~Qok%;V@KY3a|;;-Te{{UKc3Gx<_pW!aewjIr#!q! zaMf`R;x)lH?bpFAh^{+ysq2PJO1%0I3|&k_=aIf$0(^2zOgNM`oW*VeiNY%G=Ch|r zj5)iQ&YdEb2acA`SQV_Ojgw9YGv^UB5b<-WbDs`FJi`H*(;BK_uNj^RPI0kPCM5AK z(MEzD&A#UKb56O%QD7wCQhev^3aMdyWORunomS{cq@DC4H8ytQh)BK6B0Gp18$i;ijN&u#3r{)WYAC?D!u)I)bj<-k#0DLQVUXnifKJ<||Ky?aeh%F^;c4el zQ2jUs4>!hTsA37rhT!#h=~3JU{-^ahb1yDr^r^nC9wNUJ^b;i4`AE?+N|>o^pz`kF z){TSmntBD~LK!9mYVXwUF6`FrPSa^gTLUkX z6$S_f&>{&;L7OeeVO8U|c*ySrsfH&I=ulC@ImW$4Mkv6fZBqBDFzl>+tJz=ZNOn5! z)i*6P*Ey&0)rZ*Q&v@zytT{KSiHmUzMC|r@2R;Wt_w`ChSOOdH9{t2Q0+miBC%2k% z?w%nHJ+1kkjF`w1$ALH-IOx>tqz0hs+}9`BC7?qQyxawOsd}j!;(8pB#LSiu)O&=I zTOu?UsE&y9Gg7??K@g$8?eq1HHt-FykciT)7vE%|I&7;JRsnLvv^x%5n`Ok?QBz$; z#!_(H6m{)R;g*b~_SSSM5XhPvI@#Jl009z{%Vfe~V6r0}o`FoLS5i|`UtlY%tO*Q? zW$Xm>SJ5Jrj0KOE$wkz*9uXD2`jGAddEAv4vl0;=qB%2s)N7=;jR#^bF`)m7hO-MIoEH@5PV^+P zucAeO{ZlmZ-P|j`)vF!lZG>r(GcIc$mg$&8ZHRrnXk;FBZvw7SU@e~XRdLpSpw8?K^M zc;hsidx525q$-eT87MwHh|d9>66N|dVA(In2_GKtHcHHp>N*xZH|k#iX_b=RkQtE- zs3>h4s1BBy4i;b)I=o?cWe1kCK!{p-X-LrCQ-fYAl+&8qHo=ND$?6l4*H!{e9Wl|V z378c;>WPRz-+302kfv<$!9yQ3JyamMC^`jE?J1`2+#a5%8@5+ch}^gUBP1dsvTd79 zXF|WRYGfA^swreDo}!lsG)iV8*5eONFoR&2GzEwQI_{NH+bQ8yL<|GA#1U&EoGTUw z+a0dWP~k694<8Ga1yibqu5>+3AV|CJLZI9wg39>yC}0CkVUME$@mQER6kc%!indab za?vf(lH0q#r9NyL!3tObRlNef9vhAj2?A4xY88Tqr#-a$cz+- z?nHiq>~jJ-Y83@z5rT_%(BuiWFs1naGsOkKko+3y6Hw3&^GqV#0l{!(kstb}EE3T@ zD7%jkc|AlKIW=4o;`D~Z*V)8|jy%H0P&SK4l}MslWRHSH2LSLWb^8#ApOY$?WqTbW ze{5@M$`yAZsL8T|7@=F(Ack@eOVkGzN>L)K3mMasP;{+~oLNCbuq+ z1`RNc$UhEC^pUP0gw9y>o|yKA7GY;nqCAmV`?VP(Sh$bJ!$Ip_3k-$GHkvm$id!U= zis_uFTz5Ak03z9>DgYXTwqR)iVjRsXW(8{}Db@oauxW;cGW2YG$;6!Ps3&13Sp;Ug zYJCt9=qSojsfoLRNYV>Z%i5TZs6L8tm>`U$NIlF6LvwV_`3oX7aZQZ)WU#kRmCK`6`-*DkjWXHewapMi~JBZSF=i(i0j^f-jN!B8#N zP&Y|>cT+HsmD)zS27(n`wI@W?&5G{PW1s6aF8yZIm$;#@K9$~d7qkLi;m8V{|8wQe z)6Vwp3y;Y7X=$z|S3$i!Q$$dx?^HIcj9xm`4BrMFvmmcUb;ntG*>}CoQ+n_j*iCX- zGmZjKBRMqd79}XTpmxT?n4*_Z;WOja6MpxQ(*bHd)gwmqg?@pLq+f|CMG&P(GPi;( zjYBQztfiu|wh92Cyo^H62_${xNhuE)pC`oi@RC;v^qOd8ki0=4z;z4HHXsSR|4fNO zhqI7`dCL1CUYZnnRd$9c*U6xc+{8BaO=h+3AMp(d4i{mrK#389Fa^Wb{-M0vJ|)`i za6EGNeyZEWqF(9cOT(`eL^(k~uh=*uLWE5rJRv7kcJRkWbdV@< zWrqbG1V$;PITF;}cB(OAqwy%n7T9Q4Y%UF=p+^lNZs9_QcL<9r^!OZMKksR{0s!`h z(x71O6ygbDv*)5*FO;rahn{xMJlRIlbqVigkq$422WaG02L!hU*7p6eJQ~Z02Au@= zCwPmT!^dMj8AP z3NijKM`zsQjE|2Ba8HNa5a(3>?UrUZQV|Kwqc>tNmO!6)OS!U4orHrBYN-q#W|tv; zU-Dvg@fA72xR^2Vc4Nn263jOW3fBKb&EO3J!|xd#=Hw+FIGk4AB04pXLI?qI{Q(D2 zOhC&K2gCMVg@|!F;A-GmoRB?~h`z9GsZnCssZwbqsG$H^DLO3wBHt-BXiWZp!FOon zZTK=9k^YL!QAQvFUOjpdcv9$?su>Aj31v4FQpt-c)FUuDh(aPvrAneidnX`gLU#j4 z<-y>)Acjs9rKd_;$VUiRhd9}66lEzt_e>(YtE{VeTnC6q607Y@^JzN}RS-swj5erS z0=rV+HbnNkNnt`m!L`CvMaiR~VDoXM#{~(Q@4>usz9C;r z0a>aUlR-A0VK~;~e58Y-#qxgs2G(^@8>J2s0Utdicr8lF4w#BqzYAJcQ6H^FFg)FjT3OC+?4Tey% ztbtdPCISnZOH;Uri*7g0j2AXCid;*|mgt{Yvk++fcjtt8uO8kg7`Z$RTE-SDqQ+ zL2cqUfciwvJvn&4B+ikA;Mau|L1D?Ln+#sthi2joWC_frc#vr^T;`!(de`a1#w1Fm zq-N(p0VkogtLLthE!m`_WjUxtpdurDB2Ajv+?y)#jGPe!9k53WXALIZ0$8_!_U8`1 zmoIJ95T`Ni(fq(dpfer_i^WY`jAc`on|gV>Xk1I%>PKl6BU|h7i9~VjZXO~DQn7+i z!7u=va8R>>lm^16m6~aX4h;5)QUFPG{84}&87hfjh^xN<%7RY-D|O<%SFA(}j!_J8 zGxICj=tO6zaR5}#@Y#w6FySZ$NN&8?TIM%K9_WVO@x}43d?Iv#Yh)!Tu@ZDY963@dY-|}86@Rrb-66Thx`h!B1fTPf zSR=NPA!~Y7k1=3GM{QjH^6?KUjqwzAYlNmWBhs?&Oo>I6A14ie7tRv@Rm#62YeDbKC_ zrs_}ZxNidXC=8v6URCiyVoG?nN`@ z(FDNpv}#b{6kz%%RBkAcjxez24AIA|?Bh9q z-cgf$Z9g;w8_2SM!4B9cMSRt@Xd(;Wy;GfP{)Wt$qE+XAw>6THryw)g$pN)sDzspV)cR%k(s8`eg=ABU8Ug&{xW)aXKw~`zWG4c|oVs0%Hx1Q(r%-Ycm(gJfBh>Wjn`i`BgI7BoH zrDaoYyUUyX520pxGa^M;dB{P}0;Yu$lfB{>P|?L>P-_aRO6&Yv$XBWWD_yqKyBwr# z>6YIdh3tP$@330a`{fb^##BXyMoDhBI6=Ia2o%|iz!6LWB7hCIw01T{S`Zyl_+;J` zX5fL(1I&W7=eyj2F%}n-@J!8%dBBWME(NXu!qjkpK=9$rt5yM+S9&d+U?M8`HnnI7 z(ENPf7X)|c*ai!%Hn6J~K)4xknTdHH5rJ8Pa$sHQv&(hzS|TzMDJe&1t=Z9%fQm@^|HH<8Fh3t+YeAVYMGf7mPB zyJ9su19j1ym{B9+r1Kl3JS|?}3`$l2z|hY#_~B0*BpJ!u<=BeNb(-uZ_eF%*33)=| z27K0+VQIKw4!BwY9+=A_8(k>HIJ#4m6oNSujKc6n%SPs{+YSMOpg`BNIFL*>i&|c8 zcs>Xoq|fi_F}jW64EH!)p0LwfPb&Kf-F&uig#sTOL0b|Ts7c%D+gfR8Y8cjH<+V4$ z(5;brW{rP{owfpTtFs<2q9^lE<2#hVI`9OwVV$S~uz*<*3HdNSS%ZNC{74ral(3tx zI#nRce3(*@8H!X04lA+ZY`K&~d6Q$=g`7L=(Z|2gm+c~&&=y^ItxdiE$jCn_vK-x> zfX@()o+AsqTuEDAtO8N+)-yN2mw4h$J-3#)15hwm+q7r5tp__}0$}RT@h>((T&K{| z;b}!C4g+SF2(a?d+rJGdPoDC@sGxWRV}YDMuX7v6*@?3B%gir28yFckbkG--%!JY_ zLMcSC)4o*Xic+98l+h=ZCjuOn0$y~G(gcfiI}#<`7)_8S7d01k9PlY zKOEIz6w`hbic2LlVFuo2BcTPJXgLAqF-gS;iGb&0sjZoB*T=% zc#$SzfD1BQSeJ%=Sy$!5W|+)Lx~6E`R?@@87ce0SB{#sA1;!4#ctg~jV=)6KIL4Ey zQenmcl6ldop-VfufEDo)3Qf>+$5*}8kRyN+PtsS?-(@bbEQkOdIE=X!h^}Iv^DR z)rvG>+rBeWBH%VXzYD!lM&c8SEtT*GAKZRamegH~EI6$eWw_v>>oGhpX0>r7MQm6}+ z>m+8gQzt~eUWQ8u2zEjeK+yrnpLkH_j#DJ)IkNE`ewI%%3&O8)O>YHK+Bte-k=69g zZp8GEf#A$&!QEuZi0l}x1}~IpBEwVxvSXF&Cm}#|kho_BqOhD64pRISox$bIFC?UP2L-cQEdZs8yV7l0D<9xtsjE!Lnc48gH+?Fb$K z9+-D%Y~(NZ$|IkO60HINLL2}j+ZLu%z9GdKd@~`&)e-Ck5}?tLLwS?Wq@!L1{mBgn z_SMA>;;@JT3Up_-5KE;>g$QueEOp}dQYSUMicWFzVrCf4fZVX6IJB!s$a>kWgF62< zM$oU3r<(p=AbasIK#O0~Cl&c=#u+_mX}*6N(`r1@MJz zlZcRQnABC=f^S59fW{Ao2+`+9GA0C>f&sXo9~nX{vLR~(j2vD8{L9%qjv*~*dm2_Q zHE?5O4k3(~tD+wRWa3bzeri|n$l@M+5HKtk9O`1Qi8{rT6r9D4yXgUidK1EBaF8gg zWo^F)@?n@~zaixT9w*~o#AP(XQ|}DV$NIAoKkBWth$kEH;&O;xNX0`Ireo3ZT}#l% zY4>9xOee%@g29jcBFRUj$Z1g7WXlI}o$N*+gj)g`*(J)dBccch$X5hNP0U#W#j_}% z4qiy4NEJF33|v3LVbF1dq$L#!AV)(isR+FA#diZ`I)KdUu?C|d?}*79!rpIAaBPVW U6=J-IA_gAG#=FKR--b<8z#j(E@c;k- diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg deleted file mode 100644 index d1e02c3..0000000 --- a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf deleted file mode 100644 index 231fe5b70189089fc17f238f758dace118660ee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51608 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 J$Psh9{{!gxwJ-nx diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff deleted file mode 100644 index 48f3bfd2b5b9f49f7686b71758f481c890b8bd8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26372 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

tb?zyS(BTgF1 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 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 deleted file mode 100644 index b359a9c3cdbc1537766ec3b11ab3e88f35acafe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20944 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%0A&@y3lY=RhY2W5-cA)z{Pk@|;o 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf deleted file mode 100644 index 183072beb476219bd62530b01f82dcdf405624d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50880 zcmcG%2Y3|K_cuOwW_CA)B%8YQ^n?-!uqg-#h!mv-L?!glLWl%H2?-?h-jSjR2_tfWhy=Q_N7{KH;?aAvO{u&|6i$t^ZNd0>?wY}_O#+httal{0eah=1&_ih@vf1?|&v zaKUf4B_7Y8iSxLeyh%k$lUJq)!bU5epFd{Y@S*c>56KpU^?*rgl{d5~U%DU-#5wvD zqQ(x*8yP&PNmsyk8~xYJA2)GQb)GN+@ZfnuRQ`mK`SVuh*#%+$w>Up4nCLgDfyp6A zf?4ntY6wBXIHiU)I5^}nM-8h(sGy^nAAR{Tph9p6oiZI_a-9QWy|(@MiGUL!plv@z z76sg?n6wXz_Tj@n9Ddi78rp>b?Sg1^1YT>_JUTi!S_)KxnO)1A_>1GeQ0c zIBNjT8U&}==4k_6oRsbCiONB$SI(#acH4l|yL+v&?{2A6u z8hSgdw>;D|Nj=BTETsebcn-H80MvDaNMVHrD2Gi)s1<-(^%IV2K+REI8^6@1A=IlO zVyGpKddW2vK{AFTS2*hN8N<=P!r`B+__%-c2gY&D>IkWD_*flbylq5>2z)m=><1AYIT|L`lc#mpk?W6v}8fFa7V68JoWc=`VpKA3^ zj}g~c>ptokwqDI<>j$x8S!}b)|FYCBgK+I{c1&Qx#Oh{})4WV*EEFkHQWFeBaQG$j z0s3NqzWUI;kP?MoqC#DGh`~t=;X#b?r78EdDxu84f@oE0xzA#(j>rl}j8$o9T*EL^ z5)u;Q|;jq5#g~Z39&Ke@URFOCt+qwcx)Qf+)#sj1qSnf}wielaC7Ti%v` zwrnaX-Zpep-{(f=JlkiqShD4>t@xics_*k7M?L>+j_T7*Jl9QLH~ZCB7j~KX>aN9> zK}A!to*p!%XhhZJ*?V>`?t;TY)8L{h!=BD6m^}RFX7Yq)kT_$iZ_5`=?+W#WhC-?^ zMQM_jPE*;$>abPNG0MfmX5hlClSC*^LUnGaiIbW{1p($z+^U3YAN945NMpK{IPFRj z|A2f@?8a{(1x^Qc;(d#SrD4)7w%9~7#}w!zv_)DvOSBMeNMW}0v@{KEY)#*cBd;vk zyJIt3Ibht(b1SE3T%1^OZ(7-&0k3vcM+Y{2_fYc%bJ{;MrvI=>Qti>(d%vP=DOtIs zL~XkIjelPKc~#HMPnFyglbuiW=)$f9#cqCS&L%l&>W&dj$9C;GdOF0nP$+j0u0zt8 zKrs&4C1<#J2}!kI5AJWuHceD7vIZ}q?NYUom}kxsLIkVg6B@=j3bzD7w1uXGgrwU7 zMKL@qB*bP(5XGhWS4!%2n4R5j$c_>9W?ab=yMMtpu;;q=PCoRH`oX&&tJBr1U3+wA zeb~zcM>P5t(RVQVwuBI(IXHnNHp4{Gl9(0}lA0oliRlp`A)=V~*{piQc4lSm&Z;;4 zvwZRKYwBoqf6pGBSpr+|!$mfWC3ou4L*1`J^)R8HI8EvbNf;w4;l*)XvD{47} z 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 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff deleted file mode 100644 index c94ed97fc4fad4a9a1078b53bdac908c74562db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26528 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�P}sXPmsN-_3!ekj!rks z={Y)Z3rAI31I?rhq@I5Kzu3IHtscR2aNn;FO+$;R`h{*&U$1)`=a6GQ#*wmsE~SR% z_(6R(e^A4TdTRyeUf<%SQX<4POCu>bQn$FGoOkK$)>d;#K z6b`2#m5w4IS6N@|2HklXI0Pgj00=yniZrC}R!d}n#;X8Qk%esJAh*@twHS*~29#_n z#Y*w5)mQ{5ga3hL0p-v@3%*o~Q>|gA;CvHEfC2#4%c7()no^o1OqFxX+=f}osMt~( zRzn!uAl+o-i{&XOy!-M1DT*9P4=BchFNc6(Ncvl9IV5(s(2PNJbDl3Ktz*&4RQdI*r_=cGP%ypt46xX_|s^pgyMNOpM~YERts1#Zs+aE zf^~;LKNcKW7&jZm8;w*#(Vrm2&&CVE8g8oJYh#QUratRcY?d7b7Hy4JX51u5WcC~C z;fh?!&Xfv51O@^l-Ns8ZGKOpj(r4;Yp9Uld(q?RLgb6M;q=L{XKV0Af8DrX}d~lhZ zMEY8HayiOfrtrU$zF;u-+hON}qgk=YR<^8bbZ&}CON z)Iw?j@a!qUg7s0=i47Hy1IZtf4%lBP-g~T-^VA8PoFYm|G^Ka1#Lg=sB^Bm=d*FL(8Gvs^kb2L_yx#Ap83885{=qs3>rB}efxn?7cB0)FL>&q%$04etnVjeXIG@g@h|hI9++#7qfZ6QDRE4YIPc*1cd`DONg|UrY z?Bfu2IEvyJr-$g3h&Ff>Wu#b1xG{-o%wm4acZ^bHw|!}pt4LJ*qLGii(eAnLsj0%T zC@}{T5uf-6ky8Jq+6nUjaQAc}+K5-SSfalJh=5@&Gkyi6Uj|kJTY!$hR;Jz+U>k58 z=nI?x&L%G(oCAV1a2~i0JOpk)`)j~W;2!V_xDPx4MwwXu6!-u<1D*q8fEU19;4APB z(#HYsf$zX?zz^1XJn$28FZqAqPv9?L0`T{=o#X&Ak~|5>p@o2Gfaok3S3ydWt3V9U z3Xld!mqAPh>1n`qkUq#9WCF5a8ZZT939!U$JNL~jLfnq>$p!oE+Q37Z$(zH)N%mJ0e5NljH ztYjXj71RdI2OR@RfQ6uO=A94v2Jry&oddsuet=}YG%$5A4NwG_CYV;3X=X!0=0IQ%9v;tHFl^W1C1XKW(M$nFRP&!olh4xoKxlrl1xWD7FFct@534rww z%K)()z($A_fLN)_(_&Q$z;=kWnd<=TfY=OT7sNpjyCJTIR0DBM0QNv!$Gpjby%0A; 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 Ji?vw?84zgwE-e56 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg deleted file mode 100644 index 2b98916..0000000 --- a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf deleted file mode 100644 index 28a6a0735d82b69e38edbab3dbb5f6ef80c8f15d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50764 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 Awg3PC diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff deleted file mode 100644 index a4891ebf457de5d30c87ea730d4fa37bc9543b3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26516 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%0DSTK*$pKf-JVQ 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 TtS>33Qcd=yzb0&>CG~_1JCzPn diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot deleted file mode 100644 index b38d2c120672b4dbe7ebddd72b861379be49dc25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23564 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf deleted file mode 100644 index 8a2825f6e8c995984f99d22ea383129d1c5e8c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50724 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 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff deleted file mode 100644 index e4dd7622ecb05efa6cb5cad891419304cbdfa528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26572 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 P<%=_x0su;QBai?9mY>yP diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 deleted file mode 100644 index 4d7272a4ab8ac98b9db5dabb84b76b3ad7c17a7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21128 zcmZsiLzFNKjBMMsZQHhO+x@j|+qP}nwr$(C-#>3Vb2q6)R@tQLmiRhDM#Sz)RvYOU zA|nnTRv9)KBU_K$mW}Od#@0-irST7*y1ic_*lD4lL}FZM4n1>O`>5Gwg!{0fqhjGU zrJ&TLDEgLT0BMPWK_~h7#*C^C^w@Z_dqn=WUJZ^xk?6j+!2}xj4Bj9|CR%_LWE!}1!(QySW9e|m735W|L$a; zdbNCMmsG_@YM^aBGl+rBs8MSHBheVJ1qSMApx|WUHR}Pl0N2?RmRV>~=+T>-6TKB4 z;O-G{M6$s}MD0%pdArM+-k7|&8+RXTr%z>a>sIl;oxIFkf&T^IApSEVOqd*-7+;4F zr3v8c{q1XE8)`{WXqbPHpkQ-Mlpw*&fsKhmMf_k=a^(d$$KTlD3Y9FOIOzj=ze7gA z$VW8zt4Z16?dN9wx@$$hrGr2fD?%zVb}rm#GLL)l{_2%>0nir4e1(36&RXw{t|fJ$ zQxO>C3K4kVcQrI+2!56@?;zF=&A`3FA)-+((PqGX0LCuW+;LmfT?p>9TME%8nefdg zK{#ewk+gNR0mY0@2KyH%J76jPB*p?t?PXfo`UgRVBIIvG!4;;_X`$Qsxzz>k;NBf? z!52s?@Bm5*AVq+RC%+DKkc^C%FAk6lAqf|ce33ns%+=+X5jDBARl=P{%U$KX&`MUR zHsjif9Twj#BA1UcJJ1n{94Sx^iQ-6lz=%YeyA}{Hkt}HV!LK^y8k+n_x_^rkxhgAa z>4vN2hH4JhPs0e%4AKu<+&+oj7$`i7ukgkIe9H`QDO7q)!a2NLvW!~cbW_;;6W5_C zLVTkO{7UFP;tT zKTZ!n9*!J3u*v)gVGZ|mxf%ijLfi9s$B+Up*|W>B>_T_!ejJ8yhfX-9o9sEbneAb`_$5{Cv zg_Wy5>LLKZ`4u(IvJU|S8f<}elX@)H=c4oTQTZL{f?KwT&g;PjQHCJkI3fqmItWZ| zSaW26=V2t&3qiNxQiFvvy;^#ZO*N_Ls{IaM-6<>g0dN8}EF)%jCU+>pU8tyYv~{C} zlfd5!(G0AjpKtX(T>#dHhRsfq(rVplB@rGSUf&bwJz3l zW!fv1pjeOlfrCsHTFs&UNk9Z*f&I7(1MCL`X`G7)y>0l!*ry>Xj&`Z++b9Y}E;k|S zqabhuEyf82?cM;iAvK9d<>LWorUy};Y8XVIzS=tsV&dVsAI88R5Q#*j5g_VUI%|%~ zt`Cj&$Z;EQdZ6n#PnfFfxXie)Z#z!`!}Bs7F^0hZKBx7)I9FCuKoAFzD2)?@0ZBC$ zT5i_jk6P%_yv^zN_BJ-Qj2YnKv#((NvUBiWv@1uFza4O+I=qO z1z3|ntMh^Y_NgmKlmx+sQO_5^vi&~Ws_Dg>!!?KYHyS~Zc`B^*13@tT>y(+qRQ97@ z&r=LP$HnXsY?STf<*h)%Ct9C(+tka^a~3g3noNN4lrbm->wHA;jhi|ztIU-15pOI2 zwz%cp^d#}GpQeNFY_`U84z%E9swM9F{Wh7~+N8e_5cbIXNQr%<`LYqQ+kd03c;QRT ztGqOP`56yQwYa6U;kEG77eEli26@T{CP^PK_SntPOh9B<9@DBH1XcGg2vRRgGDlHa z=yKi%#Fn4FH^Yl;Cq!c&sT?NO%sLj(%jVpim9&@2VUrx&maeYLI31&-!)x7d3-P6s zfk3BJe9V5$c$POY1;8A}>NITgdo7r2vmX#m({UYH@qGwN)AP8AY1@7IV)MCQAkUjg zbtFJ0C@)!Y;)FY zVh35Cx9SYI;y#%|xj;&mwu=`-K2DS+6@^(|~y1!O#( z!9CLj7uT+ocyynh&UnPX$BX7WD@f$a0T4I8r5z}1uf$eY2mMoiacjWl?JB;4^-s{N zR-BEOJ=(SiXa0bnuB_cQ?&*VHM=!9pYiHk1w<>3j81)xku9l0M8*{zO+|LQ=dD47k z`bas1$eZ`WEFa4hIMqJPE64huELxUbwJ41V&k)eu+Kil&X2CI>zlayJLT?`?xcE_@ z_FfDWZ4}zQB8z{yQDz-(ntrF*-8j0|Zcp1jq2^0&X=ZCVObmi!tukc49oN)pP6wC0 z!Ia3~aocDh35;5^&Q?m`_~6}FonPeA7UgjDV_ZER&C~RRUYAKaF?S}?zKEinnT(v*fM#tg8}Xl zOdG-05Q@;YAr$iWOd^xHS`X~o6gUbwopW(sVf;-i!w-3usUDYr<^g~NpoGXU`chDf z=V<>KB}_E-Y@mVGtxxhJGjj-~*>*SWVstpq>5u?)D zVm9f;#_5#=HFjh*D*{Hwm|ly(2Bh`+fh>-Nab=QMEt!x!)7nTes$omA&Lw3QW*%SU zGdK#uxqw=diAv#Ohz%ts6Bcms#YQp9DlBRhGY{f_MW$;-73qn@HqkV?7s$^J9z*n27rEfoG{27jbgbsDO7k@kichKI!4`CK~Wi&xyd~PVEj`;d7f7W!W5^r8VD!Y&|JN# z2=E7l0zuKFKTZ`waTXvqFXMyd+!u9bQV3%5_8up-B&e^j%Zvr45NTVjUk~cS3-c!c zit)AB$p;!PC;``sj0$!_;V18%1;AfY7&UZ9=qCY4^<-c}!BOynWPsMbg$3OgCrc2M9zYC&6DnS^%(y$>G9VPsK;o00c9l)s$Q4rekY}| zkd(KeT12z$J@?1b2V*r}yD_6K!QLX?Rp?Zfgu5|~V9 z5gm|+YpR^<%sjuV_%dG|IvH)OyQb}$?6j-wdjQ49x3m3FbQ{v`@;Qn+AJfNQN8-S2 zN2^>qo_gttYku!-CLmS!S%IBx&nx+T2*%=hSZ1E1WU+i4l&L=}g={M_#HR?JGzzzuW&+!inAWuvKlMiHs=K<{o=?3nO{?P}~1Kb7S1KkDM1%oTu z{sX*cy(hd!wCA{Iya&Apz9&7!hx7*h2Kk2jrfC-k>=W3Vy9M+E^aB?->W@X31@Dq;$G9$qOcRP~0#HD2hUTINSq8irm=yB&F|HbU^yV8cygbGZpWNF4Aw5VmTQNd zG!@a#*RdVEQK)_HMzaS`z6xg(?#Q*LPu7-cho9uNR-XCcbLRtaMC4z4{thg~7 z8IOtOh3hKE!&o>Og<1_qHek7UGWyb-=HOunS(63*5gPn+RH^F;`hlN+QhI=bhi(d`HS}!*hpsJ`5kP2Qf^#c9O3?9lqPKlDvMJ;q_K-;>MLa5?s5` z?x%k*(fUcdwkK_l^+U*TpEo|=spvaussq2$U$74J^Ba4`t|8sh-8II+flwD5=fr-v zr*pGfpAzBW;8y`pqjxEdwtq~rNZX~wVL&76zkAl8t~k3FOiAuJan25^1{aRIOKxEd`0kuD((LNzWoDN_lCTpFNsxe1n>!4g?nMrxlqDF`}2QiZbD z{L_etM#L)1>v|aC5p;?Rr&Ur`5s#|Kib$4pNSkP)q1M8ZD;};yMc%q`k*zG0An983 z{YCjA3BVzE(E(5JDLut6`lwRqOq+zfp|;Ghy5w}%T@u7ZBOA1`taK*oWqq#0si>*E zJ3@gP<7-U{sRXBH&I&D!JQgI^tr`M}x{wu&RfdbJY*z#~ zY8M4huV09*m8L>_#;2B?t8L7M?>Q4hkIK5a=qb!x)MMYPn6R!zNiQ!qUBO!35|XTV z_MB9`c&ck7POVEhHmcrgldUADjcXw<(K5sl-w3W`TH!2}9sosQqzX`kphN2*iL9Gjl8~XU)%Y3$UFjm~kt!nA^CCcyzh4ZOh}_87w*f3lA5v(Weq+(S2-l zK-6+plMxzai?Qu-WYz$09`sbwXJ9%)|5n~)nbujl<}jEbS2|eVcjYZ|l@27=O7K7q zX3K4;DDjG8R-n#_4e#xC5{!o|+K#%nIz!4K#Xf5@%fTl0)N9z33PIQ+t1hTm5t&+e z-zFJPMp0}}*F2Im8h%uUhQ3v~axv+dKC)PGge2Y>)iWky2v~YS_ytw`;Kx6{&nar> zlbDc-woNfT+o>O9VjklhrZube4s%8mlJ1)BR|~Cn(;^MF`{h@8EBddX!;2%+UxW$# z=2Cg_Uc$6mEM?}FU^oyaTCaO$Is0o>>6gfyBxEZHap>5*!6Vk!PoZ4lNU5&rv72-6 zAx-C1z5nOa=uhcezrK^9((Q%6?}uyg^4~!N-w-s3H-Y5Dwa8Cld?sq*92A9U)f;M} zfQR{uiaA(FXn`U&1?sj7bHz{KZNp+D5-YiqKBZK#>dIZ~phRv|>?9$4B^VkDN#Ri{ zqmHc6sXARqCZ8qj6@F$p-LBnZMS~vh-W(GeL1`n$;DooV$a67SqKbKjJT0|nKmMI1 zn5bKZd!mj;oF1pdvGd!NWwqvqYq(c9xrpjhYf7#LqPz1sKl@6{qi3p%Tzkof;419S zvTd>obj_@%I(i+05?@sw3f={zG~gX-T!=|hTkFec=I)N+#)+cp7&6+15AeECAQDcJ zQUU{85m|h`vwd2tgSB)-Aa=HQClpLta$}kQrjClG3(1)|AoG95x!xJONb4SiP^(c| zv@9_vXLs2F5yKf{+$vTTf_5?Q0zmLs1CJHVBo$AFB;X9ZRBy6#0$YIClth?4AS2*z zQHRY7kl1HOziQ7sT8%CT49O5AeWMp7{ zgXSPjctS|k1R3Nbm&mqnaWhZZ@sF^D2rC?obD^epyCWP$ZHV>+TVel~MJ#_(k+lWK ziM6;RrlUZft`m{U>}U`mCR4xIu+OOuSa#59vVdMVVSlIM8t2;bU)9lH41p{`+v{O# z$kdr~i9(64IN{Y6B6o^GGTK6Aq6*pa2k8MkVw~f)amBo-gJKCc@x{|?&`~DsI*6o~ z6hJtPje@IB8%q*gKsL@`YD)GT+o*?=(pC3@r>7NCV51q*dH~rzNkP2sZlNFGu%skV zD7i&gR{)y&8lyCZkhD&9kSZ+LZ%q@x7-OFOAdv|){vGrTd*TP9R=?CE` znA!!=lpvk35oBjVDBx`nRWVyIshG{G(iwXVHI)MU}{Kb+XB^5isxRJ#ST?PCQ1iJ&(T(_=)v^MUj%Aoh;c5>cblK1t@LG`7*1b z?Nw$GFF~aj+^7sn`*k(rfXs-JC64Vv@Egjeo!hifxK4_2+ZV@I+Kn-e%%#%~PGJ?x z>;ay@M|v}l=P2o(Wc2lIkGJDbmrx~8gKWXXxg1%r87NC@X{@C}^A7o`+^>KL9&zZOkLls8L>fo}T7y z)L@9^J-+YbzH{6Sg?4eEEnZ4T1K|IrgrHU|_jde0TtEWL*j3$gwuyH-rb7U_V^g+>z7UHHJn^sab~DDpMt4-X%Pol4c9`;+RE!6C%-HIjp7wwcS;Q< zXWQvf3i!A#YPf`m;#-djW-`b7i@?T`N>*WkY4LgbwOoFI%h;H0mCHG!!j{H{E zS}0Ob#QmH_^6Fiz{_-^e+1@Aqhl<}GH`c50mNMb4uHW8-BJAAOdPxS;sRFk!gt3iU zwma{8*ehGGS@g22p}~)-<@Yh&(hgou+{Z=}Y>NwP7TKZm=en2YcX71ur_MX!`uLTQ zVYvt?F_!eL-^F%>fzs3z;6q=Rjh=VZojSGq;X2Pi$PnxQMs$SB+vE0qxl_&(1a$X% zhF&YRZIQ!C`tmSlG2||W6@wuZi}cQx&c5u^>RkRr!{t|gMB~-oWTMkQ3^r3goNg#9 zhFt(ty^uP&q4hzWLwbGis^q*YU~aLYpnky77tn*uM7g&xj5SlvIvudbg}cuvgDcmn z>kDC=A8K?EP(l1Wr;Bsr&ZNr6lZYJhRTOEI@;yI?_7^BL)9h$}*fP07iD zj629fd?6rF9c12IWQ)GdhY=*0VW^va7!DCKId#dCVUl(-d}@sF~m}957j4mQayvJRSVmKKd z-We_v5MM?pm?>GV=ya%jfHq3H0zIZRSb!y{r2=S)TO3O!FcmhgTe8McrKLd%gv{qV zq#PdoUOfD9)LcuR>$#eGZELdIR3xO7GxcA@z6p{l{OB;A_0jvyIxPo@Mk9!!A*HY(HkUQ6Moda|Qp zZzNB^BS~yXVkl+n^AmIYD2u^I8I6J_Oy2X+$hz15cU^2l*(V)q>h$>UuvCK#yQswT&>>{B?gZ$RkStaosQb@Q0-`k zT|rzKPRv!w#@r1XUu!yxiPaKRExRJim&ZZ+>>&2OWMcFP8VRSFwJ6y2`gBUVTX!YH ztKAp=58n}FXpfv{b1x08;C*$68s+X1Rpj}(&=skoVpE1&%;e_yNH|YQ+4a;(YVy=8 zaRfm4z}d1YC>?iyCJn@XD_ytVN7UO?C9BR{MOuibXI5MxUV^ogI?5fZAtb}JgcgW> zv2`)iDZ5>;t%E)$I(9vpEiO5MEG9+6P4^fB9Q&2kFoGmM3d;WaD&?vBC2Va6*V4Pk zAr|gm0su0ou2mv<*FN*6)^g9Ee5wP-@2_mD2XhBK3lJfvY9} z;D?_}&)3oc;te2q;W6`PVjiyVM^ZUC8jyvEg2sDsR?;-k|7BUTu z{X8{?pUdV*7E}(bSpS)z9o006SKUL^Z~PVyoFt_I>2e#LF`<>mKcDKk-QT)*FJ&k_ zYyfiujNb@*^JwO62S?pH2tP)=v9v>yU7o9JstxxF%v)5XeMBVef{+Hg>w|W;e5x;^ zCt(%}crzcWVTbdn%$;7enxuKUS{VkFQ7|oM-BTEC2aVQAXEnAl5r=Re31fO56afBQ zUbfS}^;mT|8B2~sbh^H6BU*OHkHl|R}zH7;JnW7dO$qk%^uFx zsP_;yF3V!c$EM|OVCCZ^O<%PfMq-hId-3Z0@33AvX|vGakzul1FpT!nj#h zCv^1_oe$N;^=9&MuVnyuxfl~MvP9gQ4PVhRIGn$c->gU{{V@VbQ~J)?YoVbd-as5~ zyV#xJz3xW#$_tWy+&^p55kLFOcecABa%t#Bq_>Ziy9^d367HLv6ncl4QDFp^hy`hW9cq;A=;2+l@xQ-DHt$5isI4V{_$8A%BJ*~JH$ zcMiu?yafQ3_?_HNp0}E`ZPm6Q8s`&kn~bV$Ut0*l4bMQ0@kmQspT}p31AqK}1BhmD zv3ejdyQ?UtQK#KR#}Q0@ z9S=7U%J7jF=^a&$5KxyeRglz+#xUpN=xP5@q_n`Sp6ms41)dcJM6S<=29sNcED6T( z4X0Yb_squM6$uE#1K}ZS&Xq19Dc$OMdixA~x=2}Gi>3Mxfi|b_yMG^0vCreUEVU)@ zn7G(Lh~F%7`AyE6FLQ;&sSHYcE{CqY4YoNMEhV{n#>fw>qe9-k6cVmM;IXbG+(TgI z>B9%Hplyy~;>GiDx(p8i53<;o@5x z2TS9E$yw?blL{3Dqhqz}I{xy*sEoUY9ASX(FhI?e4nLVpsLRsO;l6?{=>|f*b;9{B zLIDNVRjUjzVxgo&)khbD_WfT-G_(*QQCo=3923jeq1nxQ-Ri;Uu`A8d$E3NhEP2cz z)AP;-2kXJl$T8NXH{H)GUBuk@(%^Y`oCHsJHg;#Y zrO7cFjNNC^h3}=rLa&Du9+*_ig(<5WwY@xV6S~$6(I@EK^GK5F`xsCLlxk={?zFUr zv|kU3rUa(#C^_V{g5ar^`z_0qjXBROjk^Xds^zS%%;Wi?*^+Vw7XAzY0E-ysw86MOsTj4q z(DFoqe~5xp-JCq0VKUpHx_4IPBB9^vf&q}#QcntrrQxLoCng7)wbAXcmsdj# z#a&ZslgZKByMHX|$76A75WEi1F2^8-*#`DLBF-ZTAibU3OvT;5LVmG23^6P_+Q;#=bIFf>^ld-?SaZaVctR(IBe`8Bc-8)@Llec(!wQ6{PzhP(y+6$}u z_o>Za@R`cYjnYz2P=Q!>d4*0=)UL5jrm)i!6`|>ilkDQAur(*YDgwre5jdgK$L;rD z#*B&yIoejkBVl_z6Ol&y-%(6T>Lb#h28Xvc(dkXoVKXHMi|vLu(Ck2wePO00Q4>MO zcY(h1=muo`F|CMCLbWjx)83?D^mqb*dKbMHFlejWOhYMn-lTylvR&(9v+zA!1Ygfj z@;hE{2Dy^W_v7y5*fJz!Tn1EwWw#fO*A)cXJZzdjJtA>50IHkPOU zB^(CR(K$D2@etm)u6mIQ3MmbK94pTQs)!zTtRyN0MA%+*MiMJr5#|_IUmY zIN1NilE*<%*Ar)T>hL$W=0I+&lpU<(fgLm?pO(qm{oJoU4?}aNNN$VY0{g!MS)|X` zca!y;E4`ClWLOmOwdD3{5=#^LL4|TX&uCIDbuWczrfkLdJ&jB&Bzu^%G>=64?l%8Z z0138LLb3Glu^muSc#Wx!KCYvVu0Z@`L-|A4i54`!YS(gtm;r{ImDp>P=2}2@xk((_ zn(Ry`==$E%Pghq8ru-`!N6ll|Ic(knQo5!ZTBgE~CL)W-d^Z+c-r)KM;qxty`DjLyjKn%^0Ot!wA!dgv?KQkYy+0pLYUTW>) zq)T(sI*9>sYK8?v-nQ9|=*a~afElJp zI{?O#!)68BEL2pm=;$go0+~gKcWCAq7fxsNb z%C$#H+zT~pWy7@Wb~e~xpozrxv&HrTbaeYa6CE5$7X_aCpVc}`v8htRUZ61D9Rm@^ zpu+?HM_p-iee2zRMJ=_ndDZ!703?-{&!cP(QIx;Nw{dkinE6Yg*>dR|UR*23YB}0`&xFu8Ehc8{+e?a47aHrvRYbvRIDXxl<`G-}Gd>%Du zpW3eiKK3McFkxDLE18pmFute&2s0up>7uhboP;2#-Ycx(h)i$7Y)oPwK zH95*VXEgxa*5r@zRc-JNU{w=n7kRbi4%E8?(h2MjKL>S8)utLW+_Z%c8%`Y2;N3;T z&haijosn!A#7Q@&GBWg-ztigdGP-(+))D^_&X%E+-tD~y%8t0vcL9sGzUNrxk{qR%+ zkHOjrICSL#6~QkNodAsoUTq7&kx~f2 z&XI@7>+!{|E)JK;g@BKlT}bAK!mIuE+@U_+P`Pvc6Jn7(g$O_B5%imv*=ON`E;F_E zY`@bAbGSO9b~(-BxGxp7l&g46;(@y<`$u_6?e!6p^B}L3Yl=T}lq=rY<|EF#flVzH z1KSCs-HLU6gK=PEV0Cna5b%tG4#jJfn0YoV8&%j@-uwf!c$DekK6M|h{nUQ{{(@?n z5*=r75vsL(K6sS?yi61f&X$t2mfh1!2DQ?n zVAn+e3MByKbw}pHex zvz=)=$}@_q{Fi67T!nW^n(I6$0T^E(PlF*h_sL^Rwwk&Q)F)|C|5Ug=S9{ zTIhM&Q@VJme4a{2PfG@WVQ))h9&ZSfW>*?WgR0ia2eC{rPaw?4 zo6p9NV)IZ5GZaq@`n|Cyli|(VYHJR>wNt|w6!b0(EL2aS0gp{d5!=g(hedGt3uGLh z2#ADNbeqqP)edFJ(=QQ20`g0^iu7#?X1twwQ7chL!gvekL?eyO#>x|R}y;)g#+9xUIJ+GAl0Qc9C4 zKLM8_^O@L3?q(%{WBaPs`Id?|2)Wp6!(bpya-pvv-c>*7wz zid!=3V~C4M$RFIgE9nbWc>ljl323FJWR<>83a_at!JJDSB^{|hf!0HxY(D0P1%FIk z)LKzgp0pSMkvFH@4m1Dtw%uKm+pM2GKmJ!b(Edv7a&?p!4h((SI(}Yb`cp6YKi3xL zmG^Pblqeu^9JB=ggd2Uiy=3l?I$wg)ifSi|8DqCM| z-$P|pYjc()dfI67yP&=rXUKzGwQ6YZ`=isIZ^$@hZa}C5gQhR^eR_9#p{D_pTx%cg z@-7C~PVl4VO_f*gOWXddDsuN0cT@jd;vtU#?xuvMn{H{0pX$M@v^r|4X;~H91QI{-sbph4ct!Z6b(cOvt zhz~zoj+}Cd2_cPxZz<%e8|p2#EqeMso$ytTx8F`t@%Q%Xgg53pkYMY4(()gt)3Xdi z49z@1#92>8MTw!lihF!?k%QIgM&Z`1$_5Op~*Dsn$OvK9q&h|Hp`oVzJrsv zBhjxEWQe(E)_N$LQTjrM+p@IoRkr(*Z#N&ActC@8eC%k7CoY3Sr~~+hq?I~M*Gsf# z+7w6?QLH{mvi^L3*QyiOs{I1Qm@Hfd?NN;Ym^D!SRg^#c{n$=-?isj6i6ER%(vd#e z1Wx4%mOi#her(qJRd8;%SSdn!qnKC|In}WzrSBo+(aIp?6MLchylhi;`C=;BaUKaf}vQ|0RQ_c=wDMZ!^8mQH87LW zS5}C%lq*^_(?b1lvRqE!;McjW;ZafKhEHyT=46ABAFohWK#}`kUU*FU_c4M4Yc}5V^BuMDXxQwHp2^?e z=vIaXMYkWqERfK`=pGSpUKoed^O>*WYxmeb?ZN5#-~HjM5&~2jKUWdn6V=j6#KvB_ zu&Jcyo9z3DKlRWhLRyvkXX>BquWYJMt z8^dM;QP}lsMemoyl+=1c>B#I1G#k`6n*@#lYPJ%Kbaz_#De=-oubhoA&yb6<;-O@` zj-C-A=T~ykd4$whDs$+(!su*sL_HDI+|hJ6nqhIdIhUI{9^}%Pp@4#;iAwq#$x%cK zk63aD!gZG>Mg@3~3Ei|g%8u+Rwtfpi(zT*Ws=F?+yMGbpm5NAkV|!^lee&kk^;n@@ zY@#%_Zvj9wgF~HiYO3gFht@@^`F5_C>R)^6)IcH~t$5DiM+1u^6eO{qa`5?{%^u+o zO-0F|R6Ets>~_GN1tw$3HMA>Dq`t&peMPfxUA#|PeU4Fp#9WBg#)(4qa%yG28_*O? zs^uxV45}TQF>l`(AgSb2>6>OE%gEne%MF`lQyIm8d)jNv9hAGM1M#c?(y2s){1c3A z2?M{ZORL?TAR0%zm~6zBty(7*1tO&fZU?Q1@v1JGqs?sCXF#1cnLX4CSQYLwqj==X z3^R?dV}dqgc@YZbz`IhhU2cF}=XP(k13=k>$zQhz6|pK}Ze)oOqpEect~ca^Qa*FB zRM^qEyibZzDr;6RL~%tyVw)EIW}(>Ml?d!)U}{m9idEI?!RGas zr3aWERb2bl??{IQ0OL8Pbqt^bH#j&~W$@vQ($8Ka_V{`(MD&rbbr;_B;#oq2(`+uM z6&#(J`pOCJlP&~>G*Jt@H)o|)uHjK}P|%aQ%*X=@I+YLz);X85aY|;an?snD7_Q`P zf4Hv6#o9cJTqLs#!n-(Vb|u-L<_FRP6kiRn&HQH>3@vOAzn2+;Q`qH{_NNavAQy)cb4 zmoo^C^ZP%0bHhVQ7&ZXD4tEzAmR?s2u&c<{O&x1mEWJLDol+Pbc2^LEJR*Bwd&VlU ze6)3?O6jFYh9$E!Cju}{9^k#!?VumCi`F3lj7exHKKJ%W1jgxDN61mm4E@r-zY8q< zH*0kwrEPb1C8*l0x4S2UEukV#10Sn0IU~Hy)k{97tHb9Hfv4J&6ul0$j6G9JrpX1f zwH3}_*#r}u!J2iWVI3EH2zZmIPFDIfnOa^EtrIQ5^}#{ps46qj>}J4lhbvr*nosPv zz&5$s0TXBRvZuq(z}s<}Ra;7@qJ`LKFbJxd%6ij+qTWI*SfR=vN{-Ket0YvewW2}{ zzw^XE5m)(U&n{w>7JzH#$NK5*wXZlm4&``i$aH~DXtB2vJZVg`}oDk57;vY z8hkI!FVWT%xp}ZOTmewW-gfd%nI2mo?= zw<)cyjtpz=v?6$cna&b?^<`Rw3m%~yjil;K8WXKGS=7viG`qTP3#C6@>m^vjahY@) zBxmx@@{4;+3=`zfX%D_41OKn2ZDjhq+%7}|d@++WNKa*Zm7dM1dOP3Q%$ zc0*XMRbNF<95V()VlO!M6AMmz@NsJREUZ+7AM7nE}_Av7+1E4kuOpX=-8uTyV9hkZPF+zqf8eKq8e_%3dXU zO2Rr`48N9hOoME%bRxu9`{9JYFng{jgnjC-+(59u))L}O`a{Oiy|$uCBDSw1N&KS_L-Xt zbseu}ML*78niqpm(bz{W$xe}lIO~wja3l;~V;dI1SwaBoPX<#Bpcw{C&iWIG#DE&Y zkUXp8(j;5-!7b%-^^UM2E%7d8@DQDINkouxExV`XI%8DU-?9p!!_uQl0s3!@%>D)76>p5R_n>~Alg;wpP^*&f9Sd>3+to8XmhY_oH~FoMJCDFbjPGovSpZJ{GtkGfzw)PO@;S$AG3% z-d`ezEn1zstLBpxB%|CqRlW8zO%JT35XZq9n~f>dxKWb0UF3ZpZ|B0i4nJESFnjdC zLf8{j9ul16zD=YdRU!;=Cxc^hRSi#@$`ozz z#}NdMRRt>GUL)hVi5Es552P7TPA7Pk3Echqbxs)Y7Y-B&`#R4d%ootsj;fKF>PDy9ez(%Tp{Ofn{ zeu`-i!D_8mw3R)TQMXy)r_9y$NNAgrZIs7=u2m%+LICbdicLygME>9s=K$w;L9%jG zbC~ytQZczRt&XwvA+7dP&6|R`K-8{idA1l9RPRY%U;We6Ds^QL+4a5gfsI2=xblj1 zd^9l-G7x86wru=G5k52(2!KCy84YU=w(W%rXY57Z)-)```sWm zha`8H=R=&fK3<0$A#-y2O_Pv0tkbbnik%{Rhv8kE`eZjj$jRTtT!2$_3Rp?#kKQi z6EIgYAOC}a;z%XFa~&C-1*&88TFgvef)$a#wnZ)wA6waOvy3h(hypWyGG1N+4j;rT zHVTJd?eoIb6aw)$ zeX5e63G)jHDDD5q2dj6MjLDbz!ZChAsGtRn=WX8~A4$eGDI&BaoM-k#cpO(uRH9Al z94kA})eEg`KZ*6syAP0PdbT}KOt%gSIsEDUy$@A%;5^#U4MBM2pbQ+i8$nXDf|N$H zRhY$5BXvY@%RQ}{#g$$n8?D3e{{lr4y6r;pBFG5qCAsZoIXBgmlrA9`8{pG>+)>3W z4NEVSnT-(?E05}yz`P0&E^4DRGoddE`S< z)Z4y1xz^790ZBuR4wCGRh zfVg@atH5Z{Z^o}Ba*xq(@*hMFtxx_7`qj{GT30@<$z65)CU1AW^j8h_r_yKmr3^Kodmxlm z`wP=U*)6+66UI>4v5st))yCSx;06uzVgFzHxMWC|PScC@gOrgf(l@Dtyd>|*SModE zNYB&11V6W*>)$Wu-{C!-jiN8p~6Y@*o&e~FP3Vj7RxtlNWz$2In zkl{0P6Sfap>cycF|+0di<-D*n4y0bQTmeW#P4wMN}XhWdTi%EI7ggE@w#?kf?+CMq? zmQ#{xi%>kVn9mIB#SKLG-m6uI7E6&RWZ(w)3=VT(f|S4+exIuU&yp*Fst z3d*^eaWR2nE@mIO<1;|cu%}*Jmm&eEg07N!d@4@vbd}sy-8%4ZT~lO9(p=a$S^GPM zalf?FcW>X@5aF59aZg1?;cjea7vrW)4{t&u>~bHL-uBp3LtM!E*k-q>XZRVq{=@2Y z{opFzczqoWb)r%lR)eiuxPpXwKgGgxTW6I=;?MUWz((dICpok$I9pYN^HnErW#cAR z5N8aFpsA7}66$14lP}%khCUw!?g5l6XSyNh6m*=Apgb{2bC;mm@m%+%QElbieX ziaZEsWmc!+jwMt|n&=Kn)~xU#otj(qGk?{=y5VvbP1c@EIq1FNj-iL}QGu?kh+vk` zMB)B#D>UmO%H&_x*MxPoUWHs(vTLZ*_JueLIagaIABTKvjHO7CciJI3LZ#6urklk_ z)0uElHwVIu*cIpojIpJ=OopZ!+E8N=i-I^@)Em+S4Wj|l**Dtq!N_C91(Y&+))YWx zC7qadaKLbH%P*V&%y6ajS)HkUG5JZ7zPujw#QAa;=k)fhv^#qCU_TG&YAUvMy8%4n!C?#*Nega?UzXRmmkhf=$WDM{!8orF*~o7FIK;m?d$Z zqsVqB>uLwW&n>6%w=?AEfDnQ;R8uED$Z~N0qo!b-1Zhf+{(ch*up~KmXC1^`&KAQ@ zjR85jg%r{u_f<)##is=PVUrUpJx?(TS=lX%%=Q5UDlDn$81c$fYn4&o`AbvLX?-C|pR8bptmmWHAX? zQNnr&+32Q5tAVVM46=>R=o1SOfeI`xQAQ~X?Pu771}x-Y|% zxbh2myq!n_q@2*RfVtVn@olaXV3Js_rx$l|az~*PLG{c(AS-sU%p_$*SgrM~ z4o1?!kLC}sOR3@pw|6!#PsGxEao5%IYWaoga8g=dIN^bioMUmn4-vV}+M)}iY8cB5 zECYps{)pCI9k0BIX!CET0uf#$6?IX)7vocX7Rw{tP07Vls3FU4EFqxSGu%Ad7#{Qk zxeECzbx;7R=HQ*A?`$2uG?O(FLn%d1WkCq$U8-tvd5z+-L-r!X6`Nwu1$|1 za{LjJ5xT1e&~5d+Jv9_lJCtSAbWEhj|1vvNN*Rf@y7$N2{94MJ_El7eG}# z$Lcfn<=HF~$0;SI9?5RijlF}ilnnev*t<>A`fA*fA`f{?u3|jW);RNbKh8mpdCr&l zD#zvAEXeECbM;PrQNQwZ);TocZ}iyL%iggs>{t7A``vcNpC3`?|tx%Pwsqc+Fh^BxdQn4SleFeZos0Vut4&H_Bs)ukQlm2z-AVR z+(C@CQX?=1omtpYBL4(6L^h_x*=5b)koiruNblK%r;4L_p=-SJ1FaU01oX10J^6JR zsYFE~HV5DS$ z)^B0t0iRRTE89AWOMarAu)(^jhP`I?%qUIp9)}!ES;HVACNr%`Bc0G%{k`k9#t+c` z`~*y0QS5_DCVw?H#!fz6g4r;LBHH75Kbj71PGDLD-Z5o=J5wGGKodx4P>3Nw5Aib%bq9I?J7KloHSyIu^3ps3>gayziv|(+6fd6m$>yE3CV78-_7iJ+1X!yJ*$eH@`}ISw23!A z+PuxkX?$M$qfYZW&J^CU<5yA6(D3kI0V#pu?!GfVt$??`@^R)({7KA-HE~_+!Ef-RLrAVBDXV2j4QOCb<1F@PVuVXb&d(`D#Ol%@Ne0oNTL?$lJS&nPu zEcVD*EzYovb_p?(fg>;7iPnw0c%~TJq?sAQd`DGqvZ~&vIM(32IC!*(?k8HFeMb-K zkCE(-X_2^Mj-mz2;*YUS93#FmfuF(7Y={Iy*9h8Gb)P8XU@Q(ci)fkLA6Z0=CcRfQ zTb-pnf}-@5t z1dBElB*#!05SjR;(wsF``E;>6P2IO!=zFybO;U3+%q6OUlQPsgh5?jjdS>5C*|sr` znt@L@O!%WV;`#EsZHFRHy772DoNXTmS+{z7E4gxg0!3Qm6U$@Lzn-^^(c4KJylzHb zj+piR?=vrxHOOar|sy{gBWI_skkwgLK-)~96(S?$jvSE0Ox{LH(;i3VVPYG{=iEL{+E)zG+5a#g zgH28Ax67s{*x?L=#cQCk_;^W<USv^|5Y0-#408uK z>WnCWnD2tgy4%Lx5IH$wJE=V<83u<5$=-psFW1_|Bssgh-{;ucx3XQqlk*ik<_sYx zw3DE)398?uD3+Xk56Ri7sT|+3t*nB|B&!b>Nio|Q15a@9Yjk;%ofC9iF1M^~Ky1GN zNh<~I$?rm7i|O!)oaWlbOp_t=vT%kWCRm3T=33D|y)tA;b1CS5I*Ig4+LA(-pKI(cuY+2($Zy@E-1X?UFJ5t1fwVWZwoD_mb z3sDnY!Ib1pf-^>QLQHWBOSD=c1`qCgqiV5Pv}S_}TV6^QQW2k$CC}buoNKP+I}3SC zIeQaROb2Ksi!r3w*I0Uluv~Ln2)z&_RYQHvY2YE|re9y9;!=th6JNB;Wnmi~#%s(0 zVQ*>gk+l>%ODc~wwfcfVXjrtJ=iyMG8KmKc?$yQ(fJm$kc-2F>^El02rsQ=eY->!gMc@PDlul+yV z|1QG$|D@4s5{(jtmVMS}n63IM=QpQC=~|g4Pruw`ta==-KUZKIi1kZ|%yC23W`{q{Y8wam(WG{X?2?m@jYHnr=_sxK;$|x2 zT92Z+O~=?IvZy-ixcoM`W%OF*SL9b~OwlGIX^WRVR35zNqUa0rU)i$e2bz{BE!!jk zJYth(8DG!YR8wTxnu23Gn&%b58E1(x8AOitu2PlzxZK@9VnNid(k`oAthbg(-0bGJ zE?7A~QCgNgG=B2Um?k-f>dH&ms_Iu)6o%n7wFAxFvUNl6bn_DK0)rUbfu2yU^kk$S;gZGuLK{a%V6|br(vv_B;p$25eZB|E5q5$dW}h(=6Pa(y zXbm@QkJvQzRP6{9IiYq>jI>iT-4Wv2N1q{Hvev&~1~3{`iOl4#m<5bTUHtNdtIlJL z6ZCe^`BTIL$LHiUVBXvvB8w zJ!hGHYK;`*I&iT7b5vmO(fIz|3Ia%^$2?-FycIPb1Q;ka7p-S(qH^iHZm3C-dY<qC4{6JtcWL apg(&zJ}^J+{TDwl@56sJ#Af7OM1KX@inT}p diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot deleted file mode 100644 index 734b92e5112836ae2e2f969930b5cab297e7d4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23485 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 NId|Y0FO47_Q~-ha-M0V$ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg deleted file mode 100644 index 65a4c0e..0000000 --- a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf deleted file mode 100644 index 1077c72aa8a019adb0e61e1ebb0431335fe0c0be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50820 zcmdqKcYG987e73A%5HjgQwf3eMllJg^xkXeJ@g_qlpr92f)oJ-1Qexr0fA-Y0YwEt z1jH5_3L=77&<6_^EM#xq@42%xy9+$;`+Gm{f3KKiXZG%$bI(2foO@Pck|a6tOO+h$ zO1kxY@W7J&lH{5rNm0MG>)E^IsaM}Ck)*fEB#A|J>zR|cZT+F6lC=GEd}`>3iNngy zMZL2@l6GE|B-_jpGo~lmLbIDl(t*o(f57OnF%uWu8L>~2UhId@zcyyrv@$6`ip2bw zPYM|`Vb$(RkRwS4Y5rGe>_w_AMi)v`YlPL_mnKnB`K0k z3Y0>maH&LcNp1SM`k8$xAPkWj>9)`?0N}DYT&&_gfCdB5U;@-;3#!vE`SbWc`eUGr z<>c1GgOgc7QC>`xEhU5P=fBipWB7{kTgKym_MUS6-|ssP8M0=`5PD{u^0r)RW1yKp zDMMF-g6Wy6!xeyMDml6wq|gmH$7Qc@DReuxUZj%h%-85wRh?JAV?*k^@{Klw_mt}| zqhFXa0VFsZ>xh>UrRVj;q-2^R5h(JkBLtv_m0vJXj;L@2I9yR;R7{0Sa=5CAI|*0^OI1=M zQw#IOPri~LiJ$0X@souzPw z^U>`2qb%Sk+ro#^&r$yOQ9fGk&H_M^QqQUkwYzPt^nf&3ualjF6&Sl1gk=Sp3r@yG zGObZg4x%*%Ib5L?x-&?iEXbipF>ArHL$B_=N_M!?D)cPlQ^^j!j`bE6R*NeDl!{`GJy-Ej#o& zwsU6di?43J^aJZYYH;hWY<{-^B|RoQHEPcn5g&gR|JU)cWj#A|?AxvPgq5TAeID`l z`B?V{Qy=OM?ix^aQ+rl>OA3{$OIcE()Ib_1xr%aJ^>f5tDp;ptE;=0->9orrsGtg0 zP>$~OZk^)LW4%}D4p%~jD|p_{VP0-S z+5PWE`Rqn@-Qrz4pKQN)$M&ae1uYgeE@;)Fe&q*Cc5GYKb_wojIqe3GDQwZCz}-!q z+6}@+s$cbAtp#wBAZ1GV(r{z@ZCJd`#6&e*R5R&43KvmC3*okEpang;nvF=JnnO>t zHdjv(H}%?L2!w-P&w39VkF7P<8)dgg78NEt?6Jw2Hee-<=piz%nAt%IF-lZyaZ!s|*Zea{OJ45vS4Qoa=>Dx1t8HuBufu4id)tw<6Pnk{ZrzUfppJ5q z#oI_LMe0nWC6Q!t$rX?)0GZ?ni%sz%$4PmKiCeI)^OJt-icqT%RlCA z$Ly-lYOxJBFmo1Wp6Z!7z<*{ICCm2AqKL>shn!g)6A=+BPhI-^lg*c{Q!w@NTgzm* z;J%;prVbSTunv$=i$7+#wMag7C`LPzPS=@!{tf&P)^2Pq6FYi}g8}Rx9yz$(lCkF7p zX0QzY%@lgd1JcuKqL1cg<-*WGk`?Fh2qg9kw{mFh{?eN@q16LYw zr4j8*)}!$`(qQ1|f+ChvGHzT+_Xi(j?Vz}ZK0Q=oRoAN)$ft$2jKmyci7A|uF84Oe1podU_%ANEc|IA|ZgIY&N?+S?yjKz&_dEqidI;{J^50 zSKq8^zWABfITDKTbUPaI4`Xx=b2Gv`Kq120I=Mo3xJ}?r;)d;SQJPp-n%F zK}Z$i6c(h?I0hrlS^(KY%;5^D&;x|cq=$(?v><0HNrX&Rm<;J)S3X{|h97jl7bUl2 z-Q9bbEn05CEBQOD@O@>kQuzdXBZa7?1Ut|XkkypN>EQ{9c%DI$3_HNg9SFxoIB^RQ z>_dwIES%sA$kF2iO(RCv0*K_WI3G^Zqhjf%UNb%xe;{ij$&4nliGW5Y0gzFg91}xZ zlA21-HiIqGET8foYrQv$Dv~&Wan%5>3ByX-r5E!ip3dk$Sbh{)hayta1onGl) z_8^K&u(kpCcEaYe`z%4uEG&pf%U5tW+5y`O#G@<@fBp9wQxCj;b-{mEtp8()e3Fg6 zA=fk2dipgecKwt>{4DXO62@PBlH=LW{1{5*r;JUyHC0;hJQk0^jt?FSoVY`rJla`;SvVsgUWTRu0w}z7(hJP4eM_QdWpgM`x)5vQxTC^cO)%Uj-;iM%9CXAD)Mft-K#Tb$u)f! z3F4MvnSoAXB4VSXWHmL_S)8Wi6?>#lRE&IU;^H$m=KuGpl|RgvU+3F?h;GgXO`Vim zTGDRla5;ZC3%R=d*X67DU;7`s#Wx*?Vs^5Zhb&*dXx)UVi>s=n8PK#ps-vU~DS}DN zE=5R8Nr2uZjTsJ?Rl=CoumY}POr{i3^%vf?Nsc(;{%mQ6vP~_)b&L;v#e<|w<4tqo zaZWZ*POV(7OqYkf%->^Uq1eXq_kqJlS-hH{TmUuMrF6+<&v7YmB7rCi1unZoSFJ1T zy2or$6Do%*o9IXWh^g*2M3YRKER`!))NWpQgt{kqvvHM_%E+s!Xn2C69cC zlCZ%^w88O~MMB1w1bu6W z0dTzC0$mRZ6XAkr@g5*4Xo`&`8IWx1KRb*kyVou6*K$pl`Hefu{DA!T)vx|+*GES9UJopd?qhB}sb-lG82)Nu3PZ_FC&^NQlr# zrjhX2h!O%-5r+uO(Ypn*!9HZH2Z?uxei3;Q{}g2pPwd5?kYiX!xjJ9W6Ig?d%)x&} z^ru8lWdDFGCP98*02E>1uSDr7y_yjzfmQ;4;kVO6mwwvTvdv;8VZg-Z9G)CIFIFCW zxLfRySb56fd9f?#&sVX(;HJJJmQB@Piv_shUM(CDPMVgqnngWizB4(= zYxZc0Qz)&>%zVRfOr0bLvpAMMcGT3_{1(6c>vuy&|L6A6X~W0Ocu{k`e|pN6jD#IC zE_^1-mWaQrqwzA=1WZ7 zS~>BvPnvyv0k|V51_~%VI>|4ZU?DA76$US2V%>tV{U?I`sFl#?Ycl$p@=LjS0 zPxt5Y^2%uCC-+o2OMZ~=_;*Q*U>4J`wOfuM#R6jZ@E=(;<)?&KzbI17Cd~XO_$KsDM z2YVonABdPa>G73p?UpB6{UP@}JYW(lW%cKN##-$E=damguU7QC^hJ}eZ;>9uE^0Yq z7rPsa@Y_W{Yv1H{A&9K~4Ga=a7;t)m1d(?$jS#fCfm#mV?!LpfvLUj@2FpX;TQryZ zxZILpScG5S00sqoC?+>uXK`UZ)|ih$q_R>B#^=&t7di0K0YwNR1LGMV7oRZq!IGH1 zv=71()_j^L`dBFItn{((pZb~q&4#w=-l3c3s*GE9Y38q&M-G@c+{9Bpo)sc>)+G@Q zH=gAus)fcgAM6)Dwj$(`kj}cz6w-EqpkfGWmMjlmNeG(F8ZwbQ~8Mp5;Yf)Xozikx8m-n`cSw@)9gKYL}gPpgoP337<+Gf8n42n{`Wzg-zJ#b zEgonocG5^fRFXzQ+#Wjs$3*-I5`S{*10ss0e@j>|`Q=MdXeDOAZ?QryAh<(nr-4=^5y*MR&^swfAtlXvX$}ms}}RW!`V~I7p`RT zu}}HShxW0i@AtUC+UYL->PNPV*ZB1D7ry)Y6OT@~0c-_JQBoH@I68)uDv}PN9*F&d z-ljXIhbTgChxiFZ$figiJt5GQr&7QH2?^mXW~Q?D_*S{iZpNPEAMo2(zZ*S%(vTn7 z&pbkNJ$!xTr&TO`^x)C6k^hsW_WU*?&!?fQQh`gS;q5vdt~d{5PMC>KlYA}Ga{3BL z3$p^3_E>v548Xe)>Z4;@ESmA(i~MZey2pT3Wg|;{&BE%kb1uT~@;VrI=95s5x z6&`WG|0i5=KKR;r@J@3`#@B%JENQGBQLDBk8U5sW0>Dck@Z4{NejZjsZ8LCnS zPvk%M<=;NZY?XV_oyaJ+X@(m`femN44HtLkT&Fc6gt&! zmU8Zb2l&3ihS@%!SO#&^Zre|DSk$k|8wNsRASeCg|KJ ze`c%rgKQfg|L3240^7>Rv6afZ>>GEsJB9tkBjqddN1j~?0z?5)z575Uo@>f56Cxml zo{r~XJ3s|^*a8;99_DrU240uVQtHbyD+jv&l!KL>SaVZQvkOlMlv*24@SD`6W*<`4 zRY~}Oh+Al0ehk#?#zT{x2z}#MH2WKx^=bKtyRAB&bpI>L4HkYFPn^KF%LTT*;GYx; z!FvQnd}b%XERHocrLIY4@dRIcWk73hBYM3@&F`_Q|*c@P@1&N*mDueqbL&L&?F=;LP6TJ zFFrwRSruW-AeB;+$d|bg@(Z*42i*}yqW$n|j&~h!z)Kx$aPz(Mr?(GocRYMA+cn&s|{Z-(w$} z$q%w%w&_UgM8s8(`(bu<}m8 zTsU%WBlXA{H3|4ghbtI10VNVmyVAsjcO&qQWzlOPf~|wZAF{r@W(zr3UOfi%I}kF; zw1beG2yjLiDKa|==Heo?)8%tJM}_f^SohMk=P&aEJ^M_pTc`Y?B!?UYY5nzr$u`M- zeLTOy|4}zA?8|%fnce`qUr=>Z`5U`eL+Yf*)J(t%j4c!?2orE0fn?%WSL_r4(<8%) zQ7QcpV{tG1y}Y8#WXd#B?7#@uiJ}RSE0?p{b!Dt^)!R4uud}|{@bTaLbdNR*V(eXi z?b1g7hGj8Z*p54ke>~S~!0y7q+vgIE0ZKIym<~gvahM(xM|mk%jKie@(>4Rs0=Xu@ zmH}q%0f|#hAw8rA8GoD>yo6?7=p!8wh{ln9P0=|y9odCqCn6vAf-7fNjbJ_aht9EE zPJYe0zfhK&UA7@qPG^i|O_kIBm8LIYS(W^1Dcdl#5^y&G+;@A{@MI3xl{F7hWPl44ITEXt6_{lnjV_~y26Sb%$Y#Oz^P20Y*F`+aL_z<22r#cKUrV;5h> zzjZGdIJWFa-!V$*>FVA4gHljsCVy{>hGjlNw+qYMXFV9nzbjQdWHZm_W0)+sD7aO86u`aja(%`PPXC+=NIi662kHpR_=P} zt42?jK7V!Cnlpc}9&p$5>P;9hT29|l`NY)HJHM>>c*=nGXC{A_GM?q|z=i8Ou(KVv zVo&-)+h&32%1LzQw$xc}8DZ;U5 zFHCshr6Y)|x9v5y4rF9^<;;>#K5+MzxA*DZvhr^{UzU(|WglsOLW_h*O?A6bX@^XJ zK z5b#$AT>;Qo4Jr`AJs=e1)XPQBp_s+lp)P5q%CtQ794N0 zOKd357mFDHx$+g2_Qd~H%%b172beK02x6@ zE6^Xn;0dS*6Hj&yA*82pwuUdn&s?^82!GecDk~mfjd?5g0@aq(I;vVY-g3p6e zfk_O(Xh3P34^F8mJ*2BX5o160_2UpfTnf{bv^cHK%-e~Jc$lv7Bx{*ncw?IQLrJM{ zFWRe-1rrN0!%q?gR0O5@k{sI@Jnhtb?I%^R4uSkY{f;B+F@B(^^RRq=P;EGG_4e(2 zs=K+ouV?4}VeXppp5C4NyTesjBMg~Ea0FK7lzQqRK7Nni%KR2%DmMYYnR!PXNa!^P zD{t)C1GOJ>urt8@JO7TmoxHC{m#%IVKpEPrJzxq$jYyFpH2p-8 zMFn0jl_ZKc%V|m!$r&9*6*8IWBt%eGMLKEj&CS2FYW(|OzvnlCSxM=j!|Jg;VRGg+ z_Y%}*s96VmHgw0+^$_3ITM9GTw_Unc%K0*hNMmbR+1<%TTL48V;7JGMl12# zbpgD&62X(^O04LgW}_wOLB^l|Ckp}cJ=sY@-N!<>`qr+I)mR!oFl_A`*I^+{uUmWi z#t=D+$t-Qj^nWwhzmr%k&cE!(UhG5GH#kxL9V-ZtN<322fLySc39KLFmOUNhI7B@4 zdHm)6%>xrz4r|7`F?FyWVDmU^nTGfloF@M?dGiCnZsXwI>x#0Jz<`nNo@&Eon?nFY zDr~^ZfFWHvpr>YJ0s{sNep_#Gwj57MdHo4E1czUd-95mlSU+AOhFQxa`@Av zZ}IwYdQu_%QIaC*omO~9pPD4xk%DYR*a#|&dt|0y(8qWJHB?g+1G*}b*AA%M(dYJA znE3p_6NT;jo$T-j|L4PHmu9m@^3YCg+OXU@1@#Bc@3r>isZH}6)qS9TT3oM-YmSY4 zaY&~&^?{v`s+;l)T07{NA$pk5F$Q*oGjHyYpT}cH%*dP(32t%)74IrxS9nXkNMSiE zVD^yaAtOiF2hkv_j6$-3oa}pDuiGLoW#EVdyOu81+VS6iAG|FYNQxp&UU^WAgRhVE(dleGR| ztUm$J`A2@thx_ri#m*$JOkJc)qRLFS8GruoB0td^St-BH>hLXlck@jM1$@JXD-KrM zearnRiXq>S>&S=)R#oy&YF$9&kXq@8A6XRQN5y_lpTG(kOj5Yvp!!e*#h&cKN&<%! zBkv=JA7&5oc9Eq&x9m{2U8jh6z650}pUcDVII};Bx>c*Nz1kXhL845#2q^rcLndBK zn)Hd^{2xb$ZnB>$A7oc~q4E$Iz4A4AHbYG>)hDl$r`VdH>Z(YOs1_&I9pV$*iNykK zAtL!_Lls)6X&dShqOcmfp9U8;wGife5mjR#`E5sCd`zs2I+$(Sl>fMz&DCCcMVrgl zjbandoWK6gM~AQExpKd}cy-XAYoC9a3m9JHzp;^KWa*x|TExop*~ph)=D*pF6YbOj z#8W*GYaWP$4Txi5UBwc_&R}8dI&<_0FT`2|l{unN7r~8!;*7#V@;eaih{}(K|0HX* z=4!`|X>*&sbeL`1X6Kua0?2Cv2VT4QWv(ml`pa*>bN%g4`IZp`Ln)iA?pInv<~7qD z9+?-0I-M9%u7_H4zfv6%VK{XFRqvzt!yKrG0s2I}aRv$JOi@TrGPzLQfArZ-vz}{_ z*Xrk&p6fh!ZL|CqO5*984WAv}K|TF_qqQSCkamBVFK4%)mkgi6dwNH@Y)D`~juylN z+#p@#<4u?ccp{TQv2=Kc?D>7nS%*KzrWln$^5n{zTAX=)he^Y$g4GNy1JSU)x+E%^ zjHiji1SY9^8P(znL`0&1e=2_hGNMST>(!!!6&ZzKmo?6cj);>ZGW_%i-*Y8Kh@_7Q zk(}Ce?&KGjPMzENs!xby!>2WVyitQC-iWx$Qfqv5t>(3TR-}YUV<34pXm28`Uuu9Y zG?N+BwPO6L730SNBt1bBaW`b{z2_oO@`@Y@d?|{>`DFQH6Nrhhv9VDi5S0)9&jbk@ zyX(=zu}G3m)SzGQd_1Os!nAGA+y4CU>K%S$Nq*BnmM_;Uo7w_Q5f&nnv znf6RDLqTz7u`q;+W5K^sNW3u^3!p`+8zu6zsp*@~zq9GFCl`;Lxbn%T)}K7Je&thZ z#t&ciROPG*$IB)kpD^+D$z`uk96xXF<13%o@YcIqSFc<(t$fX@XE&cex#7uG^20OU zo<9BU84tZZb?V#1Lk{f3Rd9WbG+&oQzRkyOFgL`n*wgX@Bu0nEU?hmMV*xm*QGqb( z;c(cxFo0I5hze=eDk+2#=)DRRr?IeYNbbR|P#q$iLIN9sZ~8|HypaCoLu}8wiAesl z@9=9Z5p_J<`AOD{pZuLa!{#Vua&vdl@sY3df0+ICk;mop*qev2X(*)uN7@mIql!n; zT0&D`MU*tD178JCpocsJGx#!oepBKrzg5oRCJrTp8! z`5*ji)??JPlhgR~M+R+tlBN9dFRRWEju|v$WEo3)aY{q?o~Fh1`tO}le-iuS(7-Xr z51qYmrc>vs4cm{LxOTLwblkB6pIm*r(}0!@Tej}harnH}j;O4X*6j*Y>UM65(@(NA zSglZ2X_ufqBPrLRA#Q;x6kSqGrA2}V+m6i-rxPaDVUJ|%)gR6J_HEX@Z(q5c=Y@8u z>!hyM{}eyKxeo0bcBnc|3DlR?>WK{+61s5OFtCDtn>&?_oys*)&=P zwaSU`4fMe5Lb?%{b65&=1mZ?$pa^w1f-I=P!m-wsUfn4AEkrcmy6MVBw${25S|tez z&N!KsDmKPbl~$M@6`|(mrA0X8v{WjiM9C2fCq*SN^6cuMgZz!xPi)%0f5V`DgGRB@ zgZd9}hp%N3J9jYWGtcm!w{PaZY?%Ej>%<;qonAf8kDfTmkG>}NTDR@f!&44?x^wN& zo{OhET)w#b@P#}1*ZW^&39K`#xo-!*y7xRAaP}t)M$yH9gdBvcIloL=%>9_9RFZuaE;l{dQQGi6oq0r2BJRP8`MnQ^yl)>ou(R zk^MN7gu&zu0zYQ%qsYj8n94WW85L_JKWw01xnGdI%bXbtUf4f+dW#PG4=!1}p*r7^ z)hm8n=RWeu_*y+4esI#P{CWAgVPhX#xsab8)_s0@+!EHfUO%dFZXr!qUQ<>h*6R9H zf;@1ssUo)Y2%Dk2p`@d-CtYVY;#&%Y;TRHmr6e){w=A3M0<5SNKtk$`bMA#oD^v@r zI1;T|R2YUBRld|1r(W}$G^GjhMaU4pBP-~2BM&Bp8EsOdB}gMJnxUswx32WWU;#~H zj-IRvA)5^POm?7nNiRqgM@0*A^aStt%!C4ZILJS{!j3y zH|Duh_m~dQzAtXU&Lh+GaLfI64WEZQ?&+$vh-xskA zmRk9=GD&$Km6$u&AQsM={rd+F9WyCkUN66*y$1iGzaHSR#!2T1SIML|5l@VS^oy~e z(d8IXu%(0x-varu0PlNP6sSp$67Lach3RC6kdd5f$TXbQuqVr}xR-^cB9vMe|RV{gid`f#28Q7_MLV5-!H#SP(%Y;&R z4+JHP4aEp?u1jA@*6RX!D%_4()HPd+0r+%|Na#ir zc+#XciW%gKy0F3mlv+ji8lemaOJdXI_JouXts1ON_B=g+B%e?_$)36tz5Hl`lksIx}h=!5f32b>!Sit-s zWC9CLGABiNgtCSd<7B9D8~A7;>(1ZQ`p@d!oF71hV9EHA1Ld1{&J=b`;XR?uvC1A$ zyQtbj<$N7o4yFjC0i_6En7b!HCJoC(st_@K9Ed`tQd&N2?Nue;@xNHmcdS4T;1@ov z`nQDUT`H@LD}7)ufXh)`>OF)Ca4nO7wZmJ%*unFIpebTYt}9?s7Z}g z(;q+9B_lz5nxI<&&PsrUu}RI5E$~(d`4t6OoTYjXXIi9Z9nORbu@|Q2%L!k(*qlhr z8=ba$Hc63kSyyU9cF`Htd;_V%PXto+z<3esLdh@63(S5GWQtfp(WRTi3zruq|(%+SPvZo2R#H!zWD`Rx)hT#L>`{U8HHs+sf0> zl!s8BVaM-HsM4sCaQs;7tL?=pp|e$A%j@u0XDLzu&J>-N*Fu*%42VsH3XUxhj@tNMp_SA$7qxnADiSs;kdX=0pZ?a7f5ocNT zSkIAGI*ulMU5X$ji$jU9=ZcGqn#ts)Lv2La9lr#nT36)Y{EI&hG@PtX=+k0N!7%%wOA;LQ)8&%E=vX3#Mwk2ZF`30bfKq)tGcjNYkKd&cuf_tAso*`JxgkFhH=CMDf4`L49Z$E z8M)@g=~1zan9Z(rL}BrVZZz`85q+0w?{Q4woY z7`Isd=UFx?pGskykNfx>e?Dm8PCBFO{8rZ{MBA z(dMA)J-(myJTvB@8Kbe=oK3BG;=_Mr{v>|K(+4ONUSu>>|YW|FXqNwWWS~wK{e2 zbOSyi7R*#S_zc?{coN>ni)=cZBNDq^bOIn+}T95V?RSPgnvgtsj zN9wW9k&X}k>-6m*^?I%N=bKK?)^5~$ZsTrwTUwQtH0jtv?eyiXiWkSP>zmlJ$FjAr zz8zo9UAIN!TJ4w4>p13xZjCyR9ZR%?su%&qu4fRnqF5Zo_EhFjX-+y0sHT!n#^`_}hN>5SUEcC^+1aa1sd}n)i}sz7 zy9@d9eEHl{pWJpo7B+kI++j_-xB9m7QvZ@=T}LZTdh`uug)O5NwQPNK>!uf3cFRtU z>O?;K#=yZczkU6{@L^f;?-#VW(ago#H=H2P7&d}xdSp>yJ;GK8)k#?r@{gj%ngW=n ze=160Od7Ldo?+EQGzQiHf-c_Ew-gli=JG)Nl&+Rx3sD$_DylL>C=O&5TO7;43WWk8 zXr5Bav?u?5Zq3gNe!VbnRK4+f*Ci8{Ot|^d_AY!v>A04U4j(vDtHIrTN`piE+vnz8 zTk-=_n=TtYX-2P>>3`%tI%>w9MLX9GYq_|5^juI^BWa4-P5m0Ls4k?L(L2MtVY1^8 z2_j*-c&kppxQD{c+fkN2!y@1fSw~ErW;KY~?aoa#%H3%63!|<7<@`TbY`ejOpBg;a zonZV03+{U6o`cq$yd^#Sd#oqDE}ih)Ykymb}j0n=;ODW~#)JN%>Z zJkY+y{q2J|d~!!+NxgXYzATFDzhqcTuS3R1LT`EM@BAD$VPTU|9c7&7MJbRYN}TMa zDk{X6VGdedk>F||)(V}9;J(j6Wyl|jyFqinHb##Lk;$b*u5dL)85^Rmpd$Qe?aRxJ z6J(=D8)wKWH_4j&j{3#XJD2G=nVNR=(@#HjA3s9+{$c!jAKr`qi82${rpWhH_q?>lciIq=&0C|C2WZDbfI3z zv-xlGymUQXo<~@!4gx6$Z3jyo4VXk)))aQ8HKQ}be)?Z9Rk-W|1OP&v+&mx%0NBrq z7xM%2=d&Kl#@dH#yJO`?vkqs;@8a20cqgp^@DTy7vfb^Mnl^_YrJ8#qHpZrU86wY_oMzK&*;oJv4x6^>K^;fj|BZ16_}jmC&fs+`PAJ;8Z8SV zVMRoOMSQx-!D#T7;(|EUpCT`D|(TeYB8O-eVJ`_z0I0dqKv>Q~j(fHb<`;D}+K_lqlED zsY}*UT`c@WU9zF-`j;q^MP}`)9w|zc^|*Kua)pVMY`sTOS??(<%4F5D-m_HQ-L?`a z8E8Wh9O|--8n|>SY%b_D@8;%9%O0<|{IC0|h=&Hu8`8O?-M4c-U$OM7@A>zrjC=L4 z_Uhg+Wy+#hoYu+Qac9Y#xibIf#*2eTrzO5$*!s~&S=7&I{0fUqLz)7AHqlqdx$ z9YWP}h?J)*K4**s*O|h?A{Z>k>kLp4GdZ&8s)hn)XX%yqTaB!iTll!T^40Uv{{%gL zXBw!q4LaI2!zt`&#JLCRlBmUW#dt{czEp{Tj0h=eA`9%?r8?GoNqLA-R#~|M1AM!)W`k)hsE*!7dgrz*fIzumV^w~V!%`ICqGKNW}2*mRKfgPqwZAx!+;hm{`Ps^Bwk>yUx_M z-0V41D^7o|__JGOz+ZM*$3MpokDRxJZ!6jSzAR4H zibJ5Xlm|~zSD%A5lz??P#6FSTa^L!Rt0v5*ieL_mfne{t$S|@vmDW|my7Ka^Sk1i^ zt9f((yXE$>rZ4Yo0ORxq|KYBp)pZT`@XG#k4%}V0D$X?8CZM*uy3|XL_0dFv{Y@JLuQ*%Xc=&L&%Im(xdkbSmPXIUXKwbT1VLy7# z<_iRyAbaf%pDp)T7>3Gbmp?z*r$cyN?hLizombu^)x1k>L(+7ZdP&(2n=8Pmj@QFc z$^e5p4!P`Vi0j8;gG6>yuAmcj&_OV+>_{cs6YX%|6_xx>EHgS8hoA}(L)*`9Z{Ex+ zS*w%k_n}LcIN`M5DaGm+$|lfB0QE>h>QOv}Q77NS;m8nRCP@`34x!;NA7mg7)4@c) zxf*p4$1d`hS&H`XqG0|ls~IS?fck;b(k8=JtSusM;R@hJXE-oLI4oq+@_}AI!DhtT zup3BHBLxDnq_jNGUFW~;^mqrG{KVe9Pc&}TqA4I9uU4=lIKe=8en$aAp z83BvPrJ%WoR-Lfz@Z_Yc7QW$L#|xy=rIpa%*H%>gHZ`vx6pY z>kw2oo8*6%`mwS@tAgERCn(Ik6MPa06ok?$lstPgPo$XO6G9#1o&cAiw1b%Kp0rdd zV!x^KQ!Iwx{^p3t*L*&~?=HPg~+CS+dgIAX+_p~E^PW@aWPWo1dMvQn+& zdu+=Q>7-M?9-KB0G?3cNhLUm3D_NLGwBXbO85uxgCM70|MQqR>?T(0fVzIsAlajV- z2XmaE1NuHPvLlwA2MU&u#S9R$yz|EQAFJWx^`N|KVRsDlqtIK?1n%?zMa{%RE8 zeb=H_ulc=tQ8r|?+)~w*j#69cjayRZ_nOnazH&?L0`9ew-l&4pHhOe(qQMDhgmu)G zg=Zz}0f7|WHYBSMQ?NF44H++r)KLR7D%ng$?IufI(?hw<#@Vt;);xA-=fDqXrj|HF z{G^aa{xg}@9jp-{XN`uf$o=FaM0#OOPx^4>R#e>h${kn)Wi285_sXmprom?D2sgVvW<(2&E=glOgTFIb^%Ehm985p%UeW zq5-xHX>S^B%1ftBK}+8|;}^{zS9|<|$Hvl5Nz>(ys1ZT`J5jGB+eOe; zv?-2+#Kj@z;WysrzcR=B=;c0zEsA7|2%nv$X>uK8%*5xYL7ZJ|s6rdcAgd!47Ei6e zKDcp1d796TE=^RXY1!aiqazMgSR;peR(pGiQFUo@g$wORL>eX4uN1Q| zKNB{vPdR3EY;tsJY`!w=S32=vRAkDVpI4rJS~ZF?pD07&UZwUI`y|pT%dEY3^q%>m zE_2uXJs?O0(R#@?0Wk~eL7yre^6B`QD0-_ULt+sUV_<;An79$WWX%iHq!Gh}5lulK zEk^j2ke@!*$Ll2V zI)&5$VshdXX|f1jk)J@vD@0O`;k5?5X?suMKeW5M{1xAN691vk5Cg}S@5 zO;i56W$zYumCWb|FWFnX5qqoh*518)!JG5pXHyS>MEKd;^lC;t9ew9g|0ixtt4g#n zF)z%%}b1w)J{;b8!S^cS&9T^`(aB|G48C%Su77Tm4SA#zV)C z9o$kW;m&5+IG3_>mmIh4RUWFj&K_i;{C9p~YQK^(GWc#%)y;tAz)yx$1X*U6`l>Gc zMWq-nP71uGB1>Hx)uEMon9&~<)pDs72)?*7#P2Ne`vDI=&1Aknlpn1Le42!3(wZ1% zIW~c^IIjk?D+y+op~H`aYl-M221`RC^6{lS6dMJ3=@8h4%mwYiumbIYCSyd*9wcWG zA>IP{Av~Ny`A!;{h8JQbnd0MF6?!cL2+UQdLa!?>h*WXp1mtR`Z%=^jK)GXst#Jkg z??vVpgItSK8IBmo7OU^xY{CY%d-+oAE&kJLzIJ=_&3w&je)~qXiUV!gpe8?bV6_*` zi+a&L_K|9PIl|_zqDo27I!E4KlFo_bcc0u@0>Jg694VlXVRk6ABP?_QQq?cIO-zGcwtdHBSgm9Ny46* z@PHCCGBYVO#_*Gjw(0moZE2K!PrulW?^jEU_$UOR-(=m{l9r=X)?*+4&k40*$^Py9 zbJk#Xs9Jd*j>sALJa4E3KO*mQ51;zV6iD~pRX?fyAl*}?C7$@;eI%G!_M@l9P;%Xs z3hC}80}zEzDLuFlMmBaB)PdiqP>h7Z7@0`fN1q}SaG_6701YD`s$elEk&qIH)`}z1 z^iv`+P9mxZjX+}+vi0nufEya`oVM_}5nbvmoX>ybCjxfv-1$NzdUZyOn_H)A|D{id zvO<0ijXx_NpPRscPhi#l+A@3d-z+AP|Cad3g3YLmQAwI>m%(w>A*<4G^_m_c`hg>2 zLGly7L9zIq<>53De>V9^92z3oZL=$N^n;WmXijbrjB>A!>dLHm#FdG5#XjAlPDmJf z&`#s=i_(WaECpVH(*WDokX7KV2(t4DJNUW^p(M$&h8&2k(9=XOwK=XdVPk_JEO}1C z3;GVclL{J%%mmKT(F-J%B}eDy$>`PgJpPm0yvE`ho!-jW*0&n)-_Cs~!{j0Ohd&}+cy)A!xa zHn8{r`kQ(4#JKVapBQu^MLIwyE(Jsb#_*1{0S|(rZ~!OJ3XY+Snj#t`!((Fe?Z_S5 z;TAJA6D>|I#&S_(qFi~WZs@t<)v>#uXV0M5Rw28&qBd_@%ofyrl>gpb*{@z{*Z-qs zt{fg3E~lSV7JM{B6}_WsAx^XoD@%}87!2Xp+{{eJ>yb`j%taytk1feLToOB!`lD8} zP9&i@n#bUQ41{R6XjmT zg(ArkjhqktIB`0wP+hm3UwQTDmUZ}#mF~cQi=SfhKP^AyuN;h$AFX|*_5}Q}fSuV_ zvM1n&$19gFw8dWH8;`W!ka987AU(+EtcHkRnp)W}JY$Llp;D|cQ&gBJ-i{KcKeB|u zma+vR0Dg=ViBzD2iUVyfUo5L?%Tjp%H8kD zg;V%v>-V@=(($yfAeHf@9vV6-B0`xcE!N|bM8$F(X(D681lgI~YUW`L=hW9~fWZa+ zf=LyWb9hM5AMk&D4~BBPa+NY!Zi#YTj83VVgmS5xu>Nb1$8jV{ z%hj4gpC4YSZPCD95;^hkrSa_>h4AKVwv(Hy=Uro6pDxKRo!!4TO1Dw4Z(d-yV z#|5Yp6yIzC?On}-U9tCORNF5NCW4P9y~M!~jx#TWsuVg9CbCeKbb+{qPcIZYMs3B^ zJVq^@p)-1+6ctl0LCJ(7FuI{6LmBShxKUa5_)lx!$*w`J&0eEwzb_(nJZe)9jD`u6)&x32(<2}%T_0fh!V z2o+=kXBi`^CW5;3{VkRU?UF%|$^PZRqBxjI52<=<>=cSTl#%WX`I5Zs1bNNN)RBs6 zyNXvK$OJqio+P5%M-Iv-cZqg9R<`|8{*4>t?w767@26ph1*CAyF|h_S8+YArR= zI2#*f%k&8@vaeV=zx+wx(%Fw3d3e^#1({j7xmlS7wyU4>K@+!?m2I1NJS#6Rt9D)< zMe97@SR|w7l{mTTYiKFzIT{Y%;US-$GZm9XR#tJhal~(eQ``-h@c_>2$b zhfl~ey#2!EhxuyJFPuO3|I<~msyCtY+928(Cr#HwJ=Satn8Fmereg4m;aIM84qAEW z;q)ucA>t2l@RF>p(q&bIctC?by}l%2@Cl;@6qp(fErIB_x9t=e^f1}wji32-pVD>K z{WJB|KYcq;sjr?`B;tl?SOxV`4Mzk~z%GI(CcT-(PB3yr=|A!lULfg=ZMcK<2O=vz zS@jUoXcQFzJoruj@|B7$eCroqP|H=`X^Z@^`vLjm6F4*!j_QkB&>vNo(KF--dWO`5 zZxG?rU&*iAf?tuVFtJI;LVF2GgcrU&LjV_CW4nb@1pms!y?CY@vTJTpf5&FHYkjFaBLjD~D?Tn2jREQDvK<<_VzYz%wJGb-vbJQ<%+*Nsuo z5a;ntZwe$_8=ghqw1E5Y{&0U5dtJop#kU9u{J^gk_&McWjWDbTKc2N4-#Oqjx*Wl4 z3!Bzx`ubCns&~)5L7I1;(GI`SgareVance43uu$*ybR-AtdB}tz7Y`MtK10Qs_EW2 zt)QCbnG>ufzv(l&Tx#weE$m-foz1fkINT#&@fp3Ls-AbWHFtn#G``PPe#cJm8jy^u zYG}ZV{BPi8VNV)3(6a5c|9Jx5ZPImP{}DBg^gt=Por~wfrV)Ek<$bQ@5GDSP(dF#j z`;1QdAEP%&ul+xcCTI;vwn^_9(4z53rr(UTZez?i=`Ca37?XM#VHesbql>dxQv=VM zu6dtp$u<)MqUW>E=yG*1~-0YMW1uODR#;YXAb?3q(^jJHx`>SXj z7U`7q$UWn;FT3jbjz3_GC#fSHs(K$(P{6aOM=S2*XsnPrz!&a|?xHq^`yCAY^yCfqfPGcA8nI1;7hRY9-Hhtv-X7r#klI^X;SH6%4Ng=g}hl0 z_}}60?w;9yEWv3&v8{`M6IwRacQ!$<#)xqs977`} zUPdxP$QaQ(OsoZG3yBN8YY`_tXe|+*`TWP;wH8s8OruSC{CXGWy5LS#4-g(^cOCGX) z4ZNj`dCH`HEY}aqKGuxU-&)&`(Lf$%EVJD)$67q^ky7{ADVwC5UYTmyNv38u*=uWNA$j0+xcLzA{aP`w(988Wqh}+GXS2Vm@TCZBve<>TGYhay|5&_ZWfnuc zCwR%^gfoTXj@2aLL03ca(27H$H8I_UG0DUMC7&`LN=u=!jG_#dtB?0q^i1vH`JS#o zd_fm|IhR%8GruRZ(f4&#PR6%&p>sGNB07iHf)3nk*z4B1Eyu%*nVH{8DwdIs&{{ez zu)4=uhKoThjL<#fe{>KJqG~qEo4nd9;k4K=> zY_4%{WAVE%MCG-fKI6wDgYVa8yx5DjaYn~+CA0XRmg5!z=dmoK`#7Y(_|`9>YhjDR z-YI8f?|SIRvUf}iM)dg>yaOT=qv0!=qeX&_IM;WL3fJo`Gyeis~{1(Y|1hrLQRQa$}&AZMg)T6QR)~^(IWcQEgsRL$@J<(Ji-$A zHPxrBAPQ)F&vql{7VfaBo2W{{uj@Yf{C9D7u@MRIe4pE!UM?Q#{>%5f-7LNv zvl%czq$Yg6=n9{P4rlB2WTV4bvcr|`$u9^|N9;&KP-s;;Xipa+U{C8uup-oPh=h_j z$e0x&I^t&`jgvJw3$eq*tQ`E&S7g!Jvw#J>LTeC9icu)vd)`n_OQAqBq^XWC(Y6W> z(`|MfP4%nX%($noJTscgtI-W6D_%6zyU73cYcbE?HX6+D?NPuiqzr5l%aSf7c>B$> zA4RiylUD@C8FaT%diFjP?ex&UL3gA{4T|1a>t2dBd0Bk#osgS#1TSxpPI_my(%fmD znMF@|A=^3`vJEDKhn_9lt&V4`F*9+YG4m$LM@m>ToASq)nP4_%-ZbFenQQyaOk8Np zyqTd;!-T_{*&J=mOj46(CN7NiN=*yuTyt)>o4yCom>b^3Nm=GAumi>{r>t4dv0~{} z^O@Exbv?5{PG~s-s}Q4j<_76wFII)MN5+X6rRWQJnrUB+xnT>7(UEL5S#nOY(?r~( zN(ZYP6+XWa8Q50U((s~TtD8}z?HKcd_A};LF6P-*m0$He&EqrX494sbQrDQLtSa3r zb**@W$M>i@iqUJeb=Hh!RWViHnXA6rQ>mir!54gB+*CE%yJ~B0yJtoJ!RY6Fpxso} z_ddRgXSAra#y2W_<6Ij5y{ojepJ{>P zY@__T@W{yPBah7CU8T_QB-%{QodoK`HxdH!979*KeS-Rix!u%9ANSGvj;InvvqY7o zk8%YpxnlNmsn83H$O{pjdHg-}b2o)AN!d@2FDU^QHCMobxy3Wf z#WRPx-PBv(n1$|3O}(&ahj8D3<)l1DT_ZURC1!G^@UZ}g(m+@QfJ4muqh%5JK5;Yq z(fu7(N#h^1N!STvJow$c)mS~^U=)Wn;$Y?MYwzlXe)aWS3_q6OCO?)eM4}nPlQpA2 zgnxWLp)sR??2cGlKi~p=^o`Go`(w>D0|K&y3;co#Fd(2^BnWKMMnrgw z=bK#q2uT91%KMzEf$G;-DcN$(1lNKF0ecxN&|LZ~;$vn^LwMoBGc&x~vfMi~0{(Ax zk5m$~2>vu?*(BZaLTg!@re-j_dXmV-e4D1+E0Il$%b2+kV~v@&qYYq@E6pXdh#= z^a5u0=qVA)Bc3yNh4vhIIlyjIVV-15#om^<-PDU7_c4p0^K5I+Rk7y=EE}bf_kqO| zm8iM_Sh@+$C0MZMhwg>M(n)+4rsTZq+{t!3`@UBwS2+%6c zSl!)oZ;+n;Kb{*t%s&>?*371UZO*gkdkKLjKn*<2V$eg_vs9i)ee`i3@QM3DRe#}r zbMTVy_>=6Iz-y}8?Kl1;OBVMH$ce`ctZYQ>zsR4UDdYp59XD`6oJF_*mK}n#a5Bb( zG7V2fE({}3-6S}8tC&3myNrJJxDW0WyL?{UPvd!h<7cs@QV^gIK`*ewKI3OeFBw_^ zocpby3e1n)*eI>^;@6S{rp`eZedQ6`LP#{vQ{`-JEM_<2%49Pcapi5&K|{+Uu59{K zMjVO!6(cs}iE|+~Wb(O~MMw){mNM+M716Qi$S*D>h&`k<+8ZHl*87yQ%e2edD8bKBqEkp-DefT z^E5p#zaz?GLrgc+EL`yS$x8@It!TXWKpY)t_c^lZRJeCx zQv!XCZCb9=f*#}jzjXn;gixpLqL8MI1chv1Grb%sq!{gqDSKmJvHwR%(}Bil3H2H# zA6RypZwA&kv*VYAv}{06X2*!ain)y_?1m6)W-*pfY}$(yjSUhRz$O9?D`Sb6ZP;ZL zQ42b43TfjKYr`uc`zf#K%eB6iPfO^ai{kk>zb{5t_pZ(2L{Glj_|8gUJsWdxX5(Nf z!IH3Bab@G13vA?588dE{D&bT4kHMz_Bgt)J9zTg_`9P)?Hee(PPBTJ+BcbKH9$$?O z;cjmvAbiYNk9>%=G)G&q)|5i|I~e_hXLLrDB|R-W#*E+HO_8nHtKMBREoAJnk?FphB3m;! z+a@GpG~vV?efQkuGEoF}1axEK`0g3Y*>Bz%@1}7N|2VKVgMY@c$1tOjJ%})C10*r0 z$S@duGfw(1=Dcf^$OQQEOKZueBEYiLgN&8m!!NDj^mz75>;SFXqminHz`r`9{RAl2 ziyhcll?DF_>xRZOc^h7m?Py~qD^?m72nCkY`Y0mDt$Aqk71kd2U) zB&cli5o9~F3+}za7BHhUBFgpYb!>p7B@h!8u5aNfGvfb z_nmX@4Hv|Z_VeDGxxf3LGiTQS{AbS0oH;X{^j~UcXE9Q0PBh z=nPA9+rLKX!z)!1AH4Nlw13<3zBA(!!tcg7{evZ8fRs0^}tA$i%4J>_yN?;B^)N4qjz8=@1e=N`O zjm&0agz;I9p3R;ee0OV`6V2PqcR9iO0n7Hz_1?#M5jXf&`|kI>;QJ^_ zMO_{3jjoPo)(TM{2n{Bz>|Bu~<^qEqMar9YW|Fk?{0{ESz-4(NJU*MD})=(e@n z=jX3E-_DH9%**^R^Q-Q8-4}I##Xs0T&i}Z-)qgOnd)BzDby@4PUd(zc>rnQ%?5)|y zdra%`OwVpTKk8N6>z-a;_8!+e(EBfay7ZaW=cj$X>U(M5xBD&X_h^5Mk0o{u7(U>x z0l}Q~oH02|a~{cgDd$9P|J;V$M|0oG^XB!*8=O~|HzRLl-eY;2^L~|gaA4BF+<`R% zFCTdAz^@10J~(}Fufa!#OdqnFJ>-K!XAS)g3(snXH4NKz;eZRTxp3b_Lob?k(SKfa z&+sU8;_w@We=?$a#Oe{p^5gO|^M~bE7y1h?EWEgIX5kMC?=JjB;j@L?3*RX`SmY_{Qj}9v zT2x=uP;^t#+M*3b+l$^P+F$g~;>6lvIqXm{W0c#l01qDqgAhprWnfXk~0=R^{-@ODnIgys@&W za$V*6%8ix3t$e-m{mM@(zpAvWQmeA7hE`QnO|4o~b$ivrRnJ$wTD7n0#OTXM|8ex5 z(Z{Rft9w*mSbcHzRn^y3H&s7e{ap25s`po)s7b2nTQjm|T+N)C8*1*X`LCK^)x1{o zam~MKeYMH8nYI0EN7dHV&a1tl_V}2DF&Sfej~OzicuWm7N7o)hvfW1$nk zP%sf(YRs1Fj7y~4Op!cuvn(?+WTDwvy8HS|fwkB^W%ZKbzhkHK*t8hQep`)$gP;`T_%HE(4%l)j{Q8JHqP#wQYIKEU23E7viFD5{Wf?*(af;#{JUQ zh?R}depV;B0-oGpz93hcugPp{sZ^MsOQI1c*IQlW3ePdQ+&fw>BaJKZJIcIDZqnCg zKY7HHD>tzN+(eJa1)!ht4CR$2D?Fdccw-Ig;z!6N?CG`~d5cW;y(&|E!=%>eDpy$dN`-OUe#hD*qs>h+#QL4gHD8x{W2*hQ87(tB@5)7< zhso~+GT(RCMjDQ)R*upM<#gYvs?GIGS<@| z6O3cB%4n7bqd~@aR!JxFcp$Q{edI1T5it;_$S%u9nYlgO*w3H4?^X z`$1i9(Az*$hpcLOjf9rdNN70)I!`*jZ%~~t;?wo?oHPeNsl=i4tkd)zRM&4^$G(+P z_nrDT&)z~l9)oW?pwB~JhCT;B(~+qt%~$Vdv=LKfDze!Vxx3bBE2yu!z0h?wM5jCS zPwq8`K{V=e(EK@@nzz|E>2lHh`Ua(~(e+)oInc2#wcB+2quYS*q>cOA#3?DuRM4htSm)9tKo>pJ8>haZk7 zf|@_0%r&OlABWwB%U*a+`5M}paEN~LL}7csXkPn=pFb|8hv+e%^Q@qUDD?02{C#(q zdft$$^2ql3cHk zRGJvM_E^5CnCK`SJ{zwaBnw5l4U+`nHKd$$a3_2X)mCApJ%!Dh>KG$*gxk}$+7HU` zkY18#kzJit*Fo4f8Ftej@^|*N73I@+92FG>Lw#D4U40P>N+-vn^ijI3G`jImnK?9u zLi>f72Je*F0j2~w(PNl+xmniBMtMrM$qsp4K9Mh^osT|}*g?OK8l)z$SIBI2v$}=V z{P(CwR6re8w$atN$k@TxU>{_v%#oQZGr!9Gr$5D?;m`DE`}6(f{w4I%H~2UDpZ34# z|4nu>BOa~dk)rjCfu530vR(ebBEL`Nu-Gb5C399yU-syqsHStkrW@CKwVAk17-=1G zNoH~8vdklyNBy1sY5s1+HNuJOG5-_(CyDC?|F506lzrU(SO(a?lkWCQ#GCBIt=}Z* zF%{KAOS&^&?_zsxv;FJ#12#`jk@l-jy>n{EsU7=Q@4tAzvG3k}5AI#Jcg^0r_paW1 z{oVz8M^bY-ftbCXy~gfMXV*Y|TD)8h?gkqo5X2m*f^t0a@|@-mu+<2wH|4MLmb@+R z$lv5v*~zTte)(AbPI-MQ%bDY9lh5P;b2dR)AuHve9HJZ#%a?M5x9C5TQ&ekPiQe@^ zn&ftNNHUeByo_|4S;hYo`7tGb2PXzy#Mp6!%2x%lS{14yRm|zjC2Eu^Rb_G~PxW$D zp(<6C8qG$UHRN**CyI?x7c<9ysTwQy$XcXjx|+$Ewj4r6`Mx2$U2R8#f8eSj5pP`R{jbJ8tDulm4H-T+n zA=nOH0dImGA>0c619%<03v?PZc7itmvpLSZ@!z1kz;dA7eF%6HD7(QPumbD_e+LJ_ zCn2nYehR(-N5SC`egypz=<-Jb|Y?xhv11&Ag@7_ zLih<330J*9I_T|!G8NUwh0dqy3kHE)FxZ8&zGMhy{YLIWpx=1`Sq&WlNeZ(rh^%w>nowN0A+`)h?c&(DRbU4i~Hg65~A=Li`3bRYM*XwwC}3zwj`#7>vYBS!6B) zD={yJ9sxRj$~_bL$owZ}^5^diQV8JZP}1Wk9r8o@@QQ~Xc6kY7Px0NBZ|p&Gxz z{9BRiWEZkMAUU;x=&^NAD|Ki6R%NdYtT_MaXwS4Oasw*I@2{9!9#GSB14d3j_0P%; zcyj!e0Z*^W@pV1w{muU7>Z_XlmHs(1t_qmF9LkMZ&GiHQ0hv%Ym;Z@%S%H%Jt{ui% z_4WC=0aFKq4_r6b6TrMs08qzj;Hlhzl~d~vczTbm8&?-tR^ByGQeNLRE6ZOI*gm!{ zu)Vx%R(*YLz}t~V(t6X}G&i-roPf7~ZXn7HVM1M?q-#Lxo11lb6Y6?o1(r28cWovI z;p^>ZUT@_C>oXi|RV9%YaG+wVS~ixTAU(3WYKtCOJ+eq)eR*ymI;VC*T?I+ZB8f3M zfdLh{f!Lft4kRw;={~B--#nr2g%VoEnOmczX=2?AOf0lD)^`o`AhG_Yt%>k0WT$f( zpA#r)+Ul3dbx-F=dDj;t$J17hecXTmtMIm{1Y-c-Eavp;mXaV*1D-cZhxJDyF?l-d z%r)0f&F`V@tm~%NUUwf(x&La{X*fzOsUBq z9kJI^VB>bH>m_xH|^CmRZ`lgON#NJB-$e+zWqK) zW|x3i-kGMDs~O1#B*mL1UDOkj!D|am>Ut|9O78Qx}$tnrVZr#b*=M=t7#Vq1l%>QC+#xO5k#+#5!SW8sFsysIZ9+x@xywh`Hu1)A)G4zPyYY&?* zm}wc=17jj-Fv}~)Oq7h7KUmZty=O0)HD87_%viEOik+vtUU{P3nmP=}tRl=tgxMqJ z{8@_@NX9q+@v6hnJ`JcLF}`Q%1SLDZR~VVzSG}(qgN%8;I&Z7@gm<^m=sn~;>OJAv z?P)WI_|nWdz7pR&U%vT6Z<`sgimh_rc(l;*-sF4S+64{}hF^z+{}aA6UtOdo)ZHP? zU03_&dD~p=gd}>a2K3`-$1i?dO?q&57JTEK6dom&N1e2g9^z#;GZ#Luqti%9nv?d& zb^0A$!nMxL5+Fw@kgH58ngyV{|YO*}4E(8pevM;YdsYZn{3F@5%f0X+MnUxd!DJ zeW9=E14Z;uImIhVMXOj9?~Fq_vo+>z-3?(Yjf-E12UOaXP1Mu*tLKM zuzQklHi0(@>#yJ~@HTh{{0-~^2MPNS_yQaTUxFjxD{z!>j)CLgYw!=y4s82#B|rfK zci@I}bE~1)vcu0@sm_+ret$zLU7`#(WQ02d@mIF+px^ z{~M#e;r1TMXCzp_o8%( z$q3K}J_859=k_7Ea7fJtbHRLY4Oj@S<$e!pCa1CiH@sxzrVY7iLvGrTn>J*o%?W=k zv<3VUw;RAl@Dwx!;UEn`z;TgZD0xoaeMjpVLT)!AukGMEak0Mki}a#G`wc-o6m_EDK(e}Vkh zATv{FDRfC~*KU{t(f|5{o?EFA+Wv01RfBZa@dTfOglcJt5|h?$lD!SLZ^$)vgWPB@ zz(*Np^=*{f?MIwY{_e^jmgg;?$<6$uhUxoD|PuwTbV zGHE-2uU)u0;7IH>_9kL^jab$b%S*(vT{hc)CBz#18P-@rWz9$Qqs(B@ud?5_oA`G8 z6+6hP3dSJJSb;Bb3cJ4bF-EwrgpxvJcpwML2Mbv{Ryi(ql+|9@@;X zN(viXs$>6mm5$lr%txnv+Mgi>A!Sbuo7(r%N_HrFJKw#u*+cBd+CQ_8*o>XOsq9NA z8Aj3?XQ@t1qcqsB*&lFsbod@6T4(Bo!LEk(x4*O&K7&iSJH#7CWtL(S!JvRB&Kqa`gTs!4qU#qY6_cf8q;Sc4^ zH$GZ9evrKmZrN9zc8w&yL|S)&9h6oQ^(LA6n~aPG?R|DSwMOhY_IlFq%7wnxVQWN4 zfPGMx$k~dz`>o3U@|(B9^773)#CGgVANor3?B7xLk#Bc>juIDJ&;9%x%KpW-JGQ^H znL#?OoSKNdz-7u(OVwG5nq*Hn%MKYN94(*c;2yU1XSsJSc?QYp+Ho!yXWHp>o|)D& z?{{1o^yIy0eL7q$ZEPaiKz@=Li}s?&Z!$(5$}IVCdilwW@2dDJzZ%_*-u@VNeHzEO zEtCHKB*~`7KbfA%R91QRWDdERF~cvJb?xi){PXDhw=#BklYaeRImMiF9ew)q{Gvr?S`!o5jau$8a7T#UVmiyIQHCG-` z^VNKLP+g<0k%!bmwNQS_SHIV?Kg?o!^ba#WxJlMCGFZ-81uN*&Z(xM5iaitCL@J?#*6IZ`Fl9_lu{ zi({GEaVwS4h5lk(^i$DM>HKFUaiQD#0a z&W1iW$bB~z1C501L;KR@ZIQAt+;Z1tA1;545lV9?3?2Hppr12|9XHz{hqtmCAOI>LXUu(Nmr`G8CiDYWZ znX>5NzUk=DY?1be(k1T&CT7iZUB3h#>RR@HrNZexcX;%uLpNNL^JG7#(-gSH>p3{) z{-4v)_pkMhUgi%Z>n(3h(hjM9Z!oDsa?+M|FF_r4eJEBs&yx{ZtKF(`Hh5I zGCGVi5$VR|Q8<>f>1mlb`;M-EE_6-zb|BK7TZba+lh1h@9E~Fly({mzpzBaPdDAkN z*a01~=4QBtgZBmtO3b zp%X6~@8=9EceWER&a5Z3!=XsIL*ZX&Hq>gEJ9~!so&UZK3uiV+p7TG{`OhZ+_vxeK z*Iak&rk;z{W)4Im{c$|W%XxNEFoqo$~-9kzOY+f*&;e)WKQ5L=U(xdc56 e7YbMV%K@62>;`7Y#SwRsJMR3RJ7c+GboW0vu!{}= diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff deleted file mode 100644 index f0107f9080369b997344d34e417b641138f9317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26540 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 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 deleted file mode 100644 index 3fd24c3551b222f54622e71366fcd2005f2d31e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21024 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf deleted file mode 100644 index 7cb17c955d3cdd19d718145786e45ed23844009a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51100 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%0A2Uy{`Pg)eZhs`*DT0HJ){&&6<`S=W31Sd>L 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 GCH)Vn$xxmE diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff deleted file mode 100644 index 37da7720a45ed7edc3a2ce73627f6fb6f6efab9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26588 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 diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 deleted file mode 100644 index 70994a2b87ca6eb51f655a6c466fd54afc354741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21076 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 f8j_;k`xg7JXnP_0y?3JOQp|g^e8=VMP7a9y { + let app: App; + + beforeEach(() => { + app = App.get({ user: "basic" }); + }); + + it("should have a John section", () => { + app.clickOnText("John"); + app.shouldContainText("Hello John"); + }); + + it("should have a Mary section", () => { + app.clickOnText("Mary"); + app.shouldContainText("Mary"); + }); +}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 0000000..92a4dd9 --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,11 @@ +// https://on.cypress.io/plugins-guide + +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config + on("task", { + logRequest(req) { + console.debug(req, config); + }, + }); +}; diff --git a/cypress/support/App.ts b/cypress/support/App.ts new file mode 100644 index 0000000..969c09a --- /dev/null +++ b/cypress/support/App.ts @@ -0,0 +1,57 @@ +import { getApiUrl } from "./commands"; + +const users = { + admin: { username: "cypress-admin", password: "Testing123$" }, + basic: { username: "cypress-basic", password: "Testing123$" }, +}; + +export class App { + /* Constructors */ + + static get(options: { user: UserKey }): App { + const app = new App(); + app.load(users[options.user]); + return app; + } + + /* Generic Helpers */ + + load(auth: { username: string; password: string }) { + cy.request({ method: "GET", url: getApiUrl("/api/me"), auth, log: true }).then(res => { + expect(res.status).to.equal(200); + }); + + cy.visit("/"); + } + + shouldContainText(text: string, options?: { clickable: boolean }) { + if (options?.clickable) { + cy.contains(text).should("have.css", "cursor", "pointer"); + } else { + cy.contains(text); + } + } + + shouldNotContainText(text: string) { + cy.findByText(text).should("not.exist"); + } + + shouldNotShowText(text: string) { + cy.findByText(text).should("not.be.visible"); + } + + clickOnText(text: string) { + cy.contains(text).click(); + } + + /* MUI helpers */ + + selectOptionSelector(options: { label: string; select: string }) { + const { label, select } = options; + this.shouldContainText(label); + this.clickOnText(label); + cy.findByRole("presentation").findByText(select).click(); + } +} + +type UserKey = keyof typeof users; diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 0000000..a4c9065 --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,28 @@ +import "@testing-library/cypress/add-commands"; +import * as qs from "qs"; + +const appUrl: string = Cypress.env("ROOT_URL") || ""; + +const dhis2Url: string = appUrl + "/dhis2"; + +function setup() { + Cypress.config("baseUrl", appUrl); + + Cypress.Cookies.defaults({ preserve: "JSESSIONID" }); + + Cypress.on("uncaught:exception", (err, runnable) => { + console.error("uncaught:exception", { err, runnable }); + // returning false here prevents Cypress from failing the test + return false; + }); +} + +setup(); + +/* Public interface */ + +export function getApiUrl(path: string, params?: Record) { + const baseUrl = dhis2Url.replace(/\/$/, "") + "/" + path.replace(/^\//, ""); + const queryString = qs.stringify(params || {}, { arrayFormat: "repeat", addQueryPrefix: true }); + return baseUrl + queryString; +} diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 0000000..64e1fd1 --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,2 @@ +import "./commands"; +import "cypress-xpath"; diff --git a/cypress/support/utils.ts b/cypress/support/utils.ts new file mode 100644 index 0000000..b883885 --- /dev/null +++ b/cypress/support/utils.ts @@ -0,0 +1,35 @@ +import * as _ from "lodash"; +import { DataValue } from "./DataValue"; + +type Name = string; + +interface DataValueDef { + name: Name; + value: string; + comment?: string; +} + +export function indexDataValues( + dataValueDefs: DataValueDef[] +): Record { + const obj = _.keyBy(dataValueDefs, o => o.name); + return obj as Record>; +} + +export function getExpectedDataValues(options: { + dataValues: Record; + orgUnit: Name; + period: string | number; +}): DataValue[] { + const { dataValues, orgUnit, period } = options; + + return _(dataValues) + .values() + .map(dv => ({ + dataElement: dv.name, + period: period.toString(), + orgUnit, + value: dv.value, + })) + .value(); +} diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json new file mode 100644 index 0000000..421731d --- /dev/null +++ b/cypress/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2015", + "lib": ["dom", "dom.iterable", "es2015"], + "strict": true, + "moduleResolution": "node", + "types": ["cypress", "@testing-library/cypress"] + }, + "include": ["**/*.ts"] +} diff --git a/i18n/en.pot b/i18n/en.pot new file mode 100644 index 0000000..881d382 --- /dev/null +++ b/i18n/en.pot @@ -0,0 +1,93 @@ +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"POT-Creation-Date: 2021-09-30T20:45:16.406Z\n" +"PO-Revision-Date: 2021-09-30T20:45:16.406Z\n" + +msgid "Settings" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Details" +msgstr "" + +msgid "Copy in user" +msgstr "" + +msgid "Assign to organisation units" +msgstr "" + +msgid "Assign to data view organisation units" +msgstr "" + +msgid "Assign roles" +msgstr "" + +msgid "Assign groups" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Replicate user from template" +msgstr "" + +msgid "Replicate user from table" +msgstr "" + +msgid "Search by name" +msgstr "" + +msgid "First name" +msgstr "" + +msgid "Surname" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "Organisation units" +msgstr "" + +msgid "Data view organisation units" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "Disabled" +msgstr "" diff --git a/i18n/es.po b/i18n/es.po new file mode 100644 index 0000000..23a357b --- /dev/null +++ b/i18n/es.po @@ -0,0 +1,102 @@ +msgid "" +msgstr "" +"Project-Id-Version: i18next-conv\n" +"POT-Creation-Date: 2021-09-30T20:45:16.406Z\n" +"PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgid "Settings" +msgstr "" + +msgid "Back" +msgstr "Volver" + +msgid "Help" +msgstr "Ayuda" + +msgid "Details" +msgstr "" + +msgid "Copy in user" +msgstr "" + +msgid "Assign to organisation units" +msgstr "" + +msgid "Assign to data view organisation units" +msgstr "" + +msgid "Assign roles" +msgstr "" + +msgid "Assign groups" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "Replicate user from template" +msgstr "" + +msgid "Replicate user from table" +msgstr "" + +msgid "Search by name" +msgstr "" + +msgid "First name" +msgstr "" + +msgid "Surname" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "Organisation units" +msgstr "" + +msgid "Data view organisation units" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "Disabled" +msgstr "" + +#~ msgid "Hello {{name}}" +#~ msgstr "Hola {{name}}" + +#~ msgid "Add" +#~ msgstr "Añadir" + +#~ msgid "List" +#~ msgstr "Listar" diff --git a/includes/feedback-tool/feedback-dhis2.js b/includes/feedback-tool/feedback-dhis2.js deleted file mode 100644 index b6f709e..0000000 --- a/includes/feedback-tool/feedback-dhis2.js +++ /dev/null @@ -1,135 +0,0 @@ -"use strict"; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -(function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);throw new Error("Cannot find module '" + o + "'"); - }var f = n[o] = { exports: {} };t[o][0].call(f.exports, function (e) { - var n = t[o][1][e];return s(n ? n : e); - }, f, f.exports, e, t, n, r); - }return n[o].exports; - }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) { - s(r[o]); - }return s; -})({ 1: [function (require, module, exports) { - /* - Dhis2+Github module for https://github.com/eisnerd/feedback-tool - - Requires FeedBackToolGithub - */ - - var groupBy = function groupBy(xs, fn) { - return xs.reduce(function (rv, x) { - (rv[fn(x)] = rv[fn(x)] || []).push(x); - return rv; - }, {}); - }; - - var FeedBackToolDhis2 = function () { - function FeedBackToolDhis2(d2, appKey, options) { - _classCallCheck(this, FeedBackToolDhis2); - - this.d2 = d2; - this.appKey = appKey; - this.options = options; - } - - _createClass(FeedBackToolDhis2, [{ - key: "init", - value: function init() { - var _this = this; - - var locale = this.d2.currentUser.userSettings.settings.keyUiLocale || "en"; - var throwError = function throwError(msg) { - throw new Error(msg); - }; - var init = function init(i18nProperties) { - $.feedbackGithub(Object.assign({}, _this.options, { - postFunction: _this.sendFeedbackToUserGroups.bind(_this), - feedbackOptions: { i18nProperties: i18nProperties }, - username: _this.d2.currentUser.username - })); - }; - - fetch("includes/feedback-tool/i18n/" + locale + ".properties", { credentials: 'same-origin' }).then(function (res) { - return res.status.toString().match(/^2..$/) ? res : throwError("Cannot find locale"); - }).then(function (res) { - return res.text(); - }).then(init).catch(function () { - return init(); - }); - } - }, { - key: "sendFeedbackToUserGroups", - value: function sendFeedbackToUserGroups(payload) { - var _this2 = this; - - var userGroupNames = this.options.sendToDhis2UserGroups; - if (userGroupNames.length === 0) return Promise.resolve(); - - var title = payload.title, - body = payload.body; - - var currentApp = this.d2.system.installedApps.find(function (app) { - return app.key === _this2.appKey; - }); - var fullTitle = currentApp ? "[" + currentApp.name + "] " + title : title; - var fullBody = payload.issueURL ? body + "\n\n---\n" + payload.issueURL : body; - - return this.getUserGroups(userGroupNames).then(function (userGroups) { - return _this2.sendMessage(fullTitle, fullBody, userGroups.toArray()); - }).catch(function (err) { - alert("Cannot send dhis2 message"); - }); - } - }, { - key: "getUserGroups", - value: function getUserGroups(names) { - return this.d2.models.userGroups.list({ - filter: "name:in:[" + names.join(",") + "]", - paging: false - }); - } - }, { - key: "sendMessage", - value: function sendMessage(subject, text, recipients) { - var api = this.d2.Api.getApi(); - var recipientsByModel = groupBy(recipients, function (recipient) { - return recipient.modelDefinition.name; - }); - var ids = function ids(objs) { - return objs && objs.map(function (obj) { - return { id: obj.id }; - }); - }; - - var message = { - subject: subject, - text: text, - users: ids(recipientsByModel.user), - userGroups: ids(recipientsByModel.userGroup), - organisationUnits: ids(recipientsByModel.organisationUnit) - }; - - if (recipients.length == 0) { - return Promise.resolve(); - } else { - return api.post("/messageConversations", message); - } - } - }]); - - return FeedBackToolDhis2; - }(); - - $.feedbackDhis2 = function (d2, appKey, options) { - var feedBackToolDhis2 = new FeedBackToolDhis2(d2, appKey, options); - feedBackToolDhis2.init(); - return feedBackToolDhis2; - }; - }, {}] }, {}, [1]); \ No newline at end of file diff --git a/includes/feedback-tool/feedback-github.js b/includes/feedback-tool/feedback-github.js deleted file mode 100644 index 65a0781..0000000 --- a/includes/feedback-tool/feedback-github.js +++ /dev/null @@ -1,161 +0,0 @@ -"use strict"; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -(function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);throw new Error("Cannot find module '" + o + "'"); - }var f = n[o] = { exports: {} };t[o][0].call(f.exports, function (e) { - var n = t[o][1][e];return s(n ? n : e); - }, f, f.exports, e, t, n, r); - }return n[o].exports; - }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) { - s(r[o]); - }return s; -})({ 1: [function (require, module, exports) { - /* - Github module for https://github.com/eisnerd/feedback-tool - - You need a personal token that will be used both as a reporter user and to upload screenshot - images. Steps: - - - Create a specific github user. - - Create a project (i.e.) snapshots to store images. - - Create a personal token: - - User -> Settings -> Developer Settings -> Personal access tokens -> Generate new token - - Description: Upload screenshots for feedback.js - - Select scopes: repo -> public_repo. - - Generate token. - - This token should be kept secret, outside of any public repository. If that's too much of a - hassle, it should be encoded somehow in the source. That's not secure (anyone could take - it and upload files to our snapshot repo), but at least you won't get it automatically - revoked by github. - - Usage: - - $.feedbackGithub({ - token: "PERSONAL_TOKEN" | ["PERSONAL_", "TOKEN"], - createIssue: true, - postFunction: ({title, body}) => { }, - username: "USERNAME", - issues: { - repository: "ORG/PROJECT_WHERE_ISSUES_WILL_BE_CREATED", - title: "[User feedback] {title}", - body: "## Some report\n{body}", - }, - snapshots: { - repository: "ORG2/PROJECT_WHERE_SNAPSHOTS_WILL_BE_UPLOADED_TO", - branch: "master", - }, - feedbackOptions: {}, - }); - */ - - function interpolate(template, namespace) { - return template.replace(/{([^{}]*)}/g, function (a, b) { - var r = namespace[b]; - return typeof r === 'string' || typeof r === 'number' ? r : a; - }); - }; - - var FeedBackToolGithub = function () { - function FeedBackToolGithub(options) { - _classCallCheck(this, FeedBackToolGithub); - - this.options = options; - this.token = typeof options.token === "string" ? options.token : options.token.join(""); - } - - _createClass(FeedBackToolGithub, [{ - key: "init", - value: function init() { - $.feedback(Object.assign({}, { - postFunction: this._sendReport.bind(this) - }, this.options.feedbackOptions || {})); - } - }, { - key: "_setAuthHeader", - value: function _setAuthHeader(xhr) { - xhr.setRequestHeader("Authorization", "token " + this.token); - } - }, { - key: "_sendReport", - value: function _sendReport(data) { - var _this = this; - - // data.post.img = "data:image/png;base64,iVBORw0KG..." - var imgBase64 = data.post.img.split(",")[1]; - var uid = new Date().getTime() + parseInt(Math.random() * 1e6).toString(); - var postFunction = this.options.postFunction || function () {}; - - return this._uploadFile("screenshot-" + uid + ".png", imgBase64).then(function (url) { - return _this._getPayload(data, url); - }).then(function (payload) { - if (_this.options.createIssue) { - _this._postIssue(payload).then(postFunction); - } else { - postFunction(payload); - } - }).then(data.success, data.error); - } - }, { - key: "_uploadFile", - value: function _uploadFile(filename, contents) { - var payload = { - "message": "feedback.js snapshot", - "branch": this.options.snapshots.branch, - "content": contents - }; - - return $.ajax({ - url: 'https://api.github.com/repos/' + this.options.snapshots.repository + '/contents/' + filename, - type: "PUT", - beforeSend: this._setAuthHeader.bind(this), - dataType: 'json', - data: JSON.stringify(payload) - }).then(function (res) { - return res.content.download_url; - }); - } - }, { - key: "_getPayload", - value: function _getPayload(data, screenshotUrl) { - var info = data.post; - var browser = info.browser; - var body = ["## Browser", "- Name: " + browser.appCodeName, "- Version: " + browser.appVersion, "- Platform: " + browser.platform, "", "## User report", "URL: " + info.url, "", info.note, "", "![See screenshot here]( " + screenshotUrl + " )"].join("\n"); - var bodyNamespace = { body: body, username: this.options.username }; - - return { - "title": interpolate(this.options.issues.title, { title: info.title }), - "body": this.options.issues.body ? interpolate(this.options.issues.body, bodyNamespace) : body - }; - } - }, { - key: "_postIssue", - value: function _postIssue(payload) { - return $.ajax({ - type: "POST", - url: 'https://api.github.com/repos/' + this.options.issues.repository + '/issues', - beforeSend: this._setAuthHeader.bind(this), - dataType: 'json', - data: JSON.stringify(payload) - }).then(function (res) { - return Object.assign(payload, { issueURL: res.html_url }); - }); - } - }]); - - return FeedBackToolGithub; - }(); - - $.feedbackGithub = function (options) { - var feedBackToolGithub = new FeedBackToolGithub(options); - feedBackToolGithub.init(); - return feedBackToolGithub; - }; - }, {}] }, {}, [1]); \ No newline at end of file diff --git a/includes/feedback-tool/feedback.css b/includes/feedback-tool/feedback.css deleted file mode 100644 index a6fb972..0000000 --- a/includes/feedback-tool/feedback.css +++ /dev/null @@ -1,369 +0,0 @@ -.feedback-btn { - font-size: 14px; - position: fixed; - bottom: -3px; - right: 200px; - width: auto; -} -#feedback-module p { - font-size: 13px; - margin-bottom: 25px; -} -#feedback-note-tmp { - width: 444px; - height: auto; - min-height: 90px; - outline: none; - font-family: Roboto, sans-serif; - padding: 4px; -} -#feedback-note-tmp:focus, -#feedback-note:focus { - border: 1px solid #64b7cc; -} -#feedback-canvas { - position: absolute; - top: 0; - left: 0; -} -#feedback-welcome { - top: 30%; - left: 50%; - margin-left: -270px; - display: block; - position: fixed; -} -.feedback-logo { - width: 34px; - margin-bottom: 16px; - font-size: 22px; - font-weight: bold; - line-height: 32px; - height: 32px; -} -.feedback-next-btn { - width: 72px; - height: 29px; - line-height: 27px; - float: right; - font-size: 13px; - padding: 0 8px; -} -.feedback-back-btn { - width: 72px; - height: 29px; - line-height: 27px; - float: right; - font-size: 13px; - padding: 0 8px; - margin-right: 20px; -} -.feedback-submit-btn { - width: 72px; - height: 29px; - line-height: 27px; - float: right; - font-size: 13px; - padding: 0 8px; -} -.feedback-close-btn { - width: 72px; - height: 29px; - line-height: 27px; - float: right; - font-size: 13px; - padding: 0 8px; -} -.feedback-helper { - background: rgba(0, 0, 0, 0); - cursor: default; -} -.feedback-helper[data-type="highlight"] > .feedback-helper-inner { - background: rgba(0, 68, 255, 0.1); -} -#feedback-close { - cursor: pointer; - position: absolute; - background: url(icons.png) 0px -64px; - width: 30px; - height: 30px; -} -.feedback-wizard-close { - cursor: pointer; - position: absolute; - top: 2px; - right: 2px; - background: url(icons.png) 0px -34px; - width: 30px; - height: 30px; - -webkit-opacity: 0.65; - -moz-opacity: 0.65; - opacity: 0.65; -} -.feedback-wizard-close:hover { - opacity: 1; -} -#feedback-welcome-error, -#feedback-overview-error { - display: none; - color: #f13e3e; - float: right; - margin-right: 30px; - font-size: 13px; - line-height: 29px; -} -#feedback-overview-error { - margin-top: 20px; -} -#feedback-highlighter { - display: none; - bottom: 100px; - right: 100px; - position: fixed; - width: 540px; - height: 275px; -} -#feedback-overview { - display: none; - top: 10%; - left: 50%; - margin-left: -420px; - position: fixed; - width: 840px!important; - height: auto; -} -#feedback-submit-error, -#feedback-submit-success { - top: 30%; - left: 50%; - margin-left: -300px; - display: block; - position: fixed; - width: 600px; - height: auto; -} -.feedback-btn { - padding: 10px; - outline: 0; - background-clip: padding-box; - -webkit-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - z-index: 40000; -} -.feedback-btn-gray { - text-align: center; - cursor: pointer; - font-family: Roboto, sans-serif; - border: 1px solid #dcdcdc; - border: 1px solid rgba(0, 0, 0, 0.1); - color: white; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #ff9800; - font-weight: 600; - letter-spacing: 0.5px; -} -.feedback-btn-gray:hover { - border: 2px solid #ff9800; -} -.feedback-btn-blue { - text-align: center; - cursor: pointer; - font-family: Roboto, sans-serif; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - background-color: #357ae8; - background-color: #4d90fe; - background: -webkit-gradient(linear, left top, left bottom, from(#4d90fe), to(#357ae8)); - background: -webkit-linear-gradient(top, #4d90fe, #357ae8); - background: -moz-linear-gradient(top, #4d90fe, #357ae8); - background: -ms-linear-gradient(top, #4d90fe, #357ae8); - background: -o-linear-gradient(top, #4d90fe, #357ae8); - border: 1px solid #2f5bb7; - color: #fff; -} -#feedback-note-tmp, -#feedback-note { - resize: none; -} -#feedback-welcome, -#feedback-highlighter, -#feedback-overview, -#feedback-submit-success, -#feedback-submit-error { - font-family: Roboto, sans-serif; - z-index: 40000; - padding: 30px 42px; - width: 540px; - border: 1px solid rgba(0, 0, 0, 0.333); - outline: 0; - -webkit-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - background: #fff; - background-clip: padding-box; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transform: translateZ(); - -moz-transform: translateZ(); - -ms-transform: translateZ(); - -o-transform: translateZ(); -} -.feedback-sethighlight, -.feedback-setblackout { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f5f5f5; - background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f1f1f1)); - background: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1); - background: -moz-linear-gradient(top, #f5f5f5, #f1f1f1); - background: -ms-linear-gradient(top, #f5f5f5, #f1f1f1); - background: -o-linear-gradient(top, #f5f5f5, #f1f1f1); - color: #444; - border: 1px solid #dcdcdc; - border: 1px solid rgba(0, 0, 0, 0.1); - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - background-clip: padding-box; - cursor: default; - font-size: 11px; - font-weight: bold; - text-align: center; - white-space: nowrap; - margin-right: 16px; - height: 30px; - line-height: 28px; - min-width: 90px; - outline: 0; - padding: 0 8px; - display: inline-block; - float: left; -} -.feedback-setblackout { - margin-top: 10px; - clear: both; -} -.feedback-sethighlight div { - background: url(icons.png) 0px -94px; - width: 16px; - height: 16px; - margin-top: 7px; - float: left; -} -.feedback-setblackout div { - background: url(icons.png) -16px -94px; - width: 16px; - height: 16px; - margin-top: 7px; - float: left; -} -.feedback-sethighlight:hover, -.feedback-setblackout:hover { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f8f8f8; - background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#f1f1f1)); - background: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1); - background: -moz-linear-gradient(top, #f8f8f8, #f1f1f1); - background: -ms-linear-gradient(top, #f8f8f8, #f1f1f1); - background: -o-linear-gradient(top, #f8f8f8, #f1f1f1); - border: 1px solid #c6c6c6; - color: #333; -} -.feedback-active { - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - background-color: #eee; - background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e0e0e0)); - background: -webkit-linear-gradient(top, #eee, #e0e0e0); - background: -moz-linear-gradient(top, #eee, #e0e0e0); - background: -ms-linear-gradient(top, #eee, #e0e0e0); - background: -o-linear-gradient(top, #eee, #e0e0e0); - border: 1px solid #ccc; - color: #333; -} -#feedback-highlighter label { - float: left; - margin: 0 0 0 10px; - line-height: 30px; - font-size: 13px; - font-weight: normal; -} -#feedback-highlighter label.lower { - margin-top: 10px; -} -.feedback-buttons { - float: right; - margin-top: 20px; - clear: both; -} -#feedback-module h3 { - font-weight: bold; - font-size: 15px; - margin: 8px 0; -} -#feedback-title { - width: 314px; - padding: 0px 10px; - height: 20px; -} -.feedback-additional { - margin-bottom: 20px !important; -} -#feedback-overview-description { - float: left; -} -#feedback-note { - width: 314px; - padding: 10px; - height: 150px; - outline: none; - font-family: Roboto, sans-serif; - line-height: 20px; -} -#feedback-overview-screenshot { - float: right; -} -.feedback-screenshot { - max-width: 396px; - padding: 1px; - border: 1px solid #adadad; -} -#feedback-overview-description-text span { - font-size: 14px; - margin: 8px 0; - color: #666; - padding-left: 10px; - background: url(icons.png) -30px -34px no-repeat; - margin-left: 26px; -} -#feedback-browser-info, -#feedback-page-info, -#feedback-page-structure, -#feedback-additional-none { - margin-top: 16px; - display: none; -} -.feedback-spinner { - position: relative; - z-index: 10000000; - background: url(spinner.gif); - width: 32px; - height: 32px; -} diff --git a/includes/feedback-tool/feedback.js b/includes/feedback-tool/feedback.js deleted file mode 100644 index 7adfb6b..0000000 --- a/includes/feedback-tool/feedback.js +++ /dev/null @@ -1,4427 +0,0 @@ -"use strict"; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -(function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);throw new Error("Cannot find module '" + o + "'"); - }var f = n[o] = { exports: {} };t[o][0].call(f.exports, function (e) { - var n = t[o][1][e];return s(n ? n : e); - }, f, f.exports, e, t, n, r); - }return n[o].exports; - }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) { - s(r[o]); - }return s; -})({ 1: [function (require, module, exports) { - module.exports = "# Global\nsend_feedback=Send Feedback\ntitle=Feedback\nsubmit=Submit\nok=OK\nnext=Next\nback=Back\ndescription=Description\nscreenshot=Screenshot\n\n# highlighter template\nhighlighter_click_and_drag_on_page=Click and drag on the page to help us better understand your feedback. You can move this dialog if it's in the way\nhighlighter_highlight=Highlight\nhighlighter_identify_areas=Highlight areas relevant to your feedback\nhighlighter_blackout=Black out\nhighlighter_blackout_information=Black out any personal information\n\n# overview template\noverview_title=Title\noverview_additional=Additional info\noverview_additional_none=None\noverview_additional_browser=Browser Info\noverview_additional_page_info=Page Info\noverview_additional_page_structure=Page Structure\noverview_enter_fields=Please enter a title and description\n\n# submitError template\nsubmit_error_message=Sadly an error occured while sending your feedback. Please try again\n\n# submitSuccess template\nsubmit_success_message=Thank you for your feedback\n"; - }, {}], 2: [function (require, module, exports) { - (function (global) { - /* - html2canvas 0.5.0-beta4 - Copyright (c) 2016 Niklas von Hertzen - - Released under License - */ - - (function (f) { - if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") { - module.exports = f(); - } else if (typeof define === "function" && define.amd) { - define([], f); - } else { - var g;if (typeof window !== "undefined") { - g = window; - } else if (typeof global !== "undefined") { - g = global; - } else if (typeof self !== "undefined") { - g = self; - } else { - g = this; - }g.html2canvas = f(); - } - })(function () { - var define, module, exports;return function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw f.code = "MODULE_NOT_FOUND", f; - }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) { - var n = t[o][1][e];return s(n ? n : e); - }, l, l.exports, e, t, n, r); - }return n[o].exports; - }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) { - s(r[o]); - }return s; - }({ 1: [function (_dereq_, module, exports) { - (function (global) { - /*! https://mths.be/punycode v1.4.0 by @mathias */ - ;(function (root) { - - /** Detect free variables */ - var freeExports = (typeof exports === "undefined" ? "undefined" : _typeof(exports)) == 'object' && exports && !exports.nodeType && exports; - var freeModule = (typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module && !module.nodeType && module; - var freeGlobal = (typeof global === "undefined" ? "undefined" : _typeof(global)) == 'object' && global; - if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) { - root = freeGlobal; - } - - /** - * The `punycode` object. - * @name punycode - * @type Object - */ - var punycode, - - - /** Highest positive signed 32-bit float value */ - maxInt = 2147483647, - // aka. 0x7FFFFFFF or 2^31-1 - - /** Bootstring parameters */ - base = 36, - tMin = 1, - tMax = 26, - skew = 38, - damp = 700, - initialBias = 72, - initialN = 128, - // 0x80 - delimiter = '-', - // '\x2D' - - /** Regular expressions */ - regexPunycode = /^xn--/, - regexNonASCII = /[^\x20-\x7E]/, - // unprintable ASCII chars + non-ASCII chars - regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, - // RFC 3490 separators - - /** Error messages */ - errors = { - 'overflow': 'Overflow: input needs wider integers to process', - 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', - 'invalid-input': 'Invalid input' - }, - - - /** Convenience shortcuts */ - baseMinusTMin = base - tMin, - floor = Math.floor, - stringFromCharCode = String.fromCharCode, - - - /** Temporary variable */ - key; - - /*--------------------------------------------------------------------------*/ - - /** - * A generic error utility function. - * @private - * @param {String} type The error type. - * @returns {Error} Throws a `RangeError` with the applicable error message. - */ - function error(type) { - throw new RangeError(errors[type]); - } - - /** - * A generic `Array#map` utility function. - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function that gets called for every array - * item. - * @returns {Array} A new array of values returned by the callback function. - */ - function map(array, fn) { - var length = array.length; - var result = []; - while (length--) { - result[length] = fn(array[length]); - } - return result; - } - - /** - * A simple `Array#map`-like wrapper to work with domain name strings or email - * addresses. - * @private - * @param {String} domain The domain name or email address. - * @param {Function} callback The function that gets called for every - * character. - * @returns {Array} A new string of characters returned by the callback - * function. - */ - function mapDomain(string, fn) { - var parts = string.split('@'); - var result = ''; - if (parts.length > 1) { - // In email addresses, only the domain name should be punycoded. Leave - // the local part (i.e. everything up to `@`) intact. - result = parts[0] + '@'; - string = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - string = string.replace(regexSeparators, '\x2E'); - var labels = string.split('.'); - var encoded = map(labels, fn).join('.'); - return result + encoded; - } - - /** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - * @see `punycode.ucs2.encode` - * @see - * @memberOf punycode.ucs2 - * @name decode - * @param {String} string The Unicode input string (UCS-2). - * @returns {Array} The new array of code points. - */ - function ucs2decode(string) { - var output = [], - counter = 0, - length = string.length, - value, - extra; - while (counter < length) { - value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // high surrogate, and there is a next character - extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { - // low surrogate - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // unmatched surrogate; only append this code unit, in case the next - // code unit is the high surrogate of a surrogate pair - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; - } - - /** - * Creates a string based on an array of numeric code points. - * @see `punycode.ucs2.decode` - * @memberOf punycode.ucs2 - * @name encode - * @param {Array} codePoints The array of numeric code points. - * @returns {String} The new Unicode string (UCS-2). - */ - function ucs2encode(array) { - return map(array, function (value) { - var output = ''; - if (value > 0xFFFF) { - value -= 0x10000; - output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); - value = 0xDC00 | value & 0x3FF; - } - output += stringFromCharCode(value); - return output; - }).join(''); - } - - /** - * Converts a basic code point into a digit/integer. - * @see `digitToBasic()` - * @private - * @param {Number} codePoint The basic numeric code point value. - * @returns {Number} The numeric value of a basic code point (for use in - * representing integers) in the range `0` to `base - 1`, or `base` if - * the code point does not represent a value. - */ - function basicToDigit(codePoint) { - if (codePoint - 48 < 10) { - return codePoint - 22; - } - if (codePoint - 65 < 26) { - return codePoint - 65; - } - if (codePoint - 97 < 26) { - return codePoint - 97; - } - return base; - } - - /** - * Converts a digit/integer into a basic code point. - * @see `basicToDigit()` - * @private - * @param {Number} digit The numeric value of a basic code point. - * @returns {Number} The basic code point whose value (when used for - * representing integers) is `digit`, which needs to be in the range - * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is - * used; else, the lowercase form is used. The behavior is undefined - * if `flag` is non-zero and `digit` has no uppercase form. - */ - function digitToBasic(digit, flag) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); - } - - /** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - * @private - */ - function adapt(delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); - } - - /** - * Converts a Punycode string of ASCII-only symbols to a string of Unicode - * symbols. - * @memberOf punycode - * @param {String} input The Punycode string of ASCII-only symbols. - * @returns {String} The resulting string of Unicode symbols. - */ - function decode(input) { - // Don't use UCS-2 - var output = [], - inputLength = input.length, - out, - i = 0, - n = initialN, - bias = initialBias, - basic, - j, - index, - oldi, - w, - k, - digit, - t, - - /** Cached calculation results */ - baseMinusT; - - // Handle the basic code points: let `basic` be the number of input code - // points before the last delimiter, or `0` if there is none, then copy - // the first basic code points to the output. - - basic = input.lastIndexOf(delimiter); - if (basic < 0) { - basic = 0; - } - - for (j = 0; j < basic; ++j) { - // if it's not a basic code point - if (input.charCodeAt(j) >= 0x80) { - error('not-basic'); - } - output.push(input.charCodeAt(j)); - } - - // Main decoding loop: start just after the last delimiter if any basic code - // points were copied; start at the beginning otherwise. - - for (index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ - - // `index` is the index of the next character to be consumed. - // Decode a generalized variable-length integer into `delta`, - // which gets added to `i`. The overflow checking is easier - // if we increase `i` as we go, then subtract off its starting - // value at the end to obtain `delta`. - for (oldi = i, w = 1, k = base;; /* no condition */k += base) { - - if (index >= inputLength) { - error('invalid-input'); - } - - digit = basicToDigit(input.charCodeAt(index++)); - - if (digit >= base || digit > floor((maxInt - i) / w)) { - error('overflow'); - } - - i += digit * w; - t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; - - if (digit < t) { - break; - } - - baseMinusT = base - t; - if (w > floor(maxInt / baseMinusT)) { - error('overflow'); - } - - w *= baseMinusT; - } - - out = output.length + 1; - bias = adapt(i - oldi, out, oldi == 0); - - // `i` was supposed to wrap around from `out` to `0`, - // incrementing `n` each time, so we'll fix that now: - if (floor(i / out) > maxInt - n) { - error('overflow'); - } - - n += floor(i / out); - i %= out; - - // Insert `n` at position `i` of the output - output.splice(i++, 0, n); - } - - return ucs2encode(output); - } - - /** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - * @memberOf punycode - * @param {String} input The string of Unicode symbols. - * @returns {String} The resulting Punycode string of ASCII-only symbols. - */ - function encode(input) { - var n, - delta, - handledCPCount, - basicLength, - bias, - j, - m, - q, - k, - t, - currentValue, - output = [], - - /** `inputLength` will hold the number of code points in `input`. */ - inputLength, - - /** Cached calculation results */ - handledCPCountPlusOne, - baseMinusT, - qMinusT; - - // Convert the input in UCS-2 to Unicode - input = ucs2decode(input); - - // Cache the length - inputLength = input.length; - - // Initialize the state - n = initialN; - delta = 0; - bias = initialBias; - - // Handle the basic code points - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - handledCPCount = basicLength = output.length; - - // `handledCPCount` is the number of code points that have been handled; - // `basicLength` is the number of basic code points. - - // Finish the basic string - if it is not empty - with a delimiter - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - - // All non-basic code points < n have been handled already. Find the next - // larger one: - for (m = maxInt, j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , - // but guard against overflow - handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - error('overflow'); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - - if (currentValue < n && ++delta > maxInt) { - error('overflow'); - } - - if (currentValue == n) { - // Represent delta as a generalized variable-length integer - for (q = delta, k = base;; /* no condition */k += base) { - t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; - if (q < t) { - break; - } - qMinusT = q - t; - baseMinusT = base - t; - output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q, 0))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - } - return output.join(''); - } - - /** - * Converts a Punycode string representing a domain name or an email address - * to Unicode. Only the Punycoded parts of the input will be converted, i.e. - * it doesn't matter if you call it on a string that has already been - * converted to Unicode. - * @memberOf punycode - * @param {String} input The Punycoded domain name or email address to - * convert to Unicode. - * @returns {String} The Unicode representation of the given Punycode - * string. - */ - function toUnicode(input) { - return mapDomain(input, function (string) { - return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; - }); - } - - /** - * Converts a Unicode string representing a domain name or an email address to - * Punycode. Only the non-ASCII parts of the domain name will be converted, - * i.e. it doesn't matter if you call it with a domain that's already in - * ASCII. - * @memberOf punycode - * @param {String} input The domain name or email address to convert, as a - * Unicode string. - * @returns {String} The Punycode representation of the given domain name or - * email address. - */ - function toASCII(input) { - return mapDomain(input, function (string) { - return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; - }); - } - - /*--------------------------------------------------------------------------*/ - - /** Define the public API */ - punycode = { - /** - * A string representing the current Punycode.js version number. - * @memberOf punycode - * @type String - */ - 'version': '1.3.2', - /** - * An object of methods to convert from JavaScript's internal character - * representation (UCS-2) to Unicode code points, and back. - * @see - * @memberOf punycode - * @type Object - */ - 'ucs2': { - 'decode': ucs2decode, - 'encode': ucs2encode - }, - 'decode': decode, - 'encode': encode, - 'toASCII': toASCII, - 'toUnicode': toUnicode - }; - - /** Expose `punycode` */ - // Some AMD build optimizers, like r.js, check for specific condition patterns - // like the following: - if (typeof define == 'function' && _typeof(define.amd) == 'object' && define.amd) { - define('punycode', function () { - return punycode; - }); - } else if (freeExports && freeModule) { - if (module.exports == freeExports) { - // in Node.js, io.js, or RingoJS v0.8.0+ - freeModule.exports = punycode; - } else { - // in Narwhal or RingoJS v0.7.0- - for (key in punycode) { - punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); - } - } - } else { - // in Rhino or a web browser - root.punycode = punycode; - } - })(this); - }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - }, {}], 2: [function (_dereq_, module, exports) { - var log = _dereq_('./log'); - - function restoreOwnerScroll(ownerDocument, x, y) { - if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) { - ownerDocument.defaultView.scrollTo(x, y); - } - } - - function cloneCanvasContents(canvas, clonedCanvas) { - try { - if (clonedCanvas) { - clonedCanvas.width = canvas.width; - clonedCanvas.height = canvas.height; - clonedCanvas.getContext("2d").putImageData(canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height), 0, 0); - } - } catch (e) { - log("Unable to copy canvas content from", canvas, e); - } - } - - function cloneNode(node, javascriptEnabled) { - var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false); - - var child = node.firstChild; - while (child) { - if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') { - clone.appendChild(cloneNode(child, javascriptEnabled)); - } - child = child.nextSibling; - } - - if (node.nodeType === 1) { - clone._scrollTop = node.scrollTop; - clone._scrollLeft = node.scrollLeft; - if (node.nodeName === "CANVAS") { - cloneCanvasContents(node, clone); - } else if (node.nodeName === "TEXTAREA" || node.nodeName === "SELECT") { - clone.value = node.value; - } - } - - return clone; - } - - function initNode(node) { - if (node.nodeType === 1) { - node.scrollTop = node._scrollTop; - node.scrollLeft = node._scrollLeft; - - var child = node.firstChild; - while (child) { - initNode(child); - child = child.nextSibling; - } - } - } - - module.exports = function (ownerDocument, containerDocument, width, height, options, x, y) { - var documentElement = cloneNode(ownerDocument.documentElement, options.javascriptEnabled); - var container = containerDocument.createElement("iframe"); - - container.className = "html2canvas-container"; - container.style.visibility = "hidden"; - container.style.position = "fixed"; - container.style.left = "-10000px"; - container.style.top = "0px"; - container.style.border = "0"; - container.width = width; - container.height = height; - container.scrolling = "no"; // ios won't scroll without it - containerDocument.body.appendChild(container); - - return new Promise(function (resolve) { - var documentClone = container.contentWindow.document; - - /* Chrome doesn't detect relative background-images assigned in inline - - <%= htmlWebpackPlugin.options.vendorScripts %> - - -

- - - - - - - - - diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..9888899 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,23 @@ +module.exports = { + collectCoverageFrom: ["src/**/*.js"], + testPathIgnorePatterns: ["/node_modules/", "/cypress"], + transformIgnorePatterns: ["/node_modules/(?!@eyeseetea/d2-ui-components)"], + modulePaths: ["src"], + moduleDirectories: ["node_modules"], + moduleNameMapper: { + "\\.(css|scss)$": "/config/styleMock.js", + "\\.(jpg|jpeg|png|svg)$": "/config/fileMock.js", + }, + transform: { + "^.+\\.[t|j]sx?$": "babel-jest", + }, + testRegex: "((\\.|/)(test|spec))\\.(jsx?|tsx?)$", + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], + testEnvironment: "jsdom", + globals: { + window: true, + document: true, + navigator: true, + Element: true, + }, +}; diff --git a/package.json b/package.json index d78f5b1..5f144d6 100644 --- a/package.json +++ b/package.json @@ -1,129 +1,128 @@ { - "name": "d2-user-extended-app", - "version": "0.7.1", - "description": "DHIS2 Extended User app", - "main": "src/index.html", - "license": "GPL-3.0", - "author": { - "name": "EyeSeeTea Team", - "email": "hello@eyeseetea.com", - "url": "https://github.com/EyeSeeTea/user-extended-app" - }, - "scripts": { - "prestart": "d2-manifest package.json manifest.webapp", - "start": "webpack-dev-server", - "test": "karma start test/config/karma.config.js --single-run true", - "test-watch": "karma start test/config/karma.config.js", - "lint": "eslint src && eslint --env node,mocha --global expect,sinon --rule 'no-unused-expressions: 0' test && scss-lint", - "__prebuild": "npm test && npm run lint", - "build": "rm -rf build && webpack && npm run manifest", - "postbuild": "cp -rv app-config.json src/i18n css includes icon.png app-favicon.ico node_modules/babel-polyfill/dist/polyfill.min.js node_modules/jquery/dist/jquery.min.js ./build/", - "build-webapp": "yarn build && rm -f User-Extended-App.zip && cd build && zip -r ../User-Extended-App.zip *", - "prettify": "prettier \"{src,scss}/**/*.{js,jsx,ts,tsx,json,css,scss}\" --write", - "validate": "npm ls", - "manifest": "d2-manifest package.json build/manifest.webapp", - "clean-i18n": "resources/scripts/clean-i18n-translations.js src/i18n/" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.8.0", - "babel-eslint": "^6.0.4", - "babel-loader": "^6.2.4", - "babel-preset-es2015": "^6.6.0", - "babel-preset-react": "^6.5.0", - "babel-preset-stage-0": "^6.5.0", - "chai": "3.0.0", - "classnames": "^2.2.3", - "coveralls": "2.11.4", - "css-loader": "^0.23.1", - "d2": "27.0.0-8", - "d2-manifest": "^1.0.0-2", - "d2-ui": "github:EyeSeeTea/d2-ui#user-extended-app", - "d2-utilizr": "0.2.9", - "d3-color": "1.0.2", - "eslint": "^3.6.0", - "eslint-config-dhis2": "^2.0.2", - "eslint-plugin-react": "^6.3.0", - "fbjs": "^0.2.1", - "html-webpack-plugin": "^3.2.0", - "http-proxy": "git+https://github.com/nicolayr/node-http-proxy.git", - "istanbul": "0.3.18", - "jquery": "^3.3.1", - "karma": "0.13.9", - "karma-babel-preprocessor": "5.2.1", - "karma-chai": "0.1.0", - "karma-coverage": "0.5.0", - "karma-mocha": "0.2.0", - "karma-mocha-reporter": "1.1.1", - "karma-sinon": "1.0.4", - "karma-sinon-chai": "1.0.0", - "karma-sourcemap-loader": "0.3.5", - "karma-webpack": "1.7.0", - "lodash.isequal": "^4.5.0", - "lodash.isfinite": "^3.3.1", - "lodash.isnumber": "^3.0.3", - "loglevel": "^1.4.0", - "material-ui": "^0.17", - "mocha": "2.2.5", - "moment": "^2.19.1", - "node-sass": "^3.7.0", - "phantomjs-polyfill": "0.0.1", - "precommit-hook": "3.0.0", - "prettier": "^1.18.2", - "react": "15.4.2", - "react-dnd": "^2.1.4", - "react-dnd-html5-backend": "^2.1.2", - "react-dom": "15.4.2", - "react-moment": "^0.6.5", - "react-router": "^2.5.2", - "react-style-proptype": "^3.2.1", - "react-tap-event-plugin": "^2.0.1", - "rx": "^4.1.0", - "rxjs": "^5.2.0", - "sass-loader": "^3.2.0", - "sinon": "^1.17.4", - "sinon-chai": "2.8.0", - "style-loader": "^0.13.1", - "unescape-js": "^1.1.0", - "webpack": "^1.13.0", - "webpack-dev-server": "^1.14.1", - "webpack-visualizer-plugin": "^0.1.5" - }, - "dependencies": { - "babel-polyfill": "^6.8.0", - "file-dialog": "^0.0.7", - "file-saver": "^1.3.8", - "immutability-helper": "^2.6.4", - "immutable": "^3.8.2", - "jquery": "^3.3.1", - "memoize-weak": "^1.0.2", - "papaparse": "^4.6.0", - "prop-types": "^15.5.10", - "react-animate-height": "^2.0.4", - "react-copy-to-clipboard": "^5.0.1", - "url-loader": "^1.1.1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/EyeSeeTea/user-extended-app.git" - }, - "bugs": { - "url": "https://github.com/EyeSeeTea/user-extended-app/issues" - }, - "homepage": "https://github.com/EyeSeeTea/user-extended-app", - "manifest.webapp": { - "name": "User Extended App", - "icons": { - "48": "icon.png" + "name": "user-extended-app", + "description": "DHIS2 Extended User app", + "version": "1.0.0-alpha.1", + "license": "GPL-3.0", + "author": "EyeSeeTea team", + "homepage": ".", + "repository": { + "type": "git", + "url": "git+https://github.com/EyeSeeTea/user-extended-app.git" }, - "developer": { - "url": "http://eyeseetea.com/", - "name": "EyeSeeTea Ltd" + "dependencies": { + "@dhis2/app-runtime": "3.2.2", + "@dhis2/d2-i18n": "1.1.0", + "@dhis2/d2-i18n-extract": "1.0.8", + "@dhis2/d2-i18n-generate": "1.2.0", + "@dhis2/ui": "7.2.1", + "@eyeseetea/d2-api": "1.9.2", + "@eyeseetea/d2-ui-components": "2.6.7", + "@material-ui/core": "4.12.3", + "@material-ui/icons": "4.11.2", + "axios": "0.21.4", + "classnames": "2.3.1", + "d2": "27.0.0-8", + "d2-manifest": "1.0.0", + "d2-ui": "29.0.35", + "d2-utilizr": "0.2.16", + "file-dialog": "0.0.8", + "file-saver": "2.0.5", + "fluture": "14.0.0", + "immutable": "3.8.2", + "lodash": "4.17.21", + "loglevel": "1.7.1", + "material-ui": "0.20.2", + "md5.js": "1.3.5", + "memoize-weak": "1.0.2", + "moment": "2.29.1", + "papaparse": "5.3.1", + "prop-types": "15.7.2", + "purify-ts": "1.0.0", + "purify-ts-extra-codec": "0.6.0", + "qs": "6.10.1", + "react": "17.0.2", + "react-animate-height": "2.0.23", + "react-copy-to-clipboard": "5.0.4", + "react-dom": "17.0.2", + "react-moment": "1.1.1", + "react-router-dom": "5.3.0", + "react-scripts": "4.0.3", + "rx": "4.1.0", + "rxjs": "6.6.7", + "styled-components": "5.3.1", + "styled-jsx": "4.0.1" }, - "activities": { - "dhis": { - "href": "*" - } + "devDependencies": { + "@babel/core": "7.15.5", + "@babel/preset-typescript": "7.15.0", + "@testing-library/cypress": "8.0.1", + "@testing-library/jest-dom": "5.14.1", + "@testing-library/react": "12.1.1", + "@types/jest": "27.0.2", + "@types/lodash": "4.14.175", + "@types/material-ui": "0.21.9", + "@types/node": "16.10.2", + "@types/react": "17.0.26", + "@types/react-dom": "17.0.9", + "@types/react-router-dom": "5.3.0", + "@types/styled-components": "5.1.14", + "@typescript-eslint/eslint-plugin": "4.32.0", + "@typescript-eslint/parser": "4.32.0", + "@welldone-software/why-did-you-render": "6.2.1", + "cmd-ts": "0.7.0", + "craco": "0.0.3", + "cypress-xpath": "1.6.2", + "eslint": "7.32.0", + "eslint-config-react-app": "6.0.0", + "eslint-plugin-cypress": "2.12.1", + "eslint-plugin-flowtype": "6.1.0", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-jsx-a11y": "6.4.1", + "eslint-plugin-react": "7.26.1", + "eslint-plugin-react-hooks": "4.2.0", + "eslint-plugin-unused-imports": "1.1.5", + "http-proxy-middleware": "2.0.1", + "husky": "7.0.2", + "jest": "27.2.4", + "prettier": "2.4.1", + "ts-jest": "27.0.5", + "ts-node": "10.2.1", + "typescript": "4.4.3" + }, + "scripts": { + "start": "react-scripts start", + "craco-start": "craco start", + "prebuild": "yarn localize && yarn test", + "build-folder": "rm -rf build/ && d2-manifest package.json manifest.webapp && react-scripts build && yarn run manifest && cp -r i18n icon.png build", + "build": "yarn build-folder && rm -f $npm_package_name.zip && cd build && zip --quiet -r ../$npm_package_name.zip *", + "test": "jest --passWithNoTests", + "lint": "eslint src cypress --ext .js,.jsx,.ts,.tsx", + "eject": "react-scripts eject", + "prettify": "prettier \"./**/*.{js,jsx,json,css,ts,tsx}\" --write", + "extract-pot": "yarn d2-i18n-extract -p src/ -o i18n/", + "localize": "yarn update-po && d2-i18n-generate -n user-extended-app -p ./i18n/ -o ./src/locales/", + "update-po": "yarn extract-pot && for pofile in i18n/*.po; do msgmerge --backup=off -U $pofile i18n/en.pot; done", + "manifest": "d2-manifest package.json build/manifest.webapp", + "cy:verify": "cypress verify", + "cy:e2e:open": "NODE_ENV=test CYPRESS_E2E=true cypress open", + "cy:e2e:run": "NODE_ENV=test CYPRESS_E2E=true cypress run --browser chrome", + "prepare": "husky install", + "script-example": "npx ts-node src/scripts/example.ts" + }, + "manifest.webapp": { + "name": "User Extended App", + "description": "User Extended App", + "icons": { + "48": "icon.png" + }, + "developer": { + "url": "https://www.eyeseetea.com/", + "name": "EyeSeeTea team" + }, + "activities": { + "dhis": { + "href": "*" + } + } } - } } diff --git a/app-config/app-config-default.json b/public/app-config/app-config-default.json similarity index 100% rename from app-config/app-config-default.json rename to public/app-config/app-config-default.json diff --git a/app-config/app-config-nrc.json b/public/app-config/app-config-nrc.json similarity index 100% rename from app-config/app-config-nrc.json rename to public/app-config/app-config-nrc.json diff --git a/app-config/app-config-who.json b/public/app-config/app-config-who.json similarity index 100% rename from app-config/app-config-who.json rename to public/app-config/app-config-who.json diff --git a/app-config/app-config.example.json b/public/app-config/app-config.example.json similarity index 100% rename from app-config/app-config.example.json rename to public/app-config/app-config.example.json diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1712927cdd231c01c91bfc06f8052078a7c2f320 GIT binary patch literal 4286 zcmeI0ZAep57{~7_Ln1*!!VeW@QGUp@iCCmzCJ__Nz8HqloHLXxXGxLOoY|7lN_)|n zROF_)sTF0GqkL&AwUuO{Emm4lZEBWIO-`;lKTJ2P_r~hDLvbYG=ce)pGb> zJ&sU?6ymxv7&w{tu#MGehR7jyCoXMDF4AFNkqqs!_uXG{JrudXsG;1cDg}$u;;*=0X@|+>diJvgXWY9U#horK6 zE8A1dM^IWk7DWZ4tM><8x~ftEQ9>YggmOqHpi*QoLE7Xtb?C7&Er!+*BuM}#+>iFc z>f31l(1rl+eE9p!MWWCTqPVpf`qgh!gK40>+lcs*T)0FATKQ=uGUS|1fuA=)dj_e| z-1nU+>aY3KeScr4K|qy7yZsmqanNsO1eI#%w<@#0jqO6c^u@gdgwrH^mI zDTD);Z3|HUs*W`-1^V3i39h__n75gr-95q$Mi!rqnW|&hkmw6v!5VOd-Ut$LAypn> zWe@rWe`3X6XDo>!uvEaITdKcY=tMpbOb*v@w@GPbQrz)gRFm&;{)_j|aNtTb)`{F{ z_AY(htm0na~9{7zsmpJ_~?lVOjXhuGq9>@SPLKGja}j7T&$O3fIO4gu-W=uHXCbo1atEL0c?-|0A`lQ`~Uy| literal 0 HcmV?d00001 diff --git a/public/feedback-tool/feedback-dhis2.min.js b/public/feedback-tool/feedback-dhis2.min.js new file mode 100644 index 0000000..a2f1344 --- /dev/null +++ b/public/feedback-tool/feedback-dhis2.min.js @@ -0,0 +1 @@ +"use strict";function _classCallCheck(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,n){for(var t=0;t.feedback-helper-inner{background:rgba(0,68,255,.1)}#feedback-close{background:url(icons.png) 0 -64px}.feedback-wizard-close{top:2px;right:2px;background:url(icons.png) 0 -34px;-webkit-opacity:.65;-moz-opacity:.65;opacity:.65}.feedback-wizard-close:hover{opacity:1}#feedback-overview-error,#feedback-welcome-error{display:none;color:#f13e3e;float:right;margin-right:30px;font-size:13px;line-height:29px}.feedback-btn-blue,.feedback-btn-gray{cursor:pointer;color:#fff;text-align:center;font-family:Roboto,sans-serif}#feedback-overview-error{margin-top:20px}#feedback-highlighter{display:none;bottom:100px;right:100px;position:fixed;height:275px}#feedback-overview{display:none;top:10%;left:50%;margin-left:-420px;position:fixed;width:840px!important;height:auto}#feedback-submit-error,#feedback-submit-success{top:30%;left:50%;margin-left:-300px;display:block;position:fixed;height:auto}.feedback-btn{padding:10px;outline:0;background-clip:padding-box;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);z-index:40000}.feedback-btn-gray{border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;background-color:#ff9800;font-weight:600;letter-spacing:.5px}.feedback-btn-gray:hover{border:2px solid #ff9800}.feedback-btn-blue{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;background-color:#4d90fe;background:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#357ae8));background:-webkit-linear-gradient(top,#4d90fe,#357ae8);background:-moz-linear-gradient(top,#4d90fe,#357ae8);background:-ms-linear-gradient(top,#4d90fe,#357ae8);background:-o-linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7}#feedback-note,#feedback-note-tmp{resize:none}#feedback-highlighter,#feedback-overview,#feedback-submit-error,#feedback-submit-success,#feedback-welcome{font-family:Roboto,sans-serif;z-index:40000;padding:30px 42px;width:540px;border:1px solid rgba(0,0,0,.333);outline:0;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateZ();-moz-transform:translateZ();-ms-transform:translateZ();-o-transform:translateZ()}.feedback-setblackout,.feedback-sethighlight{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f5f5f5;background:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background:-o-linear-gradient(top,#f5f5f5,#f1f1f1);color:#444;border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;cursor:default;font-size:11px;font-weight:700;text-align:center;white-space:nowrap;margin-right:16px;height:30px;line-height:28px;min-width:90px;outline:0;padding:0 8px;display:inline-block;float:left}.feedback-setblackout{margin-top:10px;clear:both}.feedback-sethighlight div{background:url(icons.png) 0 -94px;width:16px;height:16px;margin-top:7px;float:left}.feedback-setblackout div{background:url(icons.png) -16px -94px;width:16px;height:16px;margin-top:7px;float:left}.feedback-setblackout:hover,.feedback-sethighlight:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f8f8f8;background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f1f1f1));background:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background:-o-linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#333}.feedback-active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#e0e0e0));background:-webkit-linear-gradient(top,#eee,#e0e0e0);background:-moz-linear-gradient(top,#eee,#e0e0e0);background:-ms-linear-gradient(top,#eee,#e0e0e0);background:-o-linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}#feedback-highlighter label{float:left;margin:0 0 0 10px;line-height:30px;font-size:13px;font-weight:400}#feedback-highlighter label.lower{margin-top:10px}.feedback-buttons{float:right;margin-top:20px;clear:both}#feedback-module h3{font-weight:700;font-size:15px;margin:8px 0}#feedback-title{width:314px;padding:0 10px}.feedback-additional{margin-bottom:20px!important}#feedback-overview-description{float:left}#feedback-note{width:314px;padding:10px;height:150px;outline:0;font-family:Roboto,sans-serif;line-height:20px}#feedback-overview-screenshot{float:right}.feedback-screenshot{max-width:396px;padding:1px;border:1px solid #adadad}#feedback-overview-description-text span{font-size:14px;margin:8px 0 8px 26px;color:#666;padding-left:10px;background:url(icons.png) -30px -34px no-repeat}#feedback-additional-none,#feedback-browser-info,#feedback-page-info,#feedback-page-structure{margin-top:16px;display:none}.feedback-spinner{position:absolute;top:0;left:0;z-index:10000000;background:url(spinner.gif);width:32px;height:32px} \ No newline at end of file diff --git a/public/feedback-tool/feedback.min.js b/public/feedback-tool/feedback.min.js new file mode 100644 index 0000000..e329fd9 --- /dev/null +++ b/public/feedback-tool/feedback.min.js @@ -0,0 +1,6 @@ +"use strict";function _classCallCheck(A,e){if(!(A instanceof e))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function A(A,e){for(var t=0;t0&&o[o.length-1])&&(6===t[0]||2===t[0])){B=0;continue}if(3===t[0]&&(!o||t[1]>o[0]&&t[1]=1&&(t-=1),t<1/6?(e-A)*t*6+A:t<.5?e:t<2/3?6*(e-A)*(2/3-t)+A:A}function n(A){return A.type!==h.FUNCTION||un[A.name]}for(var s=function(A,e){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,e){A.__proto__=e}||function(A,e){for(var t in e)e.hasOwnProperty(t)&&(A[t]=e[t])})(A,e)},o=function(){return o=Object.assign||function(A){for(var e,t=1,r=arguments.length;t=55296&&n<=56319&&t>10)+55296,o%1024+56320)),(n+1===t||r.length>16384)&&(s+=String.fromCharCode.apply(String,r),r.length=0)}return s},Q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l="undefined"==typeof Uint8Array?[]:new Uint8Array(256),w=0;w>4,c[B++]=(15&r)<<4|n>>2,c[B++]=(3&n)<<6|63&s;return a},d=function(A){for(var e=A.length,t=[],r=0;r>C,H=1<>C,m=p+K,b=m,v=32,I=b+v,T=65536>>f,R=1<=0){if(A<55296||A>56319&&A<=65535)return e=this.index[A>>C],e=(e<>C)],e=(e<>f),e=this.index[e],e+=A>>C&y,e=this.index[e],e=(e<_?(n.push(!0),o-=_):n.push(!1),["normal","auto","loose"].indexOf(e)!==-1&&[8208,8211,12316,12448].indexOf(A)!==-1)return r.push(s),t.push(AA);if(o===z||o===Y){if(0===s)return r.push(s),t.push(wA);var i=t[s-1];return SA.indexOf(i)===-1?(r.push(r[s-1]),t.push(i)):(r.push(s),t.push(wA))}return r.push(s),o===hA?t.push("strict"===e?sA:EA):o===KA?t.push(wA):o===lA?t.push(wA):o===mA?A>=131072&&A<=196605||A>=196608&&A<=262141?t.push(EA):t.push(wA):void t.push(o)}),[r,t,n]},kA=function(A,e,t,r){var n=r[t];if(Array.isArray(A)?A.indexOf(n)!==-1:A===n)for(var s=t;s<=r.length;){s++;var o=r[s];if(o===e)return!0;if(o!==W)break}if(n===W)for(var s=t;s>0;){s--;var i=r[s];if(Array.isArray(A)?A.indexOf(i)!==-1:A===i)for(var B=t;B<=r.length;){B++;var o=r[B];if(o===e)return!0;if(o!==W)break}if(i!==W)break}return!1},xA=function(A,e){for(var t=A;t>=0;){var r=e[t];if(r!==W)return r;t--}return 0},PA=function(A,e,t,r,n){if(0===t[r])return vA;var s=r-1;if(Array.isArray(n)&&n[s]===!0)return vA;var o=s-1,i=s+1,B=e[s],a=o>=0?e[o]:0,c=e[i];if(B===x&&c===P)return vA;if(yA.indexOf(B)!==-1)return bA;if(yA.indexOf(c)!==-1)return vA;if(LA.indexOf(c)!==-1)return vA;if(xA(s,e)===J)return IA;if(TA.get(A[s])===Y&&(c===EA||c===gA||c===dA))return vA;if(B===X||c===X)return vA;if(B===G)return vA;if([W,j,$].indexOf(B)===-1&&c===G)return vA;if([eA,tA,rA,BA,QA].indexOf(c)!==-1)return vA;if(xA(s,e)===oA)return vA;if(kA(iA,oA,s,e))return vA;if(kA([eA,tA],sA,s,e))return vA;if(kA(q,q,s,e))return vA;if(B===W)return IA;if(B===iA||c===iA)return vA;if(c===AA||B===AA)return IA;if([j,$,sA].indexOf(c)!==-1||B===Z)return vA;if(a===fA&&MA.indexOf(B)!==-1)return vA;if(B===QA&&c===fA)return vA;if(c===nA&&RA.concat(nA,rA,aA,EA,gA,dA).indexOf(B)!==-1)return vA;if(RA.indexOf(c)!==-1&&B===aA||RA.indexOf(B)!==-1&&c===aA)return vA;if(B===uA&&[EA,gA,dA].indexOf(c)!==-1||[EA,gA,dA].indexOf(B)!==-1&&c===cA)return vA;if(RA.indexOf(B)!==-1&&OA.indexOf(c)!==-1||OA.indexOf(B)!==-1&&RA.indexOf(c)!==-1)return vA;if([uA,cA].indexOf(B)!==-1&&(c===aA||[oA,$].indexOf(c)!==-1&&e[i+1]===aA)||[oA,$].indexOf(B)!==-1&&c===aA||B===aA&&[aA,QA,BA].indexOf(c)!==-1)return vA;if([aA,QA,BA,eA,tA].indexOf(c)!==-1)for(var u=s;u>=0;){var Q=e[u];if(Q===aA)return vA;if([QA,BA].indexOf(Q)===-1)break;u--}if([uA,cA].indexOf(c)!==-1)for(var u=[eA,tA].indexOf(B)!==-1?o:s;u>=0;){var Q=e[u];if(Q===aA)return vA;if([QA,BA].indexOf(Q)===-1)break;u--}if(FA===B&&[FA,pA,UA,CA].indexOf(c)!==-1||[pA,UA].indexOf(B)!==-1&&[pA,HA].indexOf(c)!==-1||[HA,CA].indexOf(B)!==-1&&c===HA)return vA;if(DA.indexOf(B)!==-1&&[nA,cA].indexOf(c)!==-1||DA.indexOf(c)!==-1&&B===uA)return vA;if(RA.indexOf(B)!==-1&&RA.indexOf(c)!==-1)return vA;if(B===BA&&RA.indexOf(c)!==-1)return vA;if(RA.concat(aA).indexOf(B)!==-1&&c===oA||RA.concat(aA).indexOf(c)!==-1&&B===tA)return vA;if(B===NA&&c===NA){for(var l=t[s],w=1;l>0&&(l--,e[l]===NA);)w++;if(w%2!==0)return vA}return B===gA&&c===dA?vA:IA},zA=function(A,e){e||(e={lineBreak:"normal",wordBreak:"normal"});var t=_A(A,e.lineBreak),r=t[0],n=t[1],s=t[2];"break-all"!==e.wordBreak&&"break-word"!==e.wordBreak||(n=n.map(function(A){return[aA,wA,KA].indexOf(A)!==-1?EA:A}));var o="keep-all"===e.wordBreak?s.map(function(e,t){return e&&A[t]>=19968&&A[t]<=40959}):void 0;return[r,n,o]},VA=function(){function A(A,e,t,r){this.codePoints=A,this.required=e===bA,this.start=t,this.end=r}return A.prototype.slice=function(){return u.apply(void 0,this.codePoints.slice(this.start,this.end))},A}(),XA=function(A,e){var t=c(A),r=zA(t,e),n=r[0],s=r[1],o=r[2],i=t.length,B=0,a=0;return{next:function(){if(a>=i)return{done:!0,value:null};for(var A=vA;a=_e&&A<=57},je=function(A){return A>=55296&&A<=57343},Ze=function(A){return qe(A)||A>=Xe&&A<=Ge||A>=ke&&A<=Pe},$e=function(A){return A>=ke&&A<=Ve},At=function(A){return A>=Xe&&A<=Ye},et=function(A){return $e(A)||At(A)},tt=function(A){return A>=He},rt=function(A){return A===jA||A===Ae||A===ee},nt=function(A){return et(A)||tt(A)||A===ce},st=function(A){return nt(A)||qe(A)||A===ue},ot=function(A){return A>=Re&&A<=ye||A===Le||A>=Oe&&A<=Se||A===De},it=function(A,e){return A===$A&&e!==jA},Bt=function(A,e,t){return A===ue?nt(e)||it(e,t):!!nt(A)||!(A!==$A||!it(A,e))},at=function(A,e,t){return A===me||A===ue?!!qe(e)||e===Te&&qe(t):qe(A===Te?e:A)},ct=function(A){var e=0,t=1;A[e]!==me&&A[e]!==ue||(A[e]===ue&&(t=-1),e++);for(var r=[];qe(A[e]);)r.push(A[e++]);var n=r.length?parseInt(u.apply(void 0,r),10):0;A[e]===Te&&e++;for(var s=[];qe(A[e]);)s.push(A[e++]);var o=s.length,i=o?parseInt(u.apply(void 0,s),10):0;A[e]!==Je&&A[e]!==xe||e++;var B=1;A[e]!==me&&A[e]!==ue||(A[e]===ue&&(B=-1),e++);for(var a=[];qe(A[e]);)a.push(A[e++]);var c=a.length?parseInt(u.apply(void 0,a),10):0;return t*(n+i*Math.pow(10,-o))*Math.pow(10,B*c)},ut={type:h.LEFT_PARENTHESIS_TOKEN},Qt={type:h.RIGHT_PARENTHESIS_TOKEN},lt={type:h.COMMA_TOKEN},wt={type:h.SUFFIX_MATCH_TOKEN},ht={type:h.PREFIX_MATCH_TOKEN},gt={type:h.COLUMN_TOKEN},dt={type:h.DASH_MATCH_TOKEN},Ut={type:h.INCLUDE_MATCH_TOKEN},Ct={type:h.LEFT_CURLY_BRACKET_TOKEN},ft={type:h.RIGHT_CURLY_BRACKET_TOKEN},Et={type:h.SUBSTRING_MATCH_TOKEN},Ft={type:h.BAD_URL_TOKEN},pt={type:h.BAD_STRING_TOKEN},Ht={type:h.CDO_TOKEN},Nt={type:h.CDC_TOKEN},Kt={type:h.COLON_TOKEN},mt={type:h.SEMICOLON_TOKEN},bt={type:h.LEFT_SQUARE_BRACKET_TOKEN},vt={type:h.RIGHT_SQUARE_BRACKET_TOKEN},It={type:h.WHITESPACE_TOKEN},Tt={type:h.EOF_TOKEN},Rt=function(){function A(){this._value=[]}return A.prototype.write=function(A){this._value=this._value.concat(c(A))},A.prototype.read=function(){for(var A=[],e=this.consumeToken();e!==Tt;)A.push(e),e=this.consumeToken();return A},A.prototype.consumeToken=function(){var A=this.consumeCodePoint();switch(A){case te:return this.consumeStringToken(te);case ne:var e=this.peekCodePoint(0),t=this.peekCodePoint(1),r=this.peekCodePoint(2);if(st(e)||it(t,r)){var n=Bt(e,t,r)?WA:GA,s=this.consumeName();return{type:h.HASH_TOKEN,value:s,flags:n}}break;case se:if(this.peekCodePoint(0)===re)return this.consumeCodePoint(),wt;break;case ie:return this.consumeStringToken(ie);case Be:return ut;case ae:return Qt;case Ke:if(this.peekCodePoint(0)===re)return this.consumeCodePoint(),Et;break;case me:if(at(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case be:return lt;case ue:var o=A,i=this.peekCodePoint(0),B=this.peekCodePoint(1);if(at(o,i,B))return this.reconsumeCodePoint(A),this.consumeNumericToken();if(Bt(o,i,B))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();if(i===ue&&B===we)return this.consumeCodePoint(),this.consumeCodePoint(),Nt;break;case Te:if(at(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case ZA:if(this.peekCodePoint(0)===Ke)for(this.consumeCodePoint();;){var a=this.consumeCodePoint();if(a===Ke&&(a=this.consumeCodePoint(),a===ZA))return this.consumeToken();if(a===Me)return this.consumeToken()}break;case ve:return Kt;case Ie:return mt;case le:if(this.peekCodePoint(0)===Qe&&this.peekCodePoint(1)===ue&&this.peekCodePoint(2)===ue)return this.consumeCodePoint(),this.consumeCodePoint(),Ht;break;case he:var c=this.peekCodePoint(0),Q=this.peekCodePoint(1),l=this.peekCodePoint(2);if(Bt(c,Q,l)){var s=this.consumeName();return{type:h.AT_KEYWORD_TOKEN,value:s}}break;case ge:return bt;case $A:if(it(A,this.peekCodePoint(0)))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();break;case de:return vt;case Ue:if(this.peekCodePoint(0)===re)return this.consumeCodePoint(),ht;break;case Ce:return Ct;case Ee:return ft;case ze:case We:var w=this.peekCodePoint(0),g=this.peekCodePoint(1);return w!==me||!Ze(g)&&g!==fe||(this.consumeCodePoint(),this.consumeUnicodeRangeToken()),this.reconsumeCodePoint(A),this.consumeIdentLikeToken();case Fe:if(this.peekCodePoint(0)===re)return this.consumeCodePoint(),dt;if(this.peekCodePoint(0)===Fe)return this.consumeCodePoint(),gt;break;case pe:if(this.peekCodePoint(0)===re)return this.consumeCodePoint(),Ut;break;case Me:return Tt}return rt(A)?(this.consumeWhiteSpace(),It):qe(A)?(this.reconsumeCodePoint(A),this.consumeNumericToken()):nt(A)?(this.reconsumeCodePoint(A),this.consumeIdentLikeToken()):{type:h.DELIM_TOKEN,value:u(A)}},A.prototype.consumeCodePoint=function(){var A=this._value.shift();return"undefined"==typeof A?-1:A},A.prototype.reconsumeCodePoint=function(A){this._value.unshift(A)},A.prototype.peekCodePoint=function(A){return A>=this._value.length?-1:this._value[A]},A.prototype.consumeUnicodeRangeToken=function(){for(var A=[],e=this.consumeCodePoint();Ze(e)&&A.length<6;)A.push(e),e=this.consumeCodePoint();for(var t=!1;e===fe&&A.length<6;)A.push(e),e=this.consumeCodePoint(),t=!0;if(t){var r=parseInt(u.apply(void 0,A.map(function(A){return A===fe?_e:A})),16),n=parseInt(u.apply(void 0,A.map(function(A){return A===fe?Ge:A})),16);return{type:h.UNICODE_RANGE_TOKEN,start:r,end:n}}var s=parseInt(u.apply(void 0,A),16);if(this.peekCodePoint(0)===ue&&Ze(this.peekCodePoint(1))){this.consumeCodePoint(),e=this.consumeCodePoint();for(var o=[];Ze(e)&&o.length<6;)o.push(e),e=this.consumeCodePoint();var n=parseInt(u.apply(void 0,o),16);return{type:h.UNICODE_RANGE_TOKEN,start:s,end:n}}return{type:h.UNICODE_RANGE_TOKEN,start:s,end:s}},A.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return"url"===A.toLowerCase()&&this.peekCodePoint(0)===Be?(this.consumeCodePoint(),this.consumeUrlToken()):this.peekCodePoint(0)===Be?(this.consumeCodePoint(),{type:h.FUNCTION_TOKEN,value:A}):{type:h.IDENT_TOKEN,value:A}},A.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),this.peekCodePoint(0)===Me)return{type:h.URL_TOKEN,value:""};var e=this.peekCodePoint(0);if(e===ie||e===te){var t=this.consumeStringToken(this.consumeCodePoint());return t.type===h.STRING_TOKEN&&(this.consumeWhiteSpace(),this.peekCodePoint(0)===Me||this.peekCodePoint(0)===ae)?(this.consumeCodePoint(),{type:h.URL_TOKEN,value:t.value}):(this.consumeBadUrlRemnants(),Ft)}for(;;){var r=this.consumeCodePoint();if(r===Me||r===ae)return{type:h.URL_TOKEN,value:u.apply(void 0,A)};if(rt(r))return this.consumeWhiteSpace(),this.peekCodePoint(0)===Me||this.peekCodePoint(0)===ae?(this.consumeCodePoint(),{type:h.URL_TOKEN,value:u.apply(void 0,A)}):(this.consumeBadUrlRemnants(),Ft);if(r===te||r===ie||r===Be||ot(r))return this.consumeBadUrlRemnants(),Ft;if(r===$A){if(!it(r,this.peekCodePoint(0)))return this.consumeBadUrlRemnants(),Ft;A.push(this.consumeEscapedCodePoint())}else A.push(r)}},A.prototype.consumeWhiteSpace=function(){for(;rt(this.peekCodePoint(0));)this.consumeCodePoint()},A.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(A===ae||A===Me)return;it(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},A.prototype.consumeStringSlice=function(A){for(var e=6e4,t="";A>0;){var r=Math.min(e,A);t+=u.apply(void 0,this._value.splice(0,r)),A-=r}return this._value.shift(),t},A.prototype.consumeStringToken=function(A){for(var e="",t=0;;){var r=this._value[t];if(r===Me||void 0===r||r===A)return e+=this.consumeStringSlice(t),{type:h.STRING_TOKEN,value:e};if(r===jA)return this._value.splice(0,t),pt;if(r===$A){var n=this._value[t+1];n!==Me&&void 0!==n&&(n===jA?(e+=this.consumeStringSlice(t),t=-1,this._value.shift()):it(r,n)&&(e+=this.consumeStringSlice(t),e+=u(this.consumeEscapedCodePoint()),t=-1))}t++}},A.prototype.consumeNumber=function(){var A=[],e=YA,t=this.peekCodePoint(0);for(t!==me&&t!==ue||A.push(this.consumeCodePoint());qe(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0);var r=this.peekCodePoint(1);if(t===Te&&qe(r))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=qA;qe(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0),r=this.peekCodePoint(1);var n=this.peekCodePoint(2);if((t===Je||t===xe)&&((r===me||r===ue)&&qe(n)||qe(r)))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=qA;qe(this.peekCodePoint(0));)A.push(this.consumeCodePoint());return[ct(A),e]},A.prototype.consumeNumericToken=function(){var A=this.consumeNumber(),e=A[0],t=A[1],r=this.peekCodePoint(0),n=this.peekCodePoint(1),s=this.peekCodePoint(2);if(Bt(r,n,s)){var o=this.consumeName();return{type:h.DIMENSION_TOKEN,number:e,flags:t,unit:o}}return r===oe?(this.consumeCodePoint(),{type:h.PERCENTAGE_TOKEN,number:e,flags:t}):{type:h.NUMBER_TOKEN,number:e,flags:t}},A.prototype.consumeEscapedCodePoint=function(){var A=this.consumeCodePoint();if(Ze(A)){for(var e=u(A);Ze(this.peekCodePoint(0))&&e.length<6;)e+=u(this.consumeCodePoint());rt(this.peekCodePoint(0))&&this.consumeCodePoint();var t=parseInt(e,16);return 0===t||je(t)||t>1114111?Ne:t}return A===Me?Ne:A},A.prototype.consumeName=function(){for(var A="";;){var e=this.consumeCodePoint();if(st(e))A+=u(e);else{if(!it(e,this.peekCodePoint(0)))return this.reconsumeCodePoint(e),A;A+=u(this.consumeEscapedCodePoint())}}},A}(),yt=function(){function A(A){this._tokens=A}return A.create=function(e){var t=new Rt;return t.write(e),new A(t.read())},A.parseValue=function(e){return A.create(e).parseComponentValue()},A.parseValues=function(e){return A.create(e).parseComponentValues()},A.prototype.parseComponentValue=function(){for(var A=this.consumeToken();A.type===h.WHITESPACE_TOKEN;)A=this.consumeToken();if(A.type===h.EOF_TOKEN)throw new SyntaxError("Error parsing CSS component value, unexpected EOF");this.reconsumeToken(A);var e=this.consumeComponentValue();do A=this.consumeToken();while(A.type===h.WHITESPACE_TOKEN);if(A.type===h.EOF_TOKEN)return e;throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one")},A.prototype.parseComponentValues=function(){for(var A=[];;){var e=this.consumeComponentValue();if(e.type===h.EOF_TOKEN)return A;A.push(e),A.push()}},A.prototype.consumeComponentValue=function(){var A=this.consumeToken();switch(A.type){case h.LEFT_CURLY_BRACKET_TOKEN:case h.LEFT_SQUARE_BRACKET_TOKEN:case h.LEFT_PARENTHESIS_TOKEN:return this.consumeSimpleBlock(A.type);case h.FUNCTION_TOKEN:return this.consumeFunction(A)}return A},A.prototype.consumeSimpleBlock=function(A){for(var e={type:A,values:[]},t=this.consumeToken();;){if(t.type===h.EOF_TOKEN||Pt(t,A))return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue()),t=this.consumeToken()}},A.prototype.consumeFunction=function(A){for(var e={name:A.value,values:[],type:h.FUNCTION};;){var t=this.consumeToken();if(t.type===h.EOF_TOKEN||t.type===h.RIGHT_PARENTHESIS_TOKEN)return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue())}},A.prototype.consumeToken=function(){var A=this._tokens.shift();return"undefined"==typeof A?Tt:A},A.prototype.reconsumeToken=function(A){this._tokens.unshift(A)},A}(),Lt=function(A){return A.type===h.DIMENSION_TOKEN},Ot=function(A){return A.type===h.NUMBER_TOKEN},St=function(A){return A.type===h.IDENT_TOKEN},Dt=function(A){return A.type===h.STRING_TOKEN},Mt=function(A,e){return St(A)&&A.value===e},_t=function(A){return A.type!==h.WHITESPACE_TOKEN},kt=function(A){return A.type!==h.WHITESPACE_TOKEN&&A.type!==h.COMMA_TOKEN},xt=function(A){var e=[],t=[];return A.forEach(function(A){if(A.type===h.COMMA_TOKEN){if(0===t.length)throw new Error("Error parsing function args, zero tokens for arg");return e.push(t),void(t=[])}A.type!==h.WHITESPACE_TOKEN&&t.push(A)}),t.length&&e.push(t),e},Pt=function(A,e){return e===h.LEFT_CURLY_BRACKET_TOKEN&&A.type===h.RIGHT_CURLY_BRACKET_TOKEN||(e===h.LEFT_SQUARE_BRACKET_TOKEN&&A.type===h.RIGHT_SQUARE_BRACKET_TOKEN||e===h.LEFT_PARENTHESIS_TOKEN&&A.type===h.RIGHT_PARENTHESIS_TOKEN)},zt=function(A){return A.type===h.NUMBER_TOKEN||A.type===h.DIMENSION_TOKEN},Vt=function(A){return A.type===h.PERCENTAGE_TOKEN||zt(A)},Xt=function(A){return A.length>1?[A[0],A[1]]:[A[0]]},Jt={type:h.NUMBER_TOKEN,number:0,flags:YA},Gt={type:h.PERCENTAGE_TOKEN,number:50,flags:YA},Wt={type:h.PERCENTAGE_TOKEN,number:100,flags:YA},Yt=function(A,e,t){var r=A[0],n=A[1];return[qt(r,e),qt("undefined"!=typeof n?n:r,t)]},qt=function(A,e){if(A.type===h.PERCENTAGE_TOKEN)return A.number/100*e;if(Lt(A))switch(A.unit){case"rem":case"em":return 16*A.number;case"px":default:return A.number}return A.number},jt="deg",Zt="grad",$t="rad",Ar="turn",er={name:"angle",parse:function(A){if(A.type===h.DIMENSION_TOKEN)switch(A.unit){case jt:return Math.PI*A.number/180;case Zt:return Math.PI/200*A.number;case $t:return A.number;case Ar:return 2*Math.PI*A.number}throw new Error("Unsupported angle type")}},tr=function(A){return A.type===h.DIMENSION_TOKEN&&(A.unit===jt||A.unit===Zt||A.unit===$t||A.unit===Ar)},rr=function(A){var e=A.filter(St).map(function(A){return A.value}).join(" ");switch(e){case"to bottom right":case"to right bottom":case"left top":case"top left":return[Jt,Jt];case"to top":case"bottom":return nr(0);case"to bottom left":case"to left bottom":case"right top":case"top right":return[Jt,Wt];case"to right":case"left":return nr(90);case"to top left":case"to left top":case"right bottom":case"bottom right":return[Wt,Wt];case"to bottom":case"top":return nr(180);case"to top right":case"to right top":case"left bottom":case"bottom left":return[Wt,Jt];case"to left":case"right":return nr(270)}return 0},nr=function(A){return Math.PI*A/180},sr={name:"color",parse:function(A){if(A.type===h.FUNCTION){var e=Qr[A.name];if("undefined"==typeof e)throw new Error('Attempting to parse an unsupported color function "'+A.name+'"');return e(A.values)}if(A.type===h.HASH_TOKEN){if(3===A.value.length){var t=A.value.substring(0,1),r=A.value.substring(1,2),n=A.value.substring(2,3);return Br(parseInt(t+t,16),parseInt(r+r,16),parseInt(n+n,16),1)}if(4===A.value.length){var t=A.value.substring(0,1),r=A.value.substring(1,2),n=A.value.substring(2,3),s=A.value.substring(3,4);return Br(parseInt(t+t,16),parseInt(r+r,16),parseInt(n+n,16),parseInt(s+s,16)/255)}if(6===A.value.length){var t=A.value.substring(0,2),r=A.value.substring(2,4),n=A.value.substring(4,6);return Br(parseInt(t,16),parseInt(r,16),parseInt(n,16),1)}if(8===A.value.length){var t=A.value.substring(0,2),r=A.value.substring(2,4),n=A.value.substring(4,6),s=A.value.substring(6,8);return Br(parseInt(t,16),parseInt(r,16),parseInt(n,16),parseInt(s,16)/255)}}if(A.type===h.IDENT_TOKEN){var o=lr[A.value.toUpperCase()];if("undefined"!=typeof o)return o}return lr.TRANSPARENT}},or=function(A){return 0===(255&A)},ir=function(A){var e=255&A,t=255&A>>8,r=255&A>>16,n=255&A>>24;return e<255?"rgba("+n+","+r+","+t+","+e/255+")":"rgb("+n+","+r+","+t+")"},Br=function(A,e,t,r){return(A<<24|e<<16|t<<8|Math.round(255*r)<<0)>>>0},ar=function(A,e){if(A.type===h.NUMBER_TOKEN)return A.number;if(A.type===h.PERCENTAGE_TOKEN){var t=3===e?1:255;return 3===e?A.number/100*t:Math.round(A.number/100*t)}return 0},cr=function(A){var e=A.filter(kt);if(3===e.length){var t=e.map(ar),r=t[0],n=t[1],s=t[2];return Br(r,n,s,1)}if(4===e.length){var o=e.map(ar),r=o[0],n=o[1],s=o[2],i=o[3];return Br(r,n,s,i)}return 0},ur=function(A){var e=A.filter(kt),t=e[0],n=e[1],s=e[2],o=e[3],i=(t.type===h.NUMBER_TOKEN?nr(t.number):er.parse(t))/(2*Math.PI),B=Vt(n)?n.number/100:0,a=Vt(s)?s.number/100:0,c="undefined"!=typeof o&&Vt(o)?qt(o,1):1;if(0===B)return Br(255*a,255*a,255*a,1);var u=a<=.5?a*(B+1):a+B-a*B,Q=2*a-u,l=r(Q,u,i+1/3),w=r(Q,u,i),g=r(Q,u,i-1/3);return Br(255*l,255*w,255*g,c)},Qr={hsl:ur,hsla:ur,rgb:cr,rgba:cr},lr={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199};!function(A){A[A.VALUE=0]="VALUE",A[A.LIST=1]="LIST",A[A.IDENT_VALUE=2]="IDENT_VALUE",A[A.TYPE_VALUE=3]="TYPE_VALUE",A[A.TOKEN_VALUE=4]="TOKEN_VALUE"}(JA||(JA={}));var wr;!function(A){A[A.BORDER_BOX=0]="BORDER_BOX",A[A.PADDING_BOX=1]="PADDING_BOX",A[A.CONTENT_BOX=2]="CONTENT_BOX"}(wr||(wr={}));var hr,gr={name:"background-clip",initialValue:"border-box",prefix:!1,type:JA.LIST,parse:function(A){return A.map(function(A){if(St(A))switch(A.value){case"padding-box":return wr.PADDING_BOX;case"content-box":return wr.CONTENT_BOX}return wr.BORDER_BOX})}},dr={name:"background-color",initialValue:"transparent",prefix:!1,type:JA.TYPE_VALUE,format:"color"},Ur=function(A){var e=sr.parse(A[0]),t=A[1];return t&&Vt(t)?{color:e,stop:t}:{color:e,stop:null}},Cr=function(A,e){var t=A[0],r=A[A.length-1];null===t.stop&&(t.stop=Jt),null===r.stop&&(r.stop=Wt);for(var n=[],s=0,o=0;os?n.push(B):n.push(s),s=B}else n.push(null)}for(var a=null,o=0;oA.optimumDistance)?{optimumCorner:e,optimumDistance:i}:A},{optimumDistance:n?1/0:-(1/0),optimumCorner:null}).optimumCorner},Hr=function(A,e,t,r,n){var s=0,o=0;switch(A.size){case Bn.CLOSEST_SIDE:A.shape===nn.CIRCLE?s=o=Math.min(Math.abs(e),Math.abs(e-r),Math.abs(t),Math.abs(t-n)):A.shape===nn.ELLIPSE&&(s=Math.min(Math.abs(e),Math.abs(e-r)),o=Math.min(Math.abs(t),Math.abs(t-n)));break;case Bn.CLOSEST_CORNER:if(A.shape===nn.CIRCLE)s=o=Math.min(Fr(e,t),Fr(e,t-n),Fr(e-r,t),Fr(e-r,t-n));else if(A.shape===nn.ELLIPSE){var i=Math.min(Math.abs(t),Math.abs(t-n))/Math.min(Math.abs(e),Math.abs(e-r)),B=pr(r,n,e,t,!0),a=B[0],c=B[1];s=Fr(a-e,(c-t)/i),o=i*s}break;case Bn.FARTHEST_SIDE:A.shape===nn.CIRCLE?s=o=Math.max(Math.abs(e),Math.abs(e-r),Math.abs(t),Math.abs(t-n)):A.shape===nn.ELLIPSE&&(s=Math.max(Math.abs(e),Math.abs(e-r)),o=Math.max(Math.abs(t),Math.abs(t-n)));break;case Bn.FARTHEST_CORNER:if(A.shape===nn.CIRCLE)s=o=Math.max(Fr(e,t),Fr(e,t-n),Fr(e-r,t),Fr(e-r,t-n));else if(A.shape===nn.ELLIPSE){var i=Math.max(Math.abs(t),Math.abs(t-n))/Math.max(Math.abs(e),Math.abs(e-r)),u=pr(r,n,e,t,!1),a=u[0],c=u[1];s=Fr(a-e,(c-t)/i),o=i*s}}return Array.isArray(A.size)&&(s=qt(A.size[0],r),o=2===A.size.length?qt(A.size[1],n):s),[s,o]},Nr=function(A){var e=nr(180),t=[];return xt(A).forEach(function(A,r){if(0===r){var n=A[0];if(n.type===h.IDENT_TOKEN&&"to"===n.value)return void(e=rr(A));if(tr(n))return void(e=er.parse(n))}var s=Ur(A);t.push(s)}),{angle:e,stops:t,type:hr.LINEAR_GRADIENT}},Kr=function(A){var e=nr(180),t=[];return xt(A).forEach(function(A,r){if(0===r){var n=A[0];if(n.type===h.IDENT_TOKEN&&["top","left","right","bottom"].indexOf(n.value)!==-1)return void(e=rr(A));if(tr(n))return void(e=(er.parse(n)+nr(270))%nr(360))}var s=Ur(A);t.push(s)}),{angle:e,stops:t,type:hr.LINEAR_GRADIENT}},mr=function(A){var e=123;if(A.createRange){var t=A.createRange();if(t.getBoundingClientRect){var r=A.createElement("boundtest");r.style.height=e+"px",r.style.display="block",A.body.appendChild(r),t.selectNode(r);var n=t.getBoundingClientRect(),s=Math.round(n.height);if(A.body.removeChild(r),s===e)return!0}}return!1},br=function(){return"undefined"!=typeof(new Image).crossOrigin},vr=function(){return"string"==typeof(new XMLHttpRequest).responseType},Ir=function(A){var e=new Image,t=A.createElement("canvas"),r=t.getContext("2d");if(!r)return!1;e.src="data:image/svg+xml,";try{r.drawImage(e,0,0),t.toDataURL()}catch(n){return!1}return!0},Tr=function(A){return 0===A[0]&&255===A[1]&&0===A[2]&&255===A[3]},Rr=function(A){var e=A.createElement("canvas"),t=100;e.width=t,e.height=t;var r=e.getContext("2d");if(!r)return Promise.reject(!1);r.fillStyle="rgb(0, 255, 0)",r.fillRect(0,0,t,t);var n=new Image,s=e.toDataURL();n.src=s;var o=yr(t,t,0,0,n);return r.fillStyle="red",r.fillRect(0,0,t,t),Lr(o).then(function(e){r.drawImage(e,0,0);var n=r.getImageData(0,0,t,t).data;r.fillStyle="red",r.fillRect(0,0,t,t);var o=A.createElement("div");return o.style.backgroundImage="url("+s+")",o.style.height=t+"px",Tr(n)?Lr(yr(t,t,0,0,o)):Promise.reject(!1)}).then(function(A){return r.drawImage(A,0,0),Tr(r.getImageData(0,0,t,t).data)})["catch"](function(){return!1})},yr=function(A,e,t,r,n){var s="http://www.w3.org/2000/svg",o=document.createElementNS(s,"svg"),i=document.createElementNS(s,"foreignObject");return o.setAttributeNS(null,"width",A.toString()),o.setAttributeNS(null,"height",e.toString()),i.setAttributeNS(null,"width","100%"),i.setAttributeNS(null,"height","100%"),i.setAttributeNS(null,"x",t.toString()),i.setAttributeNS(null,"y",r.toString()),i.setAttributeNS(null,"externalResourcesRequired","true"),o.appendChild(i),i.appendChild(n),o},Lr=function(A){return new Promise(function(e,t){var r=new Image;r.onload=function(){return e(r)},r.onerror=t,r.src="data:image/svg+xml;charset=utf-8,"+encodeURIComponent((new XMLSerializer).serializeToString(A))})},Or={get SUPPORT_RANGE_BOUNDS(){var A=mr(document);return Object.defineProperty(Or,"SUPPORT_RANGE_BOUNDS",{value:A}),A},get SUPPORT_SVG_DRAWING(){var A=Ir(document);return Object.defineProperty(Or,"SUPPORT_SVG_DRAWING",{value:A}),A},get SUPPORT_FOREIGNOBJECT_DRAWING(){var A="function"==typeof Array.from&&"function"==typeof window.fetch?Rr(document):Promise.resolve(!1);return Object.defineProperty(Or,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:A}),A},get SUPPORT_CORS_IMAGES(){var A=br();return Object.defineProperty(Or,"SUPPORT_CORS_IMAGES",{value:A}),A},get SUPPORT_RESPONSE_TYPE(){var A=vr();return Object.defineProperty(Or,"SUPPORT_RESPONSE_TYPE",{value:A}),A},get SUPPORT_CORS_XHR(){var A="withCredentials"in new XMLHttpRequest;return Object.defineProperty(Or,"SUPPORT_CORS_XHR",{value:A}),A}},Sr=function(){function A(A){var e=A.id,t=A.enabled;this.id=e,this.enabled=t,this.start=Date.now()}return A.prototype.debug=function(){for(var A=[],e=0;e0&&setTimeout(function(){return e("Timed out ("+o._options.imageTimeout+"ms) loading image")},o._options.imageTimeout)})];case 3:return[2,t.sent()]}})})},A.prototype.has=function(A){return"undefined"!=typeof this._cache[A]},A.prototype.keys=function(){return Promise.resolve(Object.keys(this._cache))},A.prototype.proxy=function(A){var e=this,t=this._options.proxy;if(!t)throw new Error("No proxy defined");var r=A.substring(0,256);return new Promise(function(n,s){var o=Or.SUPPORT_RESPONSE_TYPE?"blob":"text",i=new XMLHttpRequest;if(i.onload=function(){if(200===i.status)if("text"===o)n(i.response);else{var A=new FileReader;A.addEventListener("load",function(){return n(A.result)},!1),A.addEventListener("error",function(A){return s(A)},!1),A.readAsDataURL(i.response)}else s("Failed to proxy resource "+r+" with status code "+i.status)},i.onerror=s,i.open("GET",t+"?url="+encodeURIComponent(A)+"&responseType="+o),"text"!==o&&i instanceof XMLHttpRequest&&(i.responseType=o),e._options.imageTimeout){var B=e._options.imageTimeout;i.timeout=B,i.ontimeout=function(){return s("Timed out ("+B+"ms) proxying "+r)}}i.send()})},A}(),_r=/^data:image\/svg\+xml/i,kr=/^data:image\/.*;base64,/i,xr=/^data:image\/.*/i,Pr=function(A){return Or.SUPPORT_SVG_DRAWING||!Jr(A)},zr=function(A){return xr.test(A)},Vr=function(A){return kr.test(A)},Xr=function(A){return"blob"===A.substr(0,4)},Jr=function(A){return"svg"===A.substr(-3).toLowerCase()||_r.test(A)},Gr=function(A){var e=nr(180),t=[],r=hr.LINEAR_GRADIENT,n=nn.CIRCLE,s=Bn.FARTHEST_CORNER,o=[];return xt(A).forEach(function(A,e){var n=A[0];if(0===e){if(St(n)&&"linear"===n.value)return void(r=hr.LINEAR_GRADIENT);if(St(n)&&"radial"===n.value)return void(r=hr.RADIAL_GRADIENT)}if(n.type===h.FUNCTION)if("from"===n.name){var s=sr.parse(n.values[0]);t.push({stop:Jt,color:s})}else if("to"===n.name){var s=sr.parse(n.values[0]);t.push({stop:Wt,color:s})}else if("color-stop"===n.name){var o=n.values.filter(kt);if(2===o.length){var s=sr.parse(o[1]),i=o[0];Ot(i)&&t.push({stop:{type:h.PERCENTAGE_TOKEN,number:100*i.number,flags:i.flags},color:s})}}}),r===hr.LINEAR_GRADIENT?{angle:(e+nr(180))%nr(360),stops:t,type:r}:{size:s,shape:n,stops:t,position:o,type:r}},Wr="closest-side",Yr="farthest-side",qr="closest-corner",jr="farthest-corner",Zr="circle",$r="ellipse",An="cover",en="contain",tn=function(A){var e=nn.CIRCLE,t=Bn.FARTHEST_CORNER,r=[],n=[];return xt(A).forEach(function(A,s){var o=!0;if(0===s){var i=!1;o=A.reduce(function(A,r){if(i)if(St(r))switch(r.value){case"center":return n.push(Gt),A;case"top":case"left":return n.push(Jt),A;case"right":case"bottom":return n.push(Wt),A}else(Vt(r)||zt(r))&&n.push(r);else if(St(r))switch(r.value){case Zr:return e=nn.CIRCLE,!1;case $r:return e=nn.ELLIPSE,!1;case"at":return i=!0,!1;case Wr:return t=Bn.CLOSEST_SIDE,!1;case An:case Yr:return t=Bn.FARTHEST_SIDE,!1;case en:case qr:return t=Bn.CLOSEST_CORNER,!1;case jr:return t=Bn.FARTHEST_CORNER,!1}else if(zt(r)||Vt(r))return Array.isArray(t)||(t=[]),t.push(r),!1;return A},o)}if(o){var B=Ur(A);r.push(B)}}),{size:t,shape:e,stops:r,position:n,type:hr.RADIAL_GRADIENT}},rn=function(A){var e=nn.CIRCLE,t=Bn.FARTHEST_CORNER,r=[],n=[];return xt(A).forEach(function(A,s){var o=!0;if(0===s?o=A.reduce(function(A,e){if(St(e))switch(e.value){case"center":return n.push(Gt),!1;case"top":case"left":return n.push(Jt),!1;case"right":case"bottom":return n.push(Wt),!1}else if(Vt(e)||zt(e))return n.push(e),!1;return A},o):1===s&&(o=A.reduce(function(A,r){if(St(r))switch(r.value){case Zr:return e=nn.CIRCLE,!1;case $r:return e=nn.ELLIPSE,!1;case en:case Wr:return t=Bn.CLOSEST_SIDE,!1;case Yr:return t=Bn.FARTHEST_SIDE,!1;case qr:return t=Bn.CLOSEST_CORNER,!1;case An:case jr:return t=Bn.FARTHEST_CORNER,!1}else if(zt(r)||Vt(r))return Array.isArray(t)||(t=[]),t.push(r),!1;return A},o)),o){var i=Ur(A);r.push(i)}}),{size:t,shape:e,stops:r,position:n,type:hr.RADIAL_GRADIENT}};!function(A){A[A.URL=0]="URL",A[A.LINEAR_GRADIENT=1]="LINEAR_GRADIENT",A[A.RADIAL_GRADIENT=2]="RADIAL_GRADIENT"}(hr||(hr={}));var nn,sn=function(A){return A.type===hr.LINEAR_GRADIENT},on=function(A){return A.type===hr.RADIAL_GRADIENT};!function(A){A[A.CIRCLE=0]="CIRCLE",A[A.ELLIPSE=1]="ELLIPSE"}(nn||(nn={}));var Bn;!function(A){A[A.CLOSEST_SIDE=0]="CLOSEST_SIDE",A[A.FARTHEST_SIDE=1]="FARTHEST_SIDE",A[A.CLOSEST_CORNER=2]="CLOSEST_CORNER",A[A.FARTHEST_CORNER=3]="FARTHEST_CORNER"}(Bn||(Bn={}));var an,cn={name:"image",parse:function(A){if(A.type===h.URL_TOKEN){var e={url:A.value,type:hr.URL};return Dr.getInstance().addImage(A.value),e}if(A.type===h.FUNCTION){var t=un[A.name];if("undefined"==typeof t)throw new Error('Attempting to parse an unsupported image function "'+A.name+'"');return t(A.values)}throw new Error("Unsupported image type")}},un={"linear-gradient":Nr,"-moz-linear-gradient":Kr,"-ms-linear-gradient":Kr,"-o-linear-gradient":Kr,"-webkit-linear-gradient":Kr,"radial-gradient":tn,"-moz-radial-gradient":rn,"-ms-radial-gradient":rn,"-o-radial-gradient":rn,"-webkit-radial-gradient":rn,"-webkit-gradient":Gr},Qn={name:"background-image",initialValue:"none",type:JA.LIST,prefix:!1,parse:function(A){if(0===A.length)return[];var e=A[0];return e.type===h.IDENT_TOKEN&&"none"===e.value?[]:A.filter(function(A){return kt(A)&&n(A)}).map(cn.parse)}},ln={name:"background-origin",initialValue:"border-box",prefix:!1,type:JA.LIST,parse:function(A){return A.map(function(A){if(St(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0})}},wn={name:"background-position",initialValue:"0% 0%",type:JA.LIST,prefix:!1,parse:function(A){return xt(A).map(function(A){return A.filter(Vt)}).map(Xt)}};!function(A){A[A.REPEAT=0]="REPEAT",A[A.NO_REPEAT=1]="NO_REPEAT",A[A.REPEAT_X=2]="REPEAT_X",A[A.REPEAT_Y=3]="REPEAT_Y"}(an||(an={}));var hn,gn={name:"background-repeat",initialValue:"repeat",prefix:!1,type:JA.LIST,parse:function(A){return xt(A).map(function(A){return A.filter(St).map(function(A){return A.value}).join(" ")}).map(dn)}},dn=function(A){switch(A){case"no-repeat":return an.NO_REPEAT;case"repeat-x":case"repeat no-repeat":return an.REPEAT_X;case"repeat-y":case"no-repeat repeat":return an.REPEAT_Y;case"repeat":default:return an.REPEAT}};!function(A){A.AUTO="auto",A.CONTAIN="contain",A.COVER="cover"}(hn||(hn={}));var Un,Cn={name:"background-size",initialValue:"0",prefix:!1,type:JA.LIST,parse:function(A){return xt(A).map(function(A){return A.filter(fn)})}},fn=function(A){return St(A)||Vt(A)},En=function(A){return{name:"border-"+A+"-color",initialValue:"transparent",prefix:!1,type:JA.TYPE_VALUE,format:"color"}},Fn=En("top"),pn=En("right"),Hn=En("bottom"),Nn=En("left"),Kn=function(A){return{name:"border-radius-"+A,initialValue:"0 0",prefix:!1,type:JA.LIST,parse:function(A){return Xt(A.filter(Vt))}}},mn=Kn("top-left"),bn=Kn("top-right"),vn=Kn("bottom-right"),In=Kn("bottom-left");!function(A){A[A.NONE=0]="NONE",A[A.SOLID=1]="SOLID"}(Un||(Un={}));var Tn,Rn=function(A){return{name:"border-"+A+"-style",initialValue:"solid",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"none":return Un.NONE}return Un.SOLID}}},yn=Rn("top"),Ln=Rn("right"),On=Rn("bottom"),Sn=Rn("left"),Dn=function(A){return{name:"border-"+A+"-width",initialValue:"0",type:JA.VALUE,prefix:!1,parse:function(A){return Lt(A)?A.number:0}}},Mn=Dn("top"),_n=Dn("right"),kn=Dn("bottom"),xn=Dn("left"),Pn={name:"color",initialValue:"transparent",prefix:!1,type:JA.TYPE_VALUE,format:"color"},zn={name:"display",initialValue:"inline-block",prefix:!1,type:JA.LIST,parse:function(A){return A.filter(St).reduce(function(A,e){return A|Vn(e.value)},0)}},Vn=function(A){switch(A){case"block":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0};!function(A){A[A.NONE=0]="NONE",A[A.LEFT=1]="LEFT",A[A.RIGHT=2]="RIGHT",A[A.INLINE_START=3]="INLINE_START",A[A.INLINE_END=4]="INLINE_END"}(Tn||(Tn={}));var Xn,Jn={name:"float",initialValue:"none",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"left":return Tn.LEFT;case"right":return Tn.RIGHT;case"inline-start":return Tn.INLINE_START;case"inline-end":return Tn.INLINE_END}return Tn.NONE}},Gn={name:"letter-spacing",initialValue:"0",prefix:!1,type:JA.VALUE,parse:function(A){return A.type===h.IDENT_TOKEN&&"normal"===A.value?0:A.type===h.NUMBER_TOKEN?A.number:A.type===h.DIMENSION_TOKEN?A.number:0}};!function(A){A.NORMAL="normal",A.STRICT="strict"}(Xn||(Xn={}));var Wn,Yn={name:"line-break",initialValue:"normal",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"strict":return Xn.STRICT;case"normal":default:return Xn.NORMAL}}},qn={name:"line-height",initialValue:"normal",prefix:!1,type:JA.TOKEN_VALUE},jn=function(A,e){return St(A)&&"normal"===A.value?1.2*e:A.type===h.NUMBER_TOKEN?e*A.number:Vt(A)?qt(A,e):e},Zn={name:"list-style-image",initialValue:"none",type:JA.VALUE,prefix:!1,parse:function(A){return A.type===h.IDENT_TOKEN&&"none"===A.value?null:cn.parse(A)}};!function(A){A[A.INSIDE=0]="INSIDE",A[A.OUTSIDE=1]="OUTSIDE"}(Wn||(Wn={}));var $n,As={name:"list-style-position",initialValue:"outside",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"inside":return Wn.INSIDE;case"outside":default:return Wn.OUTSIDE}}};!function(A){A[A.NONE=-1]="NONE",A[A.DISC=0]="DISC",A[A.CIRCLE=1]="CIRCLE",A[A.SQUARE=2]="SQUARE",A[A.DECIMAL=3]="DECIMAL",A[A.CJK_DECIMAL=4]="CJK_DECIMAL",A[A.DECIMAL_LEADING_ZERO=5]="DECIMAL_LEADING_ZERO",A[A.LOWER_ROMAN=6]="LOWER_ROMAN",A[A.UPPER_ROMAN=7]="UPPER_ROMAN",A[A.LOWER_GREEK=8]="LOWER_GREEK",A[A.LOWER_ALPHA=9]="LOWER_ALPHA",A[A.UPPER_ALPHA=10]="UPPER_ALPHA",A[A.ARABIC_INDIC=11]="ARABIC_INDIC",A[A.ARMENIAN=12]="ARMENIAN",A[A.BENGALI=13]="BENGALI",A[A.CAMBODIAN=14]="CAMBODIAN",A[A.CJK_EARTHLY_BRANCH=15]="CJK_EARTHLY_BRANCH",A[A.CJK_HEAVENLY_STEM=16]="CJK_HEAVENLY_STEM",A[A.CJK_IDEOGRAPHIC=17]="CJK_IDEOGRAPHIC",A[A.DEVANAGARI=18]="DEVANAGARI",A[A.ETHIOPIC_NUMERIC=19]="ETHIOPIC_NUMERIC",A[A.GEORGIAN=20]="GEORGIAN",A[A.GUJARATI=21]="GUJARATI",A[A.GURMUKHI=22]="GURMUKHI",A[A.HEBREW=22]="HEBREW",A[A.HIRAGANA=23]="HIRAGANA",A[A.HIRAGANA_IROHA=24]="HIRAGANA_IROHA",A[A.JAPANESE_FORMAL=25]="JAPANESE_FORMAL",A[A.JAPANESE_INFORMAL=26]="JAPANESE_INFORMAL",A[A.KANNADA=27]="KANNADA",A[A.KATAKANA=28]="KATAKANA",A[A.KATAKANA_IROHA=29]="KATAKANA_IROHA",A[A.KHMER=30]="KHMER",A[A.KOREAN_HANGUL_FORMAL=31]="KOREAN_HANGUL_FORMAL",A[A.KOREAN_HANJA_FORMAL=32]="KOREAN_HANJA_FORMAL",A[A.KOREAN_HANJA_INFORMAL=33]="KOREAN_HANJA_INFORMAL",A[A.LAO=34]="LAO",A[A.LOWER_ARMENIAN=35]="LOWER_ARMENIAN",A[A.MALAYALAM=36]="MALAYALAM",A[A.MONGOLIAN=37]="MONGOLIAN",A[A.MYANMAR=38]="MYANMAR",A[A.ORIYA=39]="ORIYA",A[A.PERSIAN=40]="PERSIAN",A[A.SIMP_CHINESE_FORMAL=41]="SIMP_CHINESE_FORMAL",A[A.SIMP_CHINESE_INFORMAL=42]="SIMP_CHINESE_INFORMAL",A[A.TAMIL=43]="TAMIL",A[A.TELUGU=44]="TELUGU",A[A.THAI=45]="THAI",A[A.TIBETAN=46]="TIBETAN",A[A.TRAD_CHINESE_FORMAL=47]="TRAD_CHINESE_FORMAL",A[A.TRAD_CHINESE_INFORMAL=48]="TRAD_CHINESE_INFORMAL",A[A.UPPER_ARMENIAN=49]="UPPER_ARMENIAN",A[A.DISCLOSURE_OPEN=50]="DISCLOSURE_OPEN",A[A.DISCLOSURE_CLOSED=51]="DISCLOSURE_CLOSED"}($n||($n={}));var es,ts={name:"list-style-type",initialValue:"none",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"disc":return $n.DISC;case"circle":return $n.CIRCLE;case"square":return $n.SQUARE;case"decimal":return $n.DECIMAL;case"cjk-decimal":return $n.CJK_DECIMAL;case"decimal-leading-zero":return $n.DECIMAL_LEADING_ZERO;case"lower-roman":return $n.LOWER_ROMAN;case"upper-roman":return $n.UPPER_ROMAN;case"lower-greek":return $n.LOWER_GREEK;case"lower-alpha":return $n.LOWER_ALPHA;case"upper-alpha":return $n.UPPER_ALPHA;case"arabic-indic":return $n.ARABIC_INDIC;case"armenian":return $n.ARMENIAN;case"bengali":return $n.BENGALI;case"cambodian":return $n.CAMBODIAN;case"cjk-earthly-branch":return $n.CJK_EARTHLY_BRANCH;case"cjk-heavenly-stem":return $n.CJK_HEAVENLY_STEM;case"cjk-ideographic":return $n.CJK_IDEOGRAPHIC;case"devanagari":return $n.DEVANAGARI;case"ethiopic-numeric":return $n.ETHIOPIC_NUMERIC;case"georgian":return $n.GEORGIAN;case"gujarati":return $n.GUJARATI;case"gurmukhi":return $n.GURMUKHI;case"hebrew":return $n.HEBREW;case"hiragana":return $n.HIRAGANA;case"hiragana-iroha":return $n.HIRAGANA_IROHA;case"japanese-formal":return $n.JAPANESE_FORMAL;case"japanese-informal":return $n.JAPANESE_INFORMAL;case"kannada":return $n.KANNADA;case"katakana":return $n.KATAKANA;case"katakana-iroha":return $n.KATAKANA_IROHA;case"khmer":return $n.KHMER;case"korean-hangul-formal":return $n.KOREAN_HANGUL_FORMAL;case"korean-hanja-formal":return $n.KOREAN_HANJA_FORMAL;case"korean-hanja-informal":return $n.KOREAN_HANJA_INFORMAL;case"lao":return $n.LAO;case"lower-armenian":return $n.LOWER_ARMENIAN;case"malayalam":return $n.MALAYALAM;case"mongolian":return $n.MONGOLIAN;case"myanmar":return $n.MYANMAR;case"oriya":return $n.ORIYA;case"persian":return $n.PERSIAN;case"simp-chinese-formal":return $n.SIMP_CHINESE_FORMAL;case"simp-chinese-informal":return $n.SIMP_CHINESE_INFORMAL;case"tamil":return $n.TAMIL;case"telugu":return $n.TELUGU;case"thai":return $n.THAI;case"tibetan":return $n.TIBETAN;case"trad-chinese-formal":return $n.TRAD_CHINESE_FORMAL;case"trad-chinese-informal":return $n.TRAD_CHINESE_INFORMAL;case"upper-armenian":return $n.UPPER_ARMENIAN;case"disclosure-open":return $n.DISCLOSURE_OPEN;case"disclosure-closed":return $n.DISCLOSURE_CLOSED;case"none":default:return $n.NONE}}},rs=function(A){return{name:"margin-"+A,initialValue:"0",prefix:!1,type:JA.TOKEN_VALUE}},ns=rs("top"),ss=rs("right"),os=rs("bottom"),is=rs("left");!function(A){A[A.VISIBLE=0]="VISIBLE",A[A.HIDDEN=1]="HIDDEN",A[A.SCROLL=2]="SCROLL",A[A.AUTO=3]="AUTO"}(es||(es={}));var Bs,as={name:"overflow",initialValue:"visible",prefix:!1,type:JA.LIST,parse:function(A){return A.filter(St).map(function(A){switch(A.value){case"hidden":return es.HIDDEN;case"scroll":return es.SCROLL;case"auto":return es.AUTO;case"visible":default:return es.VISIBLE}})}};!function(A){A.NORMAL="normal",A.BREAK_WORD="break-word"}(Bs||(Bs={}));var cs,us={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"break-word":return Bs.BREAK_WORD;case"normal":default:return Bs.NORMAL}}},Qs=function(A){return{name:"padding-"+A,initialValue:"0",prefix:!1,type:JA.TYPE_VALUE,format:"length-percentage"}},ls=Qs("top"),ws=Qs("right"),hs=Qs("bottom"),gs=Qs("left");!function(A){A[A.LEFT=0]="LEFT",A[A.CENTER=1]="CENTER",A[A.RIGHT=2]="RIGHT"}(cs||(cs={}));var ds,Us={name:"text-align",initialValue:"left",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"right":return cs.RIGHT;case"center":case"justify":return cs.CENTER;case"left":default:return cs.LEFT}}};!function(A){A[A.STATIC=0]="STATIC",A[A.RELATIVE=1]="RELATIVE",A[A.ABSOLUTE=2]="ABSOLUTE",A[A.FIXED=3]="FIXED",A[A.STICKY=4]="STICKY"}(ds||(ds={}));var Cs,fs={name:"position",initialValue:"static",prefix:!1,type:JA.IDENT_VALUE,parse:function(A){switch(A){case"relative":return ds.RELATIVE;case"absolute":return ds.ABSOLUTE;case"fixed":return ds.FIXED;case"sticky":return ds.STICKY}return ds.STATIC}},Es={name:"text-shadow",initialValue:"none",type:JA.LIST,prefix:!1,parse:function(A){return 1===A.length&&Mt(A[0],"none")?[]:xt(A).map(function(A){for(var e={color:lr.TRANSPARENT,offsetX:Jt,offsetY:Jt,blur:Jt},t=0,r=0;r1?1:0],this.overflowWrap=to(us,A.overflowWrap),this.paddingTop=to(ls,A.paddingTop),this.paddingRight=to(ws,A.paddingRight),this.paddingBottom=to(hs,A.paddingBottom),this.paddingLeft=to(gs,A.paddingLeft),this.position=to(fs,A.position),this.textAlign=to(Us,A.textAlign),this.textDecorationColor=to(Ds,A.textDecorationColor||A.color),this.textDecorationLine=to(Ms,A.textDecorationLine),this.textShadow=to(Es,A.textShadow),this.textTransform=to(ps,A.textTransform),this.transform=to(Hs,A.transform),this.transformOrigin=to(Is,A.transformOrigin),this.visibility=to(Rs,A.visibility),this.wordBreak=to(Ls,A.wordBreak),this.zIndex=to(Os,A.zIndex)}return A.prototype.isVisible=function(){return this.display>0&&this.opacity>0&&this.visibility===Fs.VISIBLE},A.prototype.isTransparent=function(){return or(this.backgroundColor)},A.prototype.isTransformed=function(){return null!==this.transform},A.prototype.isPositioned=function(){return this.position!==ds.STATIC},A.prototype.isPositionedWithZIndex=function(){return this.isPositioned()&&!this.zIndex.auto},A.prototype.isFloating=function(){return this["float"]!==Tn.NONE},A.prototype.isInlineLevel=function(){return Js(this.display,4)||Js(this.display,33554432)||Js(this.display,268435456)||Js(this.display,536870912)||Js(this.display,67108864)||Js(this.display,134217728)},A}(),Ao=function(){function A(A){this.content=to(Gs,A.content),this.quotes=to(qs,A.quotes)}return A}(),eo=function(){function A(A){this.counterIncrement=to(Ws,A.counterIncrement),this.counterReset=to(Ys,A.counterReset)}return A}(),to=function(A,e){var t=new Rt,r=null!==e&&"undefined"!=typeof e?e.toString():A.initialValue;t.write(r);var n=new yt(t.read());switch(A.type){case JA.IDENT_VALUE:var s=n.parseComponentValue();return A.parse(St(s)?s.value:A.initialValue);case JA.VALUE:return A.parse(n.parseComponentValue());case JA.LIST:return A.parse(n.parseComponentValues());case JA.TOKEN_VALUE:return n.parseComponentValue();case JA.TYPE_VALUE:switch(A.format){case"angle":return er.parse(n.parseComponentValue());case"color":return sr.parse(n.parseComponentValue());case"image":return cn.parse(n.parseComponentValue());case"length":var o=n.parseComponentValue();return zt(o)?o:Jt;case"length-percentage":var i=n.parseComponentValue();return Vt(i)?i:Jt}}throw new Error("Attempting to parse unsupported css format type "+A.format)},ro=function(){function A(A){this.styles=new $s(window.getComputedStyle(A,null)),this.textNodes=[],this.elements=[],null!==this.styles.transform&&xo(A)&&(A.style.transform="none"),this.bounds=B(A),this.flags=0}return A}(),no=function(){function A(A,e){this.text=A,this.bounds=e}return A}(),so=function(A,e,t){var r=Bo(A,e),n=[],s=0;return r.forEach(function(A){if(e.textDecorationLine.length||A.trim().length>0)if(Or.SUPPORT_RANGE_BOUNDS)n.push(new no(A,io(t,s,A.length)));else{var r=t.splitText(A.length);n.push(new no(A,oo(t))),t=r}else Or.SUPPORT_RANGE_BOUNDS||(t=t.splitText(A.length));s+=A.length}),n},oo=function(A){var e=A.ownerDocument;if(e){var t=e.createElement("html2canvaswrapper");t.appendChild(A.cloneNode(!0));var r=A.parentNode;if(r){r.replaceChild(t,A);var n=B(t);return t.firstChild&&r.replaceChild(t.firstChild,t),n}}return new i(0,0,0,0)},io=function(A,e,t){var r=A.ownerDocument;if(!r)throw new Error("Node has no owner document");var n=r.createRange();return n.setStart(A,e),n.setEnd(A,e+t),i.fromClientRect(n.getBoundingClientRect())},Bo=function(A,e){return 0!==e.letterSpacing?c(A).map(function(A){return u(A)}):ao(A,e)},ao=function(A,e){for(var t,r=XA(A,{lineBreak:e.lineBreak,wordBreak:e.overflowWrap===Bs.BREAK_WORD?"break-word":e.wordBreak}),n=[];!(t=r.next()).done;)t.value&&n.push(t.value.slice());return n},co=function(){function A(A,e){this.text=uo(A.data,e.textTransform),this.textBounds=so(this.text,e,A)}return A}(),uo=function(A,e){switch(e){case Cs.LOWERCASE:return A.toLowerCase();case Cs.CAPITALIZE:return A.replace(Qo,lo);case Cs.UPPERCASE:return A.toUpperCase();default:return A}},Qo=/(^|\s|:|-|\(|\))([a-z])/g,lo=function(A,e,t){return A.length>0?e+t.toUpperCase():A},wo=function(e){function t(A){var t=e.call(this,A)||this;return t.src=A.currentSrc||A.src,t.intrinsicWidth=A.naturalWidth,t.intrinsicHeight=A.naturalHeight,Dr.getInstance().addImage(t.src),t}return A(t,e),t}(ro),ho=function(e){function t(A){var t=e.call(this,A)||this;return t.canvas=A,t.intrinsicWidth=A.width,t.intrinsicHeight=A.height,t}return A(t,e),t}(ro),go=function(e){function t(A){var t=e.call(this,A)||this,r=new XMLSerializer;return t.svg="data:image/svg+xml,"+encodeURIComponent(r.serializeToString(A)),t.intrinsicWidth=A.width.baseVal.value,t.intrinsicHeight=A.height.baseVal.value,Dr.getInstance().addImage(t.svg),t}return A(t,e),t}(ro),Uo=function(e){function t(A){var t=e.call(this,A)||this;return t.value=A.value,t}return A(t,e),t}(ro),Co=function(e){function t(A){var t=e.call(this,A)||this;return t.start=A.start,t.reversed="boolean"==typeof A.reversed&&A.reversed===!0,t}return A(t,e),t}(ro),fo=[{type:h.DIMENSION_TOKEN,flags:0,unit:"px",number:3}],Eo=[{type:h.PERCENTAGE_TOKEN,flags:0,number:50}],Fo=function(A){return A.width>A.height?new i(A.left+(A.width-A.height)/2,A.top,A.height,A.height):A.width0)e.textNodes.push(new co(r,e.styles));else if(ko(r)){var s=Oo(r);s.styles.isVisible()&&(Do(r,s,t)?s.flags|=4:Mo(s.styles)&&(s.flags|=2),yo.indexOf(r.tagName)!==-1&&(s.flags|=8),e.elements.push(s),$o(r)||Jo(r)||Ai(r)||vB(r,s,t))}},Oo=function(A){return Yo(A)?new wo(A):Wo(A)?new ho(A):Jo(A)?new go(A):Po(A)?new Uo(A):zo(A)?new Co(A):Vo(A)?new bo(A):Ai(A)?new vo(A):$o(A)?new Io(A):qo(A)?new Ro(A):new ro(A)},So=function(A){var e=Oo(A);return e.flags|=4,Lo(A,e,e),e},Do=function(A,e,t){return e.styles.isPositionedWithZIndex()||e.styles.opacity<1||e.styles.isTransformed()||Go(A)&&t.styles.isTransparent()},Mo=function(A){return A.isPositioned()||A.isFloating()},_o=function(A){return A.nodeType===Node.TEXT_NODE},ko=function(A){return A.nodeType===Node.ELEMENT_NODE},xo=function(A){return"undefined"!=typeof A.style},Po=function(A){return"LI"===A.tagName},zo=function(A){return"OL"===A.tagName},Vo=function(A){return"INPUT"===A.tagName},Xo=function(A){return"HTML"===A.tagName},Jo=function(A){return"svg"===A.tagName},Go=function(A){return"BODY"===A.tagName},Wo=function(A){return"CANVAS"===A.tagName},Yo=function(A){return"IMG"===A.tagName},qo=function(A){return"IFRAME"===A.tagName},jo=function(A){return"STYLE"===A.tagName},Zo=function(A){return"SCRIPT"===A.tagName},$o=function(A){return"TEXTAREA"===A.tagName},Ai=function(A){return"SELECT"===A.tagName},ei=function(){function A(){this.counters={}}return A.prototype.getCounterValue=function(A){var e=this.counters[A];return e&&e.length?e[e.length-1]:1},A.prototype.getCounterValues=function(A){var e=this.counters[A];return e?e:[]},A.prototype.pop=function(A){var e=this;A.forEach(function(A){return e.counters[A].pop()})},A.prototype.parse=function(A){var e=this,t=A.counterIncrement,r=A.counterReset,n=!0;null!==t&&t.forEach(function(A){var t=e.counters[A.counter];t&&0!==A.increment&&(n=!1,t[Math.max(0,t.length-1)]+=A.increment)});var s=[];return n&&r.forEach(function(A){var t=e.counters[A.counter];s.push(A.counter),t||(t=e.counters[A.counter]=[]),t.push(A.reset)}),s},A}(),ti={integers:[1e3,900,500,400,100,90,50,40,10,9,5,4,1],values:["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]},ri={integers:[9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["Ք","Փ","Ւ","Ց","Ր","Տ","Վ","Ս","Ռ","Ջ","Պ","Չ","Ո","Շ","Ն","Յ","Մ","Ճ","Ղ","Ձ","Հ","Կ","Ծ","Խ","Լ","Ի","Ժ","Թ","Ը","Է","Զ","Ե","Դ","Գ","Բ","Ա"]},ni={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,400,300,200,100,90,80,70,60,50,40,30,20,19,18,17,16,15,10,9,8,7,6,5,4,3,2,1],values:["י׳","ט׳","ח׳","ז׳","ו׳","ה׳","ד׳","ג׳","ב׳","א׳","ת","ש","ר","ק","צ","פ","ע","ס","נ","מ","ל","כ","יט","יח","יז","טז","טו","י","ט","ח","ז","ו","ה","ד","ג","ב","א"]},si={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["ჵ","ჰ","ჯ","ჴ","ხ","ჭ","წ","ძ","ც","ჩ","შ","ყ","ღ","ქ","ფ","ჳ","ტ","ს","რ","ჟ","პ","ო","ჲ","ნ","მ","ლ","კ","ი","თ","ჱ","ზ","ვ","ე","დ","გ","ბ","ა"]},oi=function(A,e,t,r,n,s){return At?Ci(A,n,s.length>0):r.integers.reduce(function(e,t,n){for(;A>=t;)A-=t,e+=r.values[n];return e},"")+s},ii=function(A,e,t,r){var n="";do t||A--,n=r(A)+n,A/=e;while(A*e>=e);return n},Bi=function(A,e,t,r,n){var s=t-e+1;return(A<0?"-":"")+(ii(Math.abs(A),s,r,function(A){return u(Math.floor(A%s)+e)})+n)},ai=function(A,e,t){void 0===t&&(t=". ");var r=e.length;return ii(Math.abs(A),r,!1,function(A){return e[Math.floor(A%r)]})+t},ci=1,ui=2,Qi=4,li=8,wi=function(A,e,t,r,n,s){if(A<-9999||A>9999)return Ci(A,$n.CJK_DECIMAL,n.length>0);var o=Math.abs(A),i=n;if(0===o)return e[0]+i;for(var B=0;o>0&&B<=4;B++){var a=o%10;0===a&&Js(s,ci)&&""!==i?i=e[a]+i:a>1||1===a&&0===B||1===a&&1===B&&Js(s,ui)||1===a&&1===B&&Js(s,Qi)&&A>100||1===a&&B>1&&Js(s,li)?i=e[a]+(B>0?t[B-1]:"")+i:1===a&&B>0&&(i=t[B-1]+i),o=Math.floor(o/10)}return(A<0?r:"")+i},hi="十百千萬",gi="拾佰仟萬",di="マイナス",Ui="마이너스",Ci=function(A,e,t){var r=t?". ":"",n=t?"、":"",s=t?", ":"",o=t?" ":"";switch(e){case $n.DISC:return"•"+o;case $n.CIRCLE:return"◦"+o;case $n.SQUARE:return"◾"+o;case $n.DECIMAL_LEADING_ZERO:var i=Bi(A,48,57,!0,r);return i.length<4?"0"+i:i;case $n.CJK_DECIMAL:return ai(A,"〇一二三四五六七八九",n);case $n.LOWER_ROMAN:return oi(A,1,3999,ti,$n.DECIMAL,r).toLowerCase();case $n.UPPER_ROMAN:return oi(A,1,3999,ti,$n.DECIMAL,r);case $n.LOWER_GREEK:return Bi(A,945,969,!1,r);case $n.LOWER_ALPHA:return Bi(A,97,122,!1,r);case $n.UPPER_ALPHA:return Bi(A,65,90,!1,r);case $n.ARABIC_INDIC:return Bi(A,1632,1641,!0,r);case $n.ARMENIAN:case $n.UPPER_ARMENIAN:return oi(A,1,9999,ri,$n.DECIMAL,r);case $n.LOWER_ARMENIAN:return oi(A,1,9999,ri,$n.DECIMAL,r).toLowerCase();case $n.BENGALI:return Bi(A,2534,2543,!0,r);case $n.CAMBODIAN:case $n.KHMER:return Bi(A,6112,6121,!0,r);case $n.CJK_EARTHLY_BRANCH:return ai(A,"子丑寅卯辰巳午未申酉戌亥",n);case $n.CJK_HEAVENLY_STEM:return ai(A,"甲乙丙丁戊己庚辛壬癸",n);case $n.CJK_IDEOGRAPHIC:case $n.TRAD_CHINESE_INFORMAL:return wi(A,"零一二三四五六七八九",hi,"負",n,ui|Qi|li);case $n.TRAD_CHINESE_FORMAL:return wi(A,"零壹貳參肆伍陸柒捌玖",gi,"負",n,ci|ui|Qi|li);case $n.SIMP_CHINESE_INFORMAL:return wi(A,"零一二三四五六七八九",hi,"负",n,ui|Qi|li);case $n.SIMP_CHINESE_FORMAL:return wi(A,"零壹贰叁肆伍陆柒捌玖",gi,"负",n,ci|ui|Qi|li);case $n.JAPANESE_INFORMAL:return wi(A,"〇一二三四五六七八九","十百千万",di,n,0);case $n.JAPANESE_FORMAL:return wi(A,"零壱弐参四伍六七八九","拾百千万",di,n,ci|ui|Qi);case $n.KOREAN_HANGUL_FORMAL:return wi(A,"영일이삼사오육칠팔구","십백천만",Ui,s,ci|ui|Qi);case $n.KOREAN_HANJA_INFORMAL:return wi(A,"零一二三四五六七八九","十百千萬",Ui,s,0);case $n.KOREAN_HANJA_FORMAL:return wi(A,"零壹貳參四五六七八九","拾百千",Ui,s,ci|ui|Qi);case $n.DEVANAGARI:return Bi(A,2406,2415,!0,r);case $n.GEORGIAN:return oi(A,1,19999,si,$n.DECIMAL,r);case $n.GUJARATI:return Bi(A,2790,2799,!0,r);case $n.GURMUKHI:return Bi(A,2662,2671,!0,r);case $n.HEBREW:return oi(A,1,10999,ni,$n.DECIMAL,r);case $n.HIRAGANA:return ai(A,"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん");case $n.HIRAGANA_IROHA:return ai(A,"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");case $n.KANNADA:return Bi(A,3302,3311,!0,r);case $n.KATAKANA:return ai(A,"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン",n);case $n.KATAKANA_IROHA:return ai(A,"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス",n);case $n.LAO:return Bi(A,3792,3801,!0,r);case $n.MONGOLIAN:return Bi(A,6160,6169,!0,r);case $n.MYANMAR:return Bi(A,4160,4169,!0,r);case $n.ORIYA:return Bi(A,2918,2927,!0,r);case $n.PERSIAN:return Bi(A,1776,1785,!0,r);case $n.TAMIL:return Bi(A,3046,3055,!0,r);case $n.TELUGU:return Bi(A,3174,3183,!0,r);case $n.THAI:return Bi(A,3664,3673,!0,r);case $n.TIBETAN:return Bi(A,3872,3881,!0,r);case $n.DECIMAL:default:return Bi(A,48,57,!0,r)}},fi="data-html2canvas-ignore",Ei=function(){function A(A,e){if(this.options=e,this.scrolledElements=[],this.referenceElement=A,this.counters=new ei,this.quoteDepth=0,!A.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(A.ownerDocument.documentElement)}return A.prototype.toIFrame=function(A,r){var n=this,s=pi(A,r);if(!s.contentWindow)return Promise.reject("Unable to find iframe window");var o=A.defaultView.pageXOffset,i=A.defaultView.pageYOffset,B=s.contentWindow,a=B.document,c=Hi(s).then(function(){return e(n,void 0,void 0,function(){var A;return t(this,function(e){switch(e.label){case 0:return this.scrolledElements.forEach(bi),B&&(B.scrollTo(r.left,r.top),!/(iPad|iPhone|iPod)/g.test(navigator.userAgent)||B.scrollY===r.top&&B.scrollX===r.left||(a.documentElement.style.top=-r.top+"px",a.documentElement.style.left=-r.left+"px",a.documentElement.style.position="absolute")),A=this.options.onclone,"undefined"==typeof this.clonedReferenceElement?[2,Promise.reject("Error finding the "+this.referenceElement.nodeName+" in the cloned document")]:a.fonts&&a.fonts.ready?[4,a.fonts.ready]:[3,2];case 1:e.sent(),e.label=2;case 2:return"function"==typeof A?[2,Promise.resolve().then(function(){return A(a)}).then(function(){return s})]:[2,s]}})})});return a.open(),a.write(Ki(document.doctype)+""),mi(this.referenceElement.ownerDocument,o,i),a.replaceChild(a.adoptNode(this.documentElement),a.documentElement),a.close(),c},A.prototype.createElementClone=function(A){return Wo(A)?this.createCanvasClone(A):jo(A)?this.createStyleClone(A):A.cloneNode(!1)},A.prototype.createStyleClone=function(A){try{var e=A.sheet;if(e&&e.cssRules){var t=[].slice.call(e.cssRules,0).reduce(function(A,e){return e&&"string"==typeof e.cssText?A+e.cssText:A},""),r=A.cloneNode(!1);return r.textContent=t,r}}catch(n){if(Sr.getInstance(this.options.id).error("Unable to access cssRules property",n),"SecurityError"!==n.name)throw n}return A.cloneNode(!1)},A.prototype.createCanvasClone=function(A){if(this.options.inlineImages&&A.ownerDocument){var e=A.ownerDocument.createElement("img");try{return e.src=A.toDataURL(),e}catch(t){Sr.getInstance(this.options.id).info("Unable to clone canvas contents, canvas is tainted")}}var r=A.cloneNode(!1);try{r.width=A.width,r.height=A.height;var n=A.getContext("2d"),s=r.getContext("2d");return s&&(n?s.putImageData(n.getImageData(0,0,A.width,A.height),0,0):s.drawImage(A,0,0)),r}catch(t){}return r},A.prototype.cloneNode=function(A){if(_o(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var e=A.ownerDocument.defaultView;if(xo(A)&&e){var t=this.createElementClone(A),r=e.getComputedStyle(A),n=e.getComputedStyle(A,":before"),s=e.getComputedStyle(A,":after");this.referenceElement===A&&(this.clonedReferenceElement=t),Go(t)&&Li(t);for(var o=this.counters.parse(new eo(r)),i=this.resolvePseudoContent(A,t,n,Vs.BEFORE),B=A.firstChild;B;B=B.nextSibling)ko(B)&&(Zo(B)||B.hasAttribute(fi)||"function"==typeof this.options.ignoreElements&&this.options.ignoreElements(B))||this.options.copyStyles&&ko(B)&&jo(B)||t.appendChild(this.cloneNode(B));i&&t.insertBefore(i,t.firstChild);var a=this.resolvePseudoContent(A,t,s,Vs.AFTER);return a&&t.appendChild(a),this.counters.pop(o),r&&this.options.copyStyles&&!qo(A)&&Ni(r,t),0===A.scrollTop&&0===A.scrollLeft||this.scrolledElements.push([t,A.scrollLeft,A.scrollTop]),($o(A)||Ai(A))&&($o(t)||Ai(t))&&(t.value=A.value),t}return A.cloneNode(!1)},A.prototype.resolvePseudoContent=function(A,e,t,r){var n=this;if(t){var s=t.content,o=e.ownerDocument;if(o&&s&&"none"!==s&&"-moz-alt-content"!==s&&"none"!==t.display){this.counters.parse(new eo(t));var i=new Ao(t),B=o.createElement("html2canvaspseudoelement");return Ni(t,B),i.content.forEach(function(e){if(e.type===h.STRING_TOKEN)B.appendChild(o.createTextNode(e.value));else if(e.type===h.URL_TOKEN){var t=o.createElement("img");t.src=e.value,t.style.opacity="1",B.appendChild(t)}else if(e.type===h.FUNCTION){if("attr"===e.name){var r=e.values.filter(St);r.length&&B.appendChild(o.createTextNode(A.getAttribute(r[0].value)||""))}else if("counter"===e.name){var s=e.values.filter(kt),a=s[0],c=s[1];if(a&&St(a)){var u=n.counters.getCounterValue(a.value),Q=c&&St(c)?ts.parse(c.value):$n.DECIMAL;B.appendChild(o.createTextNode(Ci(u,Q,!1)))}}else if("counters"===e.name){var l=e.values.filter(kt),a=l[0],w=l[1],c=l[2];if(a&&St(a)){var g=n.counters.getCounterValues(a.value),d=c&&St(c)?ts.parse(c.value):$n.DECIMAL,U=w&&w.type===h.STRING_TOKEN?w.value:"",C=g.map(function(A){return Ci(A,d,!1)}).join(U);B.appendChild(o.createTextNode(C))}}}else if(e.type===h.IDENT_TOKEN)switch(e.value){case"open-quote":B.appendChild(o.createTextNode(js(i.quotes,n.quoteDepth++,!0)));break;case"close-quote":B.appendChild(o.createTextNode(js(i.quotes,--n.quoteDepth,!1)));break;default:B.appendChild(o.createTextNode(e.value))}}),B.className=Ti+" "+Ri,e.className+=r===Vs.BEFORE?" "+Ti:" "+Ri,B}}},A.destroy=function(A){return!!A.parentNode&&(A.parentNode.removeChild(A),!0)},A}();!function(A){A[A.BEFORE=0]="BEFORE",A[A.AFTER=1]="AFTER"}(Vs||(Vs={}));var Fi,pi=function(A,e){var t=A.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=e.width.toString(),t.height=e.height.toString(),t.scrolling="no",t.setAttribute(fi,"true"),A.body.appendChild(t),t},Hi=function(A){return new Promise(function(e,t){var r=A.contentWindow;if(!r)return t("No window assigned for iframe");var n=r.document;r.onload=A.onload=n.onreadystatechange=function(){r.onload=A.onload=n.onreadystatechange=null;var t=setInterval(function(){n.body.childNodes.length>0&&"complete"===n.readyState&&(clearInterval(t),e(A))},50)}})},Ni=function(A,e){for(var t=A.length-1;t>=0;t--){var r=A.item(t);"content"!==r&&e.style.setProperty(r,A.getPropertyValue(r))}return e},Ki=function(A){var e="";return A&&(e+=""),e},mi=function(A,e,t){A&&A.defaultView&&(e!==A.defaultView.pageXOffset||t!==A.defaultView.pageYOffset)&&A.defaultView.scrollTo(e,t)},bi=function(A){var e=A[0],t=A[1],r=A[2];e.scrollLeft=t,e.scrollTop=r},vi=":before",Ii=":after",Ti="___html2canvas___pseudoelement_before",Ri="___html2canvas___pseudoelement_after",yi='{\n content: "" !important;\n display: none !important;\n}',Li=function(A){Oi(A,"."+Ti+vi+yi+"\n ."+Ri+Ii+yi)},Oi=function(A,e){var t=A.ownerDocument;if(t){var r=t.createElement("style");r.textContent=e,A.appendChild(r)}};!function(A){A[A.VECTOR=0]="VECTOR",A[A.BEZIER_CURVE=1]="BEZIER_CURVE"}(Fi||(Fi={}));var Si,Di=function(A,e){return A.length===e.length&&A.some(function(A,t){return A===e[t]})},Mi=function(A,e,t,r,n){return A.map(function(A,s){switch(s){case 0:return A.add(e,t);case 1:return A.add(e+r,t);case 2:return A.add(e+r,t+n);case 3:return A.add(e,t+n)}return A})},_i=function(){function A(A,e){this.type=Fi.VECTOR,this.x=A,this.y=e}return A.prototype.add=function(e,t){return new A(this.x+e,this.y+t)},A}(),ki=function(A,e,t){return new _i(A.x+(e.x-A.x)*t,A.y+(e.y-A.y)*t)},xi=function(){function A(A,e,t,r){this.type=Fi.BEZIER_CURVE,this.start=A,this.startControl=e,this.endControl=t,this.end=r}return A.prototype.subdivide=function(e,t){var r=ki(this.start,this.startControl,e),n=ki(this.startControl,this.endControl,e),s=ki(this.endControl,this.end,e),o=ki(r,n,e),i=ki(n,s,e),B=ki(o,i,e);return t?new A(this.start,r,o,B):new A(B,i,s,this.end)},A.prototype.add=function(e,t){return new A(this.start.add(e,t),this.startControl.add(e,t),this.endControl.add(e,t),this.end.add(e,t))},A.prototype.reverse=function(){return new A(this.end,this.endControl,this.startControl,this.start)},A}(),Pi=function(A){return A.type===Fi.BEZIER_CURVE},zi=function(){function A(A){var e=A.styles,t=A.bounds,r=Yt(e.borderTopLeftRadius,t.width,t.height),n=r[0],s=r[1],o=Yt(e.borderTopRightRadius,t.width,t.height),i=o[0],B=o[1],a=Yt(e.borderBottomRightRadius,t.width,t.height),c=a[0],u=a[1],Q=Yt(e.borderBottomLeftRadius,t.width,t.height),l=Q[0],w=Q[1],h=[];h.push((n+i)/t.width),h.push((l+c)/t.width),h.push((s+w)/t.height),h.push((B+u)/t.height);var g=Math.max.apply(Math,h);g>1&&(n/=g,s/=g,i/=g,B/=g,c/=g,u/=g,l/=g,w/=g);var d=t.width-i,U=t.height-u,C=t.width-c,f=t.height-w,E=e.borderTopWidth,F=e.borderRightWidth,p=e.borderBottomWidth,H=e.borderLeftWidth,N=qt(e.paddingTop,A.bounds.width),K=qt(e.paddingRight,A.bounds.width),m=qt(e.paddingBottom,A.bounds.width),b=qt(e.paddingLeft,A.bounds.width);this.topLeftBorderBox=n>0||s>0?Vi(t.left,t.top,n,s,Si.TOP_LEFT):new _i(t.left,t.top),this.topRightBorderBox=i>0||B>0?Vi(t.left+d,t.top,i,B,Si.TOP_RIGHT):new _i(t.left+t.width,t.top),this.bottomRightBorderBox=c>0||u>0?Vi(t.left+C,t.top+U,c,u,Si.BOTTOM_RIGHT):new _i(t.left+t.width,t.top+t.height),this.bottomLeftBorderBox=l>0||w>0?Vi(t.left,t.top+f,l,w,Si.BOTTOM_LEFT):new _i(t.left,t.top+t.height),this.topLeftPaddingBox=n>0||s>0?Vi(t.left+H,t.top+E,Math.max(0,n-H),Math.max(0,s-E),Si.TOP_LEFT):new _i(t.left+H,t.top+E),this.topRightPaddingBox=i>0||B>0?Vi(t.left+Math.min(d,t.width+H),t.top+E,d>t.width+H?0:i-H,B-E,Si.TOP_RIGHT):new _i(t.left+t.width-F,t.top+E),this.bottomRightPaddingBox=c>0||u>0?Vi(t.left+Math.min(C,t.width-H),t.top+Math.min(U,t.height+E),Math.max(0,c-F),u-p,Si.BOTTOM_RIGHT):new _i(t.left+t.width-F,t.top+t.height-p),this.bottomLeftPaddingBox=l>0||w>0?Vi(t.left+H,t.top+f,Math.max(0,l-H),w-p,Si.BOTTOM_LEFT):new _i(t.left+H,t.top+t.height-p),this.topLeftContentBox=n>0||s>0?Vi(t.left+H+b,t.top+E+N,Math.max(0,n-(H+b)),Math.max(0,s-(E+N)),Si.TOP_LEFT):new _i(t.left+H+b,t.top+E+N),this.topRightContentBox=i>0||B>0?Vi(t.left+Math.min(d,t.width+H+b),t.top+E+N,d>t.width+H+b?0:i-H+b,B-(E+N),Si.TOP_RIGHT):new _i(t.left+t.width-(F+K),t.top+E+N),this.bottomRightContentBox=c>0||u>0?Vi(t.left+Math.min(C,t.width-(H+b)),t.top+Math.min(U,t.height+E+N),Math.max(0,c-(F+K)),u-(p+m),Si.BOTTOM_RIGHT):new _i(t.left+t.width-(F+K),t.top+t.height-(p+m)),this.bottomLeftContentBox=l>0||w>0?Vi(t.left+H+b,t.top+f,Math.max(0,l-(H+b)),w-(p+m),Si.BOTTOM_LEFT):new _i(t.left+H+b,t.top+t.height-(p+m))}return A}();!function(A){A[A.TOP_LEFT=0]="TOP_LEFT",A[A.TOP_RIGHT=1]="TOP_RIGHT",A[A.BOTTOM_RIGHT=2]="BOTTOM_RIGHT",A[A.BOTTOM_LEFT=3]="BOTTOM_LEFT"}(Si||(Si={}));var Vi=function(A,e,t,r,n){var s=4*((Math.sqrt(2)-1)/3),o=t*s,i=r*s,B=A+t,a=e+r;switch(n){case Si.TOP_LEFT:return new xi(new _i(A,a),new _i(A,a-i),new _i(B-o,e),new _i(B,e));case Si.TOP_RIGHT:return new xi(new _i(A,e),new _i(A+o,e),new _i(B,a-i),new _i(B,a));case Si.BOTTOM_RIGHT:return new xi(new _i(B,e),new _i(B,e+i),new _i(A+o,a),new _i(A,a));case Si.BOTTOM_LEFT:default:return new xi(new _i(B,a),new _i(B-o,a),new _i(A,e+i),new _i(A,e))}},Xi=function(A){return[A.topLeftBorderBox,A.topRightBorderBox,A.bottomRightBorderBox,A.bottomLeftBorderBox]},Ji=function(A){return[A.topLeftContentBox,A.topRightContentBox,A.bottomRightContentBox,A.bottomLeftContentBox]},Gi=function(A){return[A.topLeftPaddingBox,A.topRightPaddingBox,A.bottomRightPaddingBox,A.bottomLeftPaddingBox]},Wi=function(){function A(A,e,t){this.type=0,this.offsetX=A,this.offsetY=e,this.matrix=t,this.target=6}return A}(),Yi=function(){function A(A,e){this.type=1,this.target=e,this.path=A}return A}(),qi=function(A){return 0===A.type},ji=function(A){return 1===A.type},Zi=function(){function A(A){this.element=A,this.inlineLevel=[],this.nonInlineLevel=[],this.negativeZIndex=[],this.zeroOrAutoZIndexOrTransformedOrOpacity=[],this.positiveZIndex=[],this.nonPositionedFloats=[],this.nonPositionedInlineLevel=[]}return A}(),$i=function(){function A(A,e){if(this.container=A,this.effects=e.slice(0),this.curves=new zi(A),null!==A.styles.transform){var t=A.bounds.left+A.styles.transformOrigin[0].number,r=A.bounds.top+A.styles.transformOrigin[1].number,n=A.styles.transform;this.effects.push(new Wi(t,r,n))}if(A.styles.overflowX!==es.VISIBLE){var s=Xi(this.curves),o=Gi(this.curves);Di(s,o)?this.effects.push(new Yi(s,6)):(this.effects.push(new Yi(s,2)),this.effects.push(new Yi(o,4)))}}return A.prototype.getParentEffects=function(){var A=this.effects.slice(0);if(this.container.styles.overflowX!==es.VISIBLE){var e=Xi(this.curves),t=Gi(this.curves);Di(e,t)||A.push(new Yi(t,6))}return A},A}(),AB=function IB(A,e,t,r){A.container.elements.forEach(function(n){var s=Js(n.flags,4),o=Js(n.flags,2),i=new $i(n,A.getParentEffects());Js(n.styles.display,2048)&&r.push(i);var B=Js(n.flags,8)?[]:r;if(s||o){var a=s||n.styles.isPositioned()?t:e,c=new Zi(i);if(n.styles.isPositioned()||n.styles.opacity<1||n.styles.isTransformed()){var u=n.styles.zIndex.order;if(u<0){var Q=0;a.negativeZIndex.some(function(A,e){return u>A.element.container.styles.zIndex.order?(Q=e,!1):Q>0}),a.negativeZIndex.splice(Q,0,c)}else if(u>0){var l=0;a.positiveZIndex.some(function(A,e){return u>A.element.container.styles.zIndex.order?(l=e+1,!1):l>0}),a.positiveZIndex.splice(l,0,c)}else a.zeroOrAutoZIndexOrTransformedOrOpacity.push(c)}else n.styles.isFloating()?a.nonPositionedFloats.push(c):a.nonPositionedInlineLevel.push(c);IB(i,c,s?c:t,B)}else n.styles.isInlineLevel()?e.inlineLevel.push(i):e.nonInlineLevel.push(i),IB(i,e,t,B);Js(n.flags,8)&&eB(n,B)})},eB=function(A,e){for(var t=A instanceof Co?A.start:1,r=A instanceof Co&&A.reversed,n=0;n0&&A.intrinsicHeight>0){var r=oB(A),n=Gi(e);this.path(n),this.ctx.save(),this.ctx.clip(),this.ctx.drawImage(t,0,0,A.intrinsicWidth,A.intrinsicHeight,r.left,r.top,r.width,r.height),this.ctx.restore()}},A.prototype.renderNodeContent=function(r){return e(this,void 0,void 0,function(){var e,n,s,o,B,a,c,u,c,Q,l,w,h,g,d,U,C,c,f,E,g;return t(this,function(t){switch(t.label){case 0:this.applyEffects(r.effects,4),e=r.container,n=r.curves,s=e.styles,o=0,B=e.textNodes,t.label=1;case 1:return o0&&l>0&&(w=n.ctx.createPattern(F,"repeat"),n.renderRepeat(a,w,c,u))):on(r)&&(N=aB(A,e,[null,null,null]),a=N[0],K=N[1],m=N[2],Q=N[3],l=N[4],b=0===r.position.length?[Gt]:r.position,c=qt(b[0],Q),u=qt(b[b.length-1],l),v=Hr(r,c,u,Q,l),I=v[0],T=v[1],I>0&&I>0&&(R=n.ctx.createRadialGradient(K+c,m+u,0,K+c,m+u,I),Cr(r.stops,2*I).forEach(function(A){return R.addColorStop(A.stop,ir(A.color))}),n.path(a),n.ctx.fillStyle=R,I!==T?(y=A.bounds.left+.5*A.bounds.width,L=A.bounds.top+.5*A.bounds.height,O=T/I,S=1/O,n.ctx.save(),n.ctx.translate(y,L),n.ctx.transform(1,0,0,O,0,0),n.ctx.translate(-y,-L),n.ctx.fillRect(K,S*(m-L)+L,Q,l*S),n.ctx.restore()):n.ctx.fill())),t.label=6;case 6:return e--,[2]}})},n=this,s=0,o=A.styles.backgroundImage.slice(0).reverse(),B.label=1;case 1:return s",{"class":"feedback-spinner"}))},u=function(){e(".feedback-spinner").remove()};e.feedback=function(A){function s(){R=!1,e(document).off("mouseenter mouseleave",".feedback-helper"),e(document).off("mouseup keyup"),e(document).off("mousedown",".feedback-setblackout"),e(document).off("mousedown",".feedback-sethighlight"),e(document).off("mousedown click","#feedback-close"),e(document).off("mousedown","#feedback-canvas"),e(document).off("click","#feedback-highlighter-next"),e(document).off("click","#feedback-highlighter-back"),e(document).off("click","#feedback-welcome-next"),e(document).off("click","#feedback-overview-back"),e(document).off("mouseleave","body"),e(document).off("mouseenter",".feedback-helper"),e(document).off("selectstart dragstart",document),e("#feedback-module").off("click",".feedback-wizard-close,.feedback-close-btn"),e(document).off("click","#feedback-submit"),h.highlightElement&&(e(document).off("click","#feedback-canvas"),e(document).off("mousemove","#feedback-canvas")),e('[data-highlighted="true"]').removeAttr("data-highlight-id").removeAttr("data-highlighted"),e("#feedback-module").remove(),e(".feedback-btn").show(),h.onClose.call(this)}function Q(A,t){t="undefined"==typeof t||t,A.clearRect(0,0,e("#feedback-canvas").width(),e("#feedback-canvas").height()),A.fillStyle="rgba(102,102,102,0.5)",A.fillRect(0,0,e("#feedback-canvas").width(),e("#feedback-canvas").height()),e(".feedback-helper").each(function(){"highlight"==e(this).attr("data-type")&&t&&l(A,parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height())}),e(".feedback-helper").each(function(){"highlight"==e(this).attr("data-type")&&A.clearRect(parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height())}),e(".feedback-helper").each(function(){"blackout"==e(this).attr("data-type")&&(A.fillStyle="rgba(0,0,0,1)",A.fillRect(parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height()))})}function l(A,e,t,r,n){A.strokeStyle=h.strokeStyle,A.shadowColor=h.shadowColor,A.shadowOffsetX=h.shadowOffsetX,A.shadowOffsetY=h.shadowOffsetY,A.shadowBlur=h.shadowBlur,A.lineJoin=h.lineJoin,A.lineWidth=h.lineWidth,A.strokeRect(e,t,r,n),A.shadowOffsetX=0,A.shadowOffsetY=0,A.shadowBlur=0,A.lineWidth=1}var w=B(A.i18nProperties||i),h=e.extend({ajaxURL:"",postBrowserInfo:!0,postHTML:!0,postURL:!0,proxy:void 0,letterRendering:!1,descriptionTemplate:"",initButtonText:w.send_feedback,strokeStyle:"black",shadowColor:"black",shadowOffsetX:1,shadowOffsetY:1,shadowBlur:10,lineJoin:"bevel",lineWidth:3,feedbackButton:".feedback-btn",isDraggable:!0,onScreenshotTaken:function(){},tpl:{highlighter:a(t.highlighter,w),overview:a(t.overview,w),submitSuccess:a(t.submitSuccess,w),submitError:a(t.submitError,w)},onClose:function(){},screenshotStroke:!0,highlightElement:!0},A),g=!!window.HTMLCanvasElement,d=".feedback-btn"==h.feedbackButton,U=void 0,C=void 0,f=void 0,E=void 0,F=void 0,p=void 0,H=void 0,N=void 0,K=void 0,m=void 0,b=void 0,v=void 0,I=void 0,T=void 0,R=void 0;g&&(d&&e("body").append('"),e(document).on("click",h.feedbackButton,function(){e("div[tabindex='-1']").removeAttr("tabindex"),d&&e(this).hide();var A=!1,t="",i=e(document).height(),B=e(document).width(),a='
';a+=h.tpl.highlighter+h.tpl.overview+'
',e("body").append(a);var w=new o(e("#feedback-highlighter").get(0)),g=new o(e("#feedback-highlighter").get(0).parentNode);if(U={position:"absolute",left:"0px",top:"0px"},C={width:B,height:i},e("#feedback-module").css(U),e("#feedback-canvas").attr(C).css("z-index","30000"),e("#feedback-highlighter-back").remove(),A=!0,e("#feedback-canvas").css("cursor","crosshair"),e("#feedback-helpers").show(),e("#feedback-welcome").hide(),e("#feedback-highlighter").show(),h.isDraggable){var R=null;w.on_pointer_events(function(A){var t=A.touches?A.touches[0]:A,r=e("#feedback-highlighter").addClass("feedback-draggable"),n=r.outerHeight(),s=r.outerWidth(),o=r.offset().top+n-t.pageY,i=r.offset().left+s-t.pageX;r.css("z-index",4e4),R=function(A){var t=A.touches?A.touches[0]:A;f=t.pageY+o-n,E=t.pageX+i-s,F=n-t.pageY,p=s-t.pageX,E<0&&(E=0),f<0&&(f=0),p>e(window).width()&&(E=e(window).width()-s),E>e(window).width()-s&&(E=e(window).width()-s),F>e(document).height()&&(f=e(document).height()-n),f>e(document).height()-n&&(f=e(document).height()-n),e(".feedback-draggable").offset({top:f,left:E}).on("mouseup",function(){e(this).removeClass("feedback-draggable")})},g.on_pointer_events(R,"move"),A.preventDefault()},"down").on_pointer_events(function(A){e("#feedback-highlighter").removeClass("feedback-draggable"),g.off_pointer_events(R,"move")},"up")}var y=e("#feedback-canvas")[0].getContext("2d");if(y.fillStyle="rgba(102,102,102,0.5)",y.fillRect(0,0,e("#feedback-canvas").width(),e("#feedback-canvas").height()),H={},N=!1,K=1,m={},h.postBrowserInfo&&(m.browser={},m.browser.appCodeName=navigator.appCodeName,m.browser.appName=navigator.appName,m.browser.appVersion=navigator.appVersion,m.browser.cookieEnabled=navigator.cookieEnabled,m.browser.onLine=navigator.onLine,m.browser.platform=navigator.platform,m.browser.userAgent=navigator.userAgent,m.browser.plugins=[],e.each(navigator.plugins,function(A){m.browser.plugins.push(navigator.plugins[A].name)}),e("#feedback-browser-info").show()),h.postURL&&(m.url=document.URL,e("#feedback-page-info").show()),h.postHTML&&(m.html=e("html").html(),e("#feedback-page-structure").show()),h.postBrowserInfo||h.postURL||h.postHTML||e("#feedback-additional-none").show(),e(document).on("mousedown","#feedback-canvas",function(t){A&&(H.startX=t.pageX-e(this).offset().left,H.startY=t.pageY-e(this).offset().top,H.w=0,H.h=0,N=!0)}),e(document).on("mouseup",function(){if(A){N=!1;var t=H.startY,r=H.startX,n=H.w,s=H.h;if(b="highlight",0==n||0==s)return;n<0&&(r+=n,n*=-1),s<0&&(t+=s,s*=-1),t+s>e(document).height()&&(s=e(document).height()-t),r+n>e(document).width()&&(n=e(document).width()-r),0==K&&(b="blackout"),e("#feedback-helpers").append(''),Q(y),H.w=0}}),e(document).on("mousemove",function(t){A&&N&&(e("#feedback-highlighter").css("cursor","default"),H.w=t.pageX-e("#feedback-canvas").offset().left-H.startX,H.h=t.pageY-e("#feedback-canvas").offset().top-H.startY,y.clearRect(0,0,e("#feedback-canvas").width(),e("#feedback-canvas").height()),y.fillStyle="rgba(102,102,102,0.5)",y.fillRect(0,0,e("#feedback-canvas").width(),e("#feedback-canvas").height()),e(".feedback-helper").each(function(){"highlight"==e(this).attr("data-type")&&l(y,parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height())}),1==K&&(l(y,H.startX,H.startY,H.w,H.h),y.clearRect(H.startX,H.startY,H.w,H.h)),e(".feedback-helper").each(function(){"highlight"==e(this).attr("data-type")&&y.clearRect(parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height())}),e(".feedback-helper").each(function(){"blackout"==e(this).attr("data-type")&&(y.fillStyle="rgba(0,0,0,1)",y.fillRect(parseInt(e(this).css("left"),10),parseInt(e(this).css("top"),10),e(this).width(),e(this).height()))}),0==K&&(y.fillStyle="rgba(0,0,0,0.5)",y.fillRect(H.startX,H.startY,H.w,H.h)))}),h.highlightElement){var L=[],O=[],S=0;e(document).on("mousemove click","#feedback-canvas",function(t){if(A){Q(y),O=[],e("#feedback-canvas").css("cursor","crosshair"),e("* :not(body,script,iframe,div,section,.feedback-btn,#feedback-module *)").each(function(){"true"!==e(this).attr("data-highlighted")&&t.pageX>e(this).offset().left&&t.pageXe(this).offset().top+parseInt(e(this).css("padding-top"),10)&&t.pageY
+ ) : ( +

{err.toString()}

+ ); + ReactDOM.render(
{feedback}
, document.getElementById("root")); + } +} + +main(); diff --git a/src/legacy/App/App.component.js b/src/legacy/App/App.component.js new file mode 100644 index 0000000..c829a80 --- /dev/null +++ b/src/legacy/App/App.component.js @@ -0,0 +1,84 @@ +import AppWithD2 from "d2-ui/lib/app/AppWithD2.component"; +import MainContent from "d2-ui/lib/layout/main-content/MainContent.component"; +import SinglePanelLayout from "d2-ui/lib/layout/SinglePanel.component"; +import { getInstance } from "d2/lib/d2"; +import PropTypes from "prop-types"; +import React from "react"; +import { Observable } from "rx"; +import LoadingMask from "../loading-mask/LoadingMask.component"; +import SnackbarContainer from "../Snackbar/SnackbarContainer.component"; +import appTheme from "./app.theme"; +import appState from "./appStateStore"; + +const withMuiContext = Object.assign(AppWithD2.childContextTypes, { muiTheme: PropTypes.object }); + +class App extends AppWithD2 { + getChildContext() { + return Object.assign({}, super.getChildContext(), { + muiTheme: appTheme, + }); + } + + componentDidMount = () => { + super.componentDidMount(); + + // The all section is a special section that should not be treated like a normal section as it does not + // have the sidebar. It is used to display the collection of all meta data objects. The all section will + // therefore always emit false. + const allSectionSelected$ = appState.filter(state => state.sideBar.currentSection === "all").map(() => false); + + const nonAllSectionSelected$ = appState + // The all section is managed separately so we do not want to process those any further + .filter(state => state.sideBar.currentSection !== "all") + .map(state => + // Check if the current section is in the list of mainSections + state.mainSections.some(mainSection => mainSection.key === state.sideBar.currentSection) + ); + + this.disposable = Observable.merge(allSectionSelected$, nonAllSectionSelected$) + // Do not emit the value more often than needed to prevent unnecessary react triggers + .distinctUntilChanged() + .subscribe(hasSection => + this.setState({ + ...this.state, + hasSection, + }) + ); + }; + + componentWillUnmount = () => { + super.componentWillUnmount(); + + if (this.disposable && this.disposable.dispose) { + this.disposable.dispose(); + } + }; + + render = () => { + if (!this.state.d2) { + return ; + } + + return ( + + + {this.props.children} + + + + ); + }; +} + +App.propTypes = { + d2: PropTypes.object, + appConfig: PropTypes.object, +}; + +App.defaultProps = { + d2: getInstance(), +}; + +App.childContextTypes = withMuiContext; + +export default App; diff --git a/src/App/app.theme.js b/src/legacy/App/app.theme.js similarity index 100% rename from src/App/app.theme.js rename to src/legacy/App/app.theme.js diff --git a/src/App/appStateStore.js b/src/legacy/App/appStateStore.js similarity index 85% rename from src/App/appStateStore.js rename to src/legacy/App/appStateStore.js index d106ee4..e6cd168 100644 --- a/src/App/appStateStore.js +++ b/src/legacy/App/appStateStore.js @@ -1,7 +1,10 @@ import Store from "d2-ui/lib/store/Store"; -import { getInstance } from "d2/lib/d2"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; import isObject from "d2-utilizr/lib/isObject"; +import { getInstance } from "d2/lib/d2"; +import "rxjs/add/operator/distinctUntilChanged"; +import "rxjs/add/operator/filter"; +import "rxjs/add/operator/map"; import snackActions from "../Snackbar/snack.actions"; const sideBarConfig = {}; @@ -21,12 +24,10 @@ async function loadSideBarState() { return Object.keys(sideBarConfig) .map(sideBarCategory => ({ name: sideBarCategory, - items: sideBarConfig[sideBarCategory].items - .filter(isInPredefinedList(modelDefinitionNames)) - .map(key => ({ - key, - label: d2.i18n.getTranslation(camelCaseToUnderscores(key)), - })), + items: sideBarConfig[sideBarCategory].items.filter(isInPredefinedList(modelDefinitionNames)).map(key => ({ + key, + label: d2.i18n.getTranslation(camelCaseToUnderscores(key)), + })), })) .reduce( (acc, sideBarCategory) => { @@ -44,8 +45,7 @@ async function loadSideBarState() { // d2/src/current-user/CurrentUser.js#getOrganisationUnits + children[shortName] const orgUnitListOptions = { - fields: - ":all,shortName,displayName,path,children[id,shortName,displayName,path,children::isNotEmpty]", + fields: ":all,shortName,displayName,path,children[id,shortName,displayName,path,children::isNotEmpty]", paging: false, }; @@ -56,9 +56,7 @@ async function getCurrentUserOrganisationUnits(disableCache = false) { } const d2 = await getInstance(); - const organisationUnitsCollection = await d2.currentUser.getOrganisationUnits( - orgUnitListOptions - ); + const organisationUnitsCollection = await d2.currentUser.getOrganisationUnits(orgUnitListOptions); if (d2.currentUser.authorities.has("ALL") && !organisationUnitsCollection.size) { const rootLevelOrgUnits = await d2.models.organisationUnits.list({ @@ -131,11 +129,7 @@ export async function initAppState(startState, disableCache) { const completeInitState = Object.keys(startState).reduce((newAppState, stateKey) => { if (newAppState[stateKey]) { if (isObject(newAppState[stateKey])) { - newAppState[stateKey] = Object.assign( - {}, - newAppState[stateKey], - startState[stateKey] - ); // eslint-disable-line no-param-reassign + newAppState[stateKey] = Object.assign({}, newAppState[stateKey], startState[stateKey]); // eslint-disable-line no-param-reassign } else { newAppState[stateKey] = startState[stateKey]; // eslint-disable-line no-param-reassign } @@ -152,6 +146,4 @@ export function setAppState(newPartialState) { appState.setState(Object.assign({}, appState.state, newPartialState)); } -export const currentSubSection$ = appState - .map(state => state.sideBar.currentSubSection) - .distinctUntilChanged(); +export const currentSubSection$ = appState.map(state => state.sideBar.currentSubSection).distinctUntilChanged(); diff --git a/src/legacy/LegacyApp.jsx b/src/legacy/LegacyApp.jsx new file mode 100644 index 0000000..0b8150f --- /dev/null +++ b/src/legacy/LegacyApp.jsx @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; +import App from "./App/App.component"; +import { initAppState } from "./App/appStateStore"; + +const params = { groupName: "userSection", modelType: "user" }; + +export const LegacyAppWrapper = props => { + const [loading, setLoading] = useState(true); + + useEffect(() => { + loadList({ params }, () => setLoading(false)); + }, []); + + if (loading) return null; + + return {props.children}; +}; + +function initState({ params }) { + initAppState({ + sideBar: { + currentSection: params.groupName, + currentSubSection: params.modelType, + }, + }); +} + +function loadList({ params }, callback) { + initState({ params }); + callback(); +} diff --git a/src/List/DetailsBox.component.js b/src/legacy/List/DetailsBox.component.js similarity index 65% rename from src/List/DetailsBox.component.js rename to src/legacy/List/DetailsBox.component.js index 6ac5214..e51cbf7 100644 --- a/src/List/DetailsBox.component.js +++ b/src/legacy/List/DetailsBox.component.js @@ -1,47 +1,49 @@ -import React from "react"; import classes from "classnames"; - +import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; +import _ from "lodash"; import FontIcon from "material-ui/FontIcon/FontIcon"; - import PropTypes from "prop-types"; -import Translate from "d2-ui/lib/i18n/Translate.mixin"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; +import React from "react"; import Moment from "react-moment"; -export default React.createClass({ - propTypes: { +export default class DetailsBox extends React.Component { + static propTypes = { fields: PropTypes.array, showDetailBox: PropTypes.bool, source: PropTypes.object, onClose: PropTypes.func, - }, + }; + + static contextTypes = { + d2: PropTypes.object.isRequired, + }; - mixins: [Translate], + getTranslation(...args) { + return this.context.d2.i18n.getTranslation(...args); + } - getDefaultProps() { - return { - fields: [ - "name", - "username", - "shortName", - "code", - "displayDescription", - "created", - "lastUpdated", - "lastLogin", - "id", - "href", - "userRoles", - "userGroups", - "organisationUnits", - "dataViewOrganisationUnits", - ], - showDetailBox: false, - onClose: () => {}, - }; - }, + static defaultProps = { + fields: [ + "name", + "username", + "shortName", + "code", + "displayDescription", + "created", + "lastUpdated", + "lastLogin", + "id", + "href", + "userRoles", + "userGroups", + "organisationUnits", + "dataViewOrganisationUnits", + ], + showDetailBox: false, + onClose: () => {}, + }; - getDetailBoxContent() { + getDetailBoxContent = () => { if (!this.props.source) { return
Loading details...
; } @@ -49,23 +51,18 @@ export default React.createClass({ return this.props.fields .filter(fieldName => this.props.source[fieldName]) .map(fieldName => { - const valueToRender = this.getValueToRender( - fieldName, - this.props.source[fieldName] - ); + const valueToRender = this.getValueToRender(fieldName, this.props.source[fieldName]); return (
{this.getTranslation(camelCaseToUnderscores(fieldName))}
-
- {valueToRender} -
+
{valueToRender}
); }); - }, + }; getValueToRender(fieldName, value) { switch (fieldName) { @@ -75,14 +72,14 @@ export default React.createClass({ return {value}; case "href": return ( - + {value} ); case "userRoles": case "userGroups": case "organisationUnits": - case "dataViewOrganisationUnits": + case "dataViewOrganisationUnits": { const objs = _(value.toArray ? value.toArray() : value) .sortBy("displayName") .value(); @@ -94,12 +91,13 @@ export default React.createClass({ objs.map(obj =>
{obj.displayName}
) ); return
{contents}
; + } default: return value; } - }, + } - render() { + render = () => { const classList = classes("details-box"); if (this.props.showDetailBox === false) { @@ -108,14 +106,11 @@ export default React.createClass({ return (
- + close
{this.getDetailBoxContent()}
); - }, -}); + }; +} diff --git a/src/List/DetailsBoxWithScroll.component.js b/src/legacy/List/DetailsBoxWithScroll.component.js similarity index 91% rename from src/List/DetailsBoxWithScroll.component.js rename to src/legacy/List/DetailsBoxWithScroll.component.js index 8239b7e..022b021 100644 --- a/src/List/DetailsBoxWithScroll.component.js +++ b/src/legacy/List/DetailsBoxWithScroll.component.js @@ -5,18 +5,18 @@ import { Observable } from "rx"; import DetailsBox from "./DetailsBox.component"; export default class DetailsBoxWithScroll extends React.Component { - componentDidMount() { + componentDidMount = () => { this.disposable = Observable.fromEvent(global, "scroll") .debounce(200) .map(() => document.querySelector("body").scrollTop) .subscribe(() => this.forceUpdate()); - } + }; - componentWillUnmount() { + componentWillUnmount = () => { this.disposable && this.disposable.dispose(); - } + }; - render() { + render = () => { return (
); - } + }; } diff --git a/src/List/Filters.component.js b/src/legacy/List/Filters.component.js similarity index 83% rename from src/List/Filters.component.js rename to src/legacy/List/Filters.component.js index a668184..06b7efb 100644 --- a/src/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -1,17 +1,15 @@ -import React from "react"; +import _ from "lodash"; import Checkbox from "material-ui/Checkbox/Checkbox"; -import PropTypes from "prop-types"; import IconButton from "material-ui/IconButton"; -import FilterListIcon from "material-ui/svg-icons/content/filter-list"; -import ClearIcon from "material-ui/svg-icons/content/clear"; -import AnimateHeight from "react-animate-height"; import Paper from "material-ui/Paper/Paper"; +import ClearIcon from "material-ui/svg-icons/content/clear"; +import FilterListIcon from "material-ui/svg-icons/content/filter-list"; import memoize from "memoize-weak"; - -import SearchBox from "./SearchBox.component"; -import OrgUnitsFilter from "../components/OrgUnitsFilter.component"; +import PropTypes from "prop-types"; +import React from "react"; +import AnimateHeight from "react-animate-height"; import MultipleFilter from "../components/MultipleFilter.component"; -import ObserverRegistry from "../utils/ObserverRegistry.mixin"; +import OrgUnitsFilter from "../components/OrgUnitsFilter.component"; import listActions from "./list.actions"; import listStore from "./list.store"; @@ -53,8 +51,6 @@ export default class Filters extends React.Component { constructor(props, context) { super(props); - Object.assign(this, ObserverRegistry); - const { i18n } = context.d2; this.getTranslation = i18n.getTranslation.bind(i18n); @@ -75,11 +71,22 @@ export default class Filters extends React.Component { }; } - componentDidMount() { + componentWillMount = () => { + this.observerDisposables = []; + }; + + componentWillUnmount = () => { + this.observerDisposables.forEach(disposable => disposable.dispose()); + }; + + registerDisposable = disposable => { + this.observerDisposables.push(disposable); + }; + + componentDidMount = () => { listActions.loadUserRoles.next(); listActions.loadUserGroups.next(); - const toOptions = objs => - objs.toArray().map(obj => ({ value: obj.id, text: obj.displayName })); + const toOptions = objs => objs.toArray().map(obj => ({ value: obj.id, text: obj.displayName })); this.registerDisposable( listStore.listRolesSubject.subscribe(userRoles => { @@ -92,7 +99,7 @@ export default class Filters extends React.Component { this.setState({ userGroupsAll: toOptions(userGroups) }); }) ); - } + }; toggleExtendedFilters = () => { this.setState({ showExtendedFilters: !this.state.showExtendedFilters }); @@ -100,13 +107,11 @@ export default class Filters extends React.Component { searchListByName = searchObserver => { this.registerDisposable( - searchObserver.subscribe(value => - this.setState({ searchString: value }, this.notifyParent) - ) + searchObserver.subscribe(value => this.setState({ searchString: value }, this.notifyParent)) ); }; - getFilterOptions() { + getFilterOptions = () => { const { showOnlyManagedUsers, showOnlyActiveUsers, @@ -130,7 +135,7 @@ export default class Filters extends React.Component { "dataViewOrganisationUnits.id": inFilter(orgUnitsOutput.map(ou => ou.id)), }, }; - } + }; clearFilters = () => { this.setState( @@ -147,10 +152,10 @@ export default class Filters extends React.Component { ); }; - notifyParent() { + notifyParent = () => { const filterOptions = this.getFilterOptions(); this.props.onChange(filterOptions); - } + }; _setFilter = (key, getter) => { return (...args) => { @@ -161,8 +166,7 @@ export default class Filters extends React.Component { checkboxHandler = (ev, isChecked) => isChecked; - render() { - const { onChange } = this.props; + render = () => { const { userGroups, userRoles, @@ -170,31 +174,25 @@ export default class Filters extends React.Component { orgUnitsOutput, showOnlyManagedUsers, showOnlyActiveUsers, - searchString, - searchStringClear, showExtendedFilters, } = this.state; + const { styles } = this; const isExtendedFiltering = showOnlyManagedUsers || showOnlyActiveUsers || !_([userGroups, userRoles, orgUnits, orgUnitsOutput]).every(_.isEmpty); - const isFiltering = showOnlyManagedUsers || searchString || isExtendedFiltering; + const isFiltering = showOnlyManagedUsers || isExtendedFiltering; const filterIconColor = isExtendedFiltering ? "#ff9800" : undefined; const filterButtonColor = showExtendedFilters ? { backgroundColor: "#cdcdcd" } : undefined; return (
- - @@ -212,27 +210,21 @@ export default class Filters extends React.Component { {isFiltering && ( @@ -265,9 +257,7 @@ export default class Filters extends React.Component {
); - } + }; } diff --git a/src/List/List.component.js b/src/legacy/List/List.component.js similarity index 61% rename from src/List/List.component.js rename to src/legacy/List/List.component.js index 91c600c..652b586 100644 --- a/src/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -1,99 +1,59 @@ -import React, { Component } from "react"; +import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; +import isIterable from "d2-utilizr/lib/isIterable"; import _ from "lodash"; import set from "lodash/fp/set"; import log from "loglevel"; -import isIterable from "d2-utilizr/lib/isIterable"; -import DataTable from "../data-table/DataTable.component"; -import MultipleDataTable from "../components/multiple-data-table/MultipleDataTable.component"; -import Pagination from "d2-ui/lib/pagination/Pagination.component"; -import contextActions from "./context.actions"; -import detailsStore from "./details.store"; -import enableStore from "./enable.store"; -import listStore from "./list.store"; -import deleteUserStore from "./deleteUser.store"; -import listActions from "./list.actions"; -import ObserverRegistry from "../utils/ObserverRegistry.mixin"; -import { getCompactTextForModels } from "../utils/i18n"; -import Translate from "../utils/Translate.mixin"; -import LoadingStatus from "./LoadingStatus.component"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import Auth from "d2-ui/lib/auth/Auth.mixin"; -import orgUnitDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; -import userRolesAssignmentDialogStore from "./userRoles.store"; -import userGroupsAssignmentDialogStore from "./userGroups.store"; -import replicateUserStore from "./replicateUser.store"; -import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; -import UserRolesDialog from "../components/UserRolesDialog.component"; -import UserGroupsDialog from "../components/UserGroupsDialog.component"; -import CopyInUserDialog from "../components/CopyInUserDialog.component"; -import ReplicateUserFromTemplate from "../components/ReplicateUserFromTemplate.component"; -import ReplicateUserFromTable from "../components/ReplicateUserFromTable.component"; -import snackActions from "../Snackbar/snack.actions"; -import PropTypes from "prop-types"; -import MenuItem from "material-ui/MenuItem"; -import ImportExport from "../components/ImportExport.component"; import IconButton from "material-ui/IconButton"; +import MenuItem from "material-ui/MenuItem"; import ViewColumnIcon from "material-ui/svg-icons/action/view-column"; -import SettingsIcon from "material-ui/svg-icons/action/settings"; +import PropTypes from "prop-types"; +import React from "react"; +import { UserListTable } from "../../webapp/components/user-list-table/UserListTable"; +import CopyInUserDialog from "../components/CopyInUserDialog.component"; +import ImportExport from "../components/ImportExport.component"; +import ImportTable from "../components/ImportTable.component"; +import ReplicateUserFromTable from "../components/ReplicateUserFromTable.component"; +import ReplicateUserFromTemplate from "../components/ReplicateUserFromTemplate.component"; +import SettingsDialog from "../components/SettingsDialog.component"; import TableLayout from "../components/TableLayout.component"; +import UserGroupsDialog from "../components/UserGroupsDialog.component"; +import UserRolesDialog from "../components/UserRolesDialog.component"; import Settings from "../models/settings"; -import ImportTable from "../components/ImportTable.component"; -import User from "../models/user"; import { saveUsers, updateUsers } from "../models/userHelpers"; -import ModalLoadingMask from "../components/ModalLoadingMask.component"; -import SettingsDialog from "../components/SettingsDialog.component"; -import Filters from "./Filters.component"; -import DetailsBoxWithScroll from "./DetailsBoxWithScroll.component"; +import snackActions from "../Snackbar/snack.actions"; +import { getCompactTextForModels } from "../utils/i18n"; import copyInUserStore from "./copyInUser.store"; +import deleteUserStore from "./deleteUser.store"; +import detailsStore from "./details.store"; +import DetailsBoxWithScroll from "./DetailsBoxWithScroll.component"; +import enableStore from "./enable.store"; +import Filters from "./Filters.component"; +import listActions from "./list.actions"; +import listStore from "./list.store"; +import orgUnitDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; +import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; +import replicateUserStore from "./replicateUser.store"; +import userGroupsAssignmentDialogStore from "./userGroups.store"; +import userRolesAssignmentDialogStore from "./userRoles.store"; const pageSize = 50; -// Filters out any actions `edit`, `clone` when the user can not update/edit this modelType -function actionsThatRequireCreate(action) { - if ( - (action !== "edit" && action !== "clone") || - this.getCurrentUser().canUpdate(this.getModelDefinitionByName(this.props.params.modelType)) - ) { - return true; - } - return false; -} - -// Filters out the `delete` when the user can not delete this modelType -function actionsThatRequireDelete(action) { - if ( - action !== "delete" || - this.getCurrentUser().canDelete(this.getModelDefinitionByName(this.props.params.modelType)) - ) { - return true; - } - return false; -} - -// TODO: Move this somewhere as a utility function, probably on the Pagination component (as a separate export) in d2-ui? -export function calculatePageValue(pager) { - const { total, pageCount, page } = pager; - const pageCalculationValue = total - (total - (pageCount - (pageCount - page)) * pageSize); - const startItem = 1 + pageCalculationValue - pageSize; - const endItem = pageCalculationValue; - - return `${startItem} - ${endItem > total ? total : endItem}`; -} - const initialSorting = ["name", "asc"]; -const List = React.createClass({ - propTypes: { +export class ListHybrid extends React.Component { + static propTypes = { params: PropTypes.shape({ modelType: PropTypes.string.isRequired, }), - }, + }; - mixins: [ObserverRegistry, Translate, Auth], + static contextTypes = { + d2: PropTypes.object.isRequired, + }; - maxImportUsers: 200, + maxImportUsers = 200; - styles: { + styles = { dataTableWrap: { display: "flex", flexDirection: "column", @@ -115,10 +75,24 @@ const List = React.createClass({ display: "flex", flexOrientation: "row", }, - }, + }; - getInitialState() { - return { + componentWillUnmount = () => { + this.observerDisposables.forEach(disposable => disposable.dispose()); + }; + + registerDisposable = disposable => { + this.observerDisposables.push(disposable); + }; + + getTranslation = (...args) => { + return this.context.d2.i18n.getTranslation(...args); + }; + + constructor(props, context) { + super(props, context); + + this.state = { listFilterOptions: {}, dataRows: null, filters: {}, @@ -157,41 +131,11 @@ const List = React.createClass({ open: false, }, }; - }, - - getDataTableRows(users) { - const { settings } = this.state; - const orgUnitsField = settings.get("organisationUnitsField"); - - const namesFromCollection = (collection, displayField) => { - return ( - _(collection && collection.toArray ? collection.toArray() : collection || []) - .map(displayField) - .sortBy() - .join(", ") || "-" - ); - }; + } - return users.map(user => ({ - ...user, - lastLogin: user.userCredentials.lastLogin, - disabled: user.userCredentials.disabled, - userGroups: namesFromCollection(user.userGroups, "displayName"), - userRoles: namesFromCollection( - user.userCredentials && user.userCredentials.userRoles, - "displayName" - ), - organisationUnits: namesFromCollection(user.organisationUnits, orgUnitsField), - dataViewOrganisationUnits: namesFromCollection( - user.dataViewOrganisationUnits, - orgUnitsField - ), - model: user, - d2: this.context.d2, - })); - }, + componentWillMount = () => { + this.observerDisposables = []; - componentWillMount() { Settings.build(this.context.d2).then(settings => { const sourceStoreDisposable = listStore.subscribe(listStoreValue => { if (!isIterable(listStoreValue.list)) { @@ -213,17 +157,13 @@ const List = React.createClass({ this.setState({ detailsObject }); }); - const orgUnitAssignmentStoreDisposable = orgUnitDialogStore.subscribe( - orgunitassignmentState => { - this.setAssignState("orgunitassignment", orgunitassignmentState); - } - ); + const orgUnitAssignmentStoreDisposable = orgUnitDialogStore.subscribe(orgunitassignmentState => { + this.setAssignState("orgunitassignment", orgunitassignmentState); + }); - const userRolesAssignmentDialogStoreDisposable = userRolesAssignmentDialogStore.subscribe( - assignUserRoles => { - this.setAssignState("assignUserRoles", assignUserRoles); - } - ); + const userRolesAssignmentDialogStoreDisposable = userRolesAssignmentDialogStore.subscribe(assignUserRoles => { + this.setAssignState("assignUserRoles", assignUserRoles); + }); const userGroupsAssignmentDialogStoreDisposable = userGroupsAssignmentDialogStore.subscribe( assignUserGroups => { @@ -251,7 +191,7 @@ const List = React.createClass({ }); }); - const deleteUserStoreDisposable = deleteUserStore.subscribe(users => this.filterList()); + const deleteUserStoreDisposable = deleteUserStore.subscribe(() => this.filterList()); const userCopyUserDialogStoreDisposable = copyInUserStore.subscribe(copyUsers => { this.setAssignState("copyUsers", copyUsers); @@ -267,14 +207,12 @@ const List = React.createClass({ this.registerDisposable(userCopyUserDialogStoreDisposable); this.filterList(); - }, + }; - async setUsersEnableState(users, action) { + setUsersEnableState = async (users, action) => { const newValue = action === "disable"; const response = await updateUsers(this.context.d2, users, user => { - return user.userCredentials.disabled !== newValue - ? set("userCredentials.disabled", newValue, user) - : null; + return user.userCredentials.disabled !== newValue ? set("userCredentials.disabled", newValue, user) : null; }); if (response.success) { @@ -288,14 +226,14 @@ const List = React.createClass({ }); snackActions.show({ message }); } - }, + }; - setAssignState(key, value) { + setAssignState = (key, value) => { this.setState( { [key]: value, detailsObject: null }, () => !value.open && this.filterList({ page: this.state.pager.page }) ); - }, + }; componentWillReceiveProps(newProps) { if (this.props.params.modelType !== newProps.params.modelType) { @@ -304,29 +242,27 @@ const List = React.createClass({ translation: Object.assign({}, this.state.translation, { open: false }), }); } - }, + } - _orgUnitAssignmentSaved() { + _orgUnitAssignmentSaved = () => { snackActions.show({ message: "organisation_unit_capture_assignment_saved", action: "ok", translate: true, }); - }, + }; - _orgUnitAssignmentError(errorMessage) { + _orgUnitAssignmentError = errorMessage => { log.error(errorMessage); snackActions.show({ message: "organisation_unit_capture_assignment_save_error", translate: true, }); - }, + }; - filterList({ page = 1 } = {}) { - const order = this.state.sorting - ? this.state.sorting[0] + ":i" + this.state.sorting[1] - : null; - const { pager, filters } = this.state; + filterList = ({ page = 1 } = {}) => { + const order = this.state.sorting ? this.state.sorting[0] + ":i" + this.state.sorting[1] : null; + const { filters } = this.state; const options = { modelType: this.props.params.modelType, @@ -341,27 +277,26 @@ const List = React.createClass({ pageSize: pageSize, }; - listActions.filter(paginatedOptions).subscribe(() => {}, error => log.error(error)); + listActions.filter(paginatedOptions).subscribe( + () => {}, + error => log.error(error) + ); this.setState({ isLoading: true, listFilterOptions: options }); - }, - - onColumnSort(sorting) { - this.setState({ sorting }, this.filterList); - }, + }; - convertObjsToMenuItems(objs) { + convertObjsToMenuItems = objs => { const emptyEntry = ; const entries = objs .toArray() .map(obj => ); return [emptyEntry].concat(entries); - }, + }; - onReplicateDialogClose() { + onReplicateDialogClose = () => { replicateUserStore.setState({ open: false }); - }, + }; - getReplicateDialog(info) { + getReplicateDialog = info => { const componentsByType = { template: ReplicateUserFromTemplate, table: ReplicateUserFromTable, @@ -379,54 +314,51 @@ const List = React.createClass({ } else { throw new Error(`Unknown replicate dialog type: ${info.type}`); } - }, + }; - _getTableActions() { + _getTableActions = () => { return (
- +
); - }, + }; - _openSettings() { + _openSettings = () => { this.setState({ settingsVisible: true }); - }, + }; - _closeSettings(newSettings) { + _closeSettings = newSettings => { this.setState({ settingsVisible: false, ...(newSettings ? { settings: newSettings } : {}), }); - }, + }; - _openLayoutSettings() { + _openLayoutSettings = () => { this.setState({ layoutSettingsVisible: true }); - }, + }; - _closeLayoutSettings() { + _closeLayoutSettings = () => { this.setState({ layoutSettingsVisible: false }); - }, + }; - _setLayoutSettings(selectedColumns) { + _setLayoutSettings = selectedColumns => { const newSettings = this.state.settings.set({ visibleTableColumns: selectedColumns }); this.setState({ settings: newSettings }); - }, + }; - _saveLayoutSettings() { + _saveLayoutSettings = () => { this.state.settings.save().then(this._closeLayoutSettings); - }, + }; - _openImportTable(importResult) { + _openImportTable = importResult => { this.setState({ importUsers: { open: true, ...importResult } }); - }, + }; - async _importUsers(users) { + _importUsers = async users => { const response = await saveUsers(this.context.d2, users); if (response.success) { const message = this.getTranslation("import_successful", { n: users.length }); @@ -436,52 +368,22 @@ const List = React.createClass({ } else { return response; } - }, + }; - _closeImportUsers() { + _closeImportUsers = () => { this.setState({ importUsers: { open: false } }); - }, + }; - _onFiltersChange(filters) { + _onFiltersChange = filters => { this.setState({ filters }, this.filterList); - }, + }; - render() { + render = () => { if (!this.state.dataRows) return null; - const currentlyShown = calculatePageValue(this.state.pager); - const { pager } = this.state; const { d2 } = this.context; - const paginationProps = { - hasNextPage: () => - Boolean(this.state.pager.hasNextPage) && this.state.pager.hasNextPage(), - hasPreviousPage: () => - Boolean(this.state.pager.hasPreviousPage) && this.state.pager.hasPreviousPage(), - onNextPageClick: () => { - this.setState({ isLoading: true }, () => this.filterList({ page: pager.page + 1 })); - }, - onPreviousPageClick: () => { - this.setState({ isLoading: true }, () => this.filterList({ page: pager.page - 1 })); - }, - total: this.state.pager.total, - currentlyShown, - }; + const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers } = this.state; - const rows = this.getDataTableRows(this.state.dataRows); - const { - assignUserRoles, - assignUserGroups, - replicateUser, - listFilterOptions, - copyUsers, - } = this.state; - const { - showAllUsers, - filterByGroups, - filterByRoles, - filterByOrgUnits, - filterByOrgUnitsOutput, - } = this.state; const { importUsers } = this.state; const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; const { styles } = this; @@ -491,58 +393,30 @@ const List = React.createClass({ value: c.name, })); - const visibleColumns = _(tableColumns) - .keyBy("name") - .at(settings.get("visibleTableColumns")) - .compact() - .value(); + const visibleColumns = _(tableColumns).keyBy("name").at(settings.get("visibleTableColumns")).compact().value(); return (
-
- - -
- - - - - - - -
-
- -
- - {this.state.dataRows.length || this.state.isLoading ? null : ( -
No results found
- )} + + + +
+ +
+
+ {this.state.dataRows.length || this.state.isLoading ? null :
No results found
}
+ {this.state.detailsObject ? ( - {this.state.orgunitassignment.open && - this.state.orgunitassignment.field === "organisationUnits" ? ( + {this.state.orgunitassignment.open && this.state.orgunitassignment.field === "organisationUnits" ? ( ) : null} @@ -583,21 +452,15 @@ const List = React.createClass({ roots={this.state.orgunitassignment.roots} onOrgUnitAssignmentSaved={this._orgUnitAssignmentSaved} onOrgUnitAssignmentError={this._orgUnitAssignmentError} - filteringByNameLabel={this.getTranslation( - "filter_organisation_units_output_by_name" - )} - orgUnitsSelectedLabel={this.getTranslation( - "organisation_units_output_selected" - )} + filteringByNameLabel={this.getTranslation("filter_organisation_units_output_by_name")} + orgUnitsSelectedLabel={this.getTranslation("organisation_units_output_selected")} /> ) : null} {assignUserRoles.open ? ( - userRolesAssignmentDialogStore.setState({ open: false }) - } + onRequestClose={() => userRolesAssignmentDialogStore.setState({ open: false })} /> ) : null} @@ -611,9 +474,7 @@ const List = React.createClass({ {assignUserGroups.open ? ( - userGroupsAssignmentDialogStore.setState({ open: false }) - } + onRequestClose={() => userGroupsAssignmentDialogStore.setState({ open: false })} /> ) : null} @@ -627,9 +488,7 @@ const List = React.createClass({ /> )} - {settingsVisible && ( - - )} + {settingsVisible && } {replicateUser.open ? this.getReplicateDialog(replicateUser) : null} @@ -648,19 +507,13 @@ const List = React.createClass({ )}
); - }, + }; - _closeOrgUnitDialog() { + _closeOrgUnitDialog = () => { orgUnitDialogStore.setState( Object.assign({}, orgUnitDialogStore.state, { open: false, }) ); - }, -}); - -List.contextTypes = { - d2: PropTypes.object.isRequired, -}; - -export default List; + }; +} diff --git a/src/legacy/List/context.actions.js b/src/legacy/List/context.actions.js new file mode 100644 index 0000000..65cc6da --- /dev/null +++ b/src/legacy/List/context.actions.js @@ -0,0 +1,45 @@ +import { getInstance as getD2 } from "d2/lib/d2"; +import _ from "lodash"; +import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; +import _m from "../utils/lodash-mixins"; +import orgUnitAssignmentDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; + +export async function assignToOrgUnits(userIds, field, titleKey) { + const d2 = await getD2(); + const listOptions = { + paging: false, + fields: `:owner,${field}[id,path,shortName,displayName]`, + filter: `id:in:[${userIds.join(",")}]`, + }; + const users = (await d2.models.users.list(listOptions)).toArray(); + const usernames = users.map(user => user.userCredentials.username); + const info = _m.joinString(d2.i18n.getTranslation.bind(d2.i18n), usernames, 3, ", "); + const userOrgUnitRoots = await getOrgUnitsRoots(); + + orgUnitAssignmentDialogStore.setState({ + users: users, + field: field, + title: `${d2.i18n.getTranslation(titleKey)}: ${info}`, + roots: userOrgUnitRoots, + open: true, + }); +} + +// Compare two arrays lexicographically and return -1 (if xs < ys), 0 (if xs == ys) or 1 (if xs > ys). +function lexicographicalCompare(xs, ys) { + const compare = (x, y) => (x < y ? -1 : x === y ? 0 : 1); + return _(xs).zipWith(ys, compare).find() || 0; +} + +export async function goToUserEditPage(user) { + const d2 = await getD2(); + const baseUrl = d2.system.systemInfo.contextPath; + const { major, minor } = d2.system.version; + // DHIS2 >= 2.30 uses a new React user-app + const url = + lexicographicalCompare([major, minor], [2, 30]) >= 0 + ? `${baseUrl}/dhis-web-user/index.html#/users/edit/${user.id}` + : `${baseUrl}/dhis-web-maintenance-user/alluser.action?key=${user.username}`; + + window.open(url, "_blank"); +} diff --git a/src/List/copyInUser.store.js b/src/legacy/List/copyInUser.store.js similarity index 100% rename from src/List/copyInUser.store.js rename to src/legacy/List/copyInUser.store.js diff --git a/src/List/deleteUser.store.js b/src/legacy/List/deleteUser.store.js similarity index 88% rename from src/List/deleteUser.store.js rename to src/legacy/List/deleteUser.store.js index f88547e..a6cac5b 100644 --- a/src/List/deleteUser.store.js +++ b/src/legacy/List/deleteUser.store.js @@ -9,7 +9,12 @@ export default Store.create({ const d2 = await getD2(); const t = d2.i18n.getTranslation.bind(d2.i18n); const api = d2.Api.getApi(); - const usersText = _m.joinString(t, users.map(user => user.username), 3, ", "); + const usersText = _m.joinString( + t, + users.map(user => user.username), + 3, + ", " + ); const performDelete = () => { const payload = { users: users.map(user => ({ id: user.id })) }; diff --git a/src/List/details.store.js b/src/legacy/List/details.store.js similarity index 100% rename from src/List/details.store.js rename to src/legacy/List/details.store.js diff --git a/src/List/enable.store.js b/src/legacy/List/enable.store.js similarity index 100% rename from src/List/enable.store.js rename to src/legacy/List/enable.store.js diff --git a/src/List/list.actions.js b/src/legacy/List/list.actions.js similarity index 96% rename from src/List/list.actions.js rename to src/legacy/List/list.actions.js index 145d519..b8e786d 100644 --- a/src/List/list.actions.js +++ b/src/legacy/List/list.actions.js @@ -1,7 +1,6 @@ import Action from "d2-ui/lib/action/Action"; import listStore from "./list.store"; import detailsStore from "./details.store"; -import { getInstance } from "d2/lib/d2"; import { Observable } from "rx"; const listActions = Action.createActionsFromNames([ diff --git a/src/List/list.store.js b/src/legacy/List/list.store.js similarity index 93% rename from src/List/list.store.js rename to src/legacy/List/list.store.js index 7311f1e..2e478f8 100644 --- a/src/List/list.store.js +++ b/src/legacy/List/list.store.js @@ -1,14 +1,9 @@ -import { getInstance as getD2 } from "d2/lib/d2"; -import { Subject, Observable } from "rx"; import Store from "d2-ui/lib/store/Store"; -import _ from "lodash"; - +import { getInstance as getD2 } from "d2/lib/d2"; +import { Observable, Subject } from "rx"; import appState from "../App/appStateStore"; import { getUserList } from "../models/userList"; -const orderForQuery = modelName => - modelName === "organisationUnitLevel" ? "level:ASC" : "name:iasc"; - export const columns = [ { name: "username", sortable: false }, { name: "firstName", sortable: true }, @@ -28,7 +23,7 @@ const columnObservable = appState .filter(appState => appState.sideBar && appState.sideBar.currentSubSection) .map(appState => appState.sideBar.currentSubSection) .distinctUntilChanged() - .map(subSection => columns); + .map(() => columns); export default Store.create({ listSourceSubject: new Subject(), @@ -95,7 +90,7 @@ export default Store.create({ this.listSourceSubject.onNext(Observable.fromPromise(this.state.pager.getPreviousPage())); }, - filter(options, complete, error) { + filter(options, complete) { getD2().then(d2 => { const { filters, ...listOptions } = options; const listSearchPromise = getUserList(d2, filters, listOptions); diff --git a/src/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js similarity index 79% rename from src/List/organisation-unit-dialog/OrgUnitDialog.component.js rename to src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index c80ab4e..c857778 100644 --- a/src/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -1,23 +1,24 @@ -import React from "react"; +import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; +import _ from "lodash"; import Dialog from "material-ui/Dialog/Dialog"; import FlatButton from "material-ui/FlatButton/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import Toggle from "material-ui/Toggle/Toggle"; -import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; -import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; import PropTypes from "prop-types"; -import _m from "../../utils/lodash-mixins"; +import React from "react"; +import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; import OrgUnitForm from "../../components/OrgUnitForm"; +import _m from "../../utils/lodash-mixins"; class OrgUnitDialog extends React.Component { constructor(props, context) { super(props, context); const modelOptions = { - parentModel: d2.models.users, - childrenModel: d2.models.organisationUnits, + parentModel: this.context.d2.models.users, + childrenModel: this.context.d2.models.organisationUnits, getChildren: user => user[props.field], - getPayload: (allOrgUnits, pairs) => ({ + getPayload: (_allOrgUnits, pairs) => ({ users: pairs.map(([user, orgUnitsForUser]) => _m(getOwnedPropertyJSON(user)) .imerge({ @@ -47,7 +48,7 @@ class OrgUnitDialog extends React.Component { return _.intersectionBy(...objects.map(obj => obj[orgUnitField].toArray()), "id"); } - _renderStrategyToggle() { + _renderStrategyToggle = () => { const { models } = this.props; const { updateStrategy } = this.state; @@ -61,9 +62,7 @@ class OrgUnitDialog extends React.Component { - this.setState({ updateStrategy: newValue ? "replace" : "merge" }) - } + onToggle={(ev, newValue) => this.setState({ updateStrategy: newValue ? "replace" : "merge" })} style={{ width: 300, float: "right", @@ -76,18 +75,23 @@ class OrgUnitDialog extends React.Component { } else { return null; } - } + }; onChange(selected) { this.setState({ selected }); } - save() { + save = () => { const { selected } = this.state; this.setState({ loading: true }); this.model - .save(this.props.models, selected, selected.map(ou => ou.id), this.state.updateStrategy) + .save( + this.props.models, + selected, + selected.map(ou => ou.id), + this.state.updateStrategy + ) .then(() => { this.setState({ loading: false }); this.props.onOrgUnitAssignmentSaved(); @@ -98,10 +102,10 @@ class OrgUnitDialog extends React.Component { this.props.onOrgUnitAssignmentError(err); this.props.onRequestClose(); }); - } + }; - render() { - const { root, title, models, filteringByNameLabel, orgUnitsSelectedLabel } = this.props; + render = () => { + const { title, filteringByNameLabel, orgUnitsSelectedLabel } = this.props; const styles = { dialog: { @@ -113,21 +117,23 @@ class OrgUnitDialog extends React.Component { }, }; - const dialogActions = [ - , - , - ]; - + const dialogActions = ( + + + , + + + ); return ( ); - } + }; } OrgUnitDialog.propTypes = { diff --git a/src/List/organisation-unit-dialog/organisationUnitDialogStore.js b/src/legacy/List/organisation-unit-dialog/organisationUnitDialogStore.js similarity index 100% rename from src/List/organisation-unit-dialog/organisationUnitDialogStore.js rename to src/legacy/List/organisation-unit-dialog/organisationUnitDialogStore.js diff --git a/src/List/replicateUser.store.js b/src/legacy/List/replicateUser.store.js similarity index 100% rename from src/List/replicateUser.store.js rename to src/legacy/List/replicateUser.store.js diff --git a/src/List/userGroups.store.js b/src/legacy/List/userGroups.store.js similarity index 100% rename from src/List/userGroups.store.js rename to src/legacy/List/userGroups.store.js diff --git a/src/List/userRoles.store.js b/src/legacy/List/userRoles.store.js similarity index 100% rename from src/List/userRoles.store.js rename to src/legacy/List/userRoles.store.js diff --git a/src/Snackbar/SnackbarContainer.component.js b/src/legacy/Snackbar/SnackbarContainer.component.js similarity index 72% rename from src/Snackbar/SnackbarContainer.component.js rename to src/legacy/Snackbar/SnackbarContainer.component.js index 4c206dd..df90425 100644 --- a/src/Snackbar/SnackbarContainer.component.js +++ b/src/legacy/Snackbar/SnackbarContainer.component.js @@ -1,22 +1,31 @@ -import React from "react"; +import log from "loglevel"; import Snackbar from "material-ui/Snackbar/Snackbar"; +import React from "react"; import snackStore from "./snack.store"; -import ObserverRegistry from "../utils/ObserverRegistry.mixin"; -import log from "loglevel"; -const SnackBarContainer = React.createClass({ - mixins: [ObserverRegistry], +class SnackBarContainer extends React.Component { + componentWillUnmount = () => { + this.observerDisposables.forEach(disposable => disposable.dispose()); + }; - getInitialState() { - return { + registerDisposable = disposable => { + this.observerDisposables.push(disposable); + }; + + constructor(props, context) { + super(props, context); + + this.state = { show: false, snack: { message: "", }, }; - }, + } + + componentWillMount = () => { + this.observerDisposables = []; - componentWillMount() { const snackStoreDisposable = snackStore.subscribe(snack => { if (snack) { this.setState({ @@ -31,15 +40,15 @@ const SnackBarContainer = React.createClass({ }, log.debug.bind(log)); this.registerDisposable(snackStoreDisposable); - }, + }; - _closeSnackbar() { + _closeSnackbar = () => { this.setState({ show: false, }); - }, + }; - render() { + render = () => { if (!this.state.snack) { return null; } @@ -51,6 +60,7 @@ const SnackBarContainer = React.createClass({ style={{ whiteSpace: "nowrap", zIndex: 1000000 }} bodyStyle={{ maxWidth: "100%" }} contentStyle={{ display: "flex" }} + //eslint-disable-next-line ref="snackbar" message={message} action={action} @@ -60,7 +70,7 @@ const SnackBarContainer = React.createClass({ onRequestClose={this._closeSnackbar} /> ); - }, -}); + }; +} export default SnackBarContainer; diff --git a/src/Snackbar/snack.actions.js b/src/legacy/Snackbar/snack.actions.js similarity index 100% rename from src/Snackbar/snack.actions.js rename to src/legacy/Snackbar/snack.actions.js diff --git a/src/Snackbar/snack.store.js b/src/legacy/Snackbar/snack.store.js similarity index 100% rename from src/Snackbar/snack.store.js rename to src/legacy/Snackbar/snack.store.js diff --git a/src/components/CopyInUserDialog.component.js b/src/legacy/components/CopyInUserDialog.component.js similarity index 98% rename from src/components/CopyInUserDialog.component.js rename to src/legacy/components/CopyInUserDialog.component.js index 5ed163e..a61e9f1 100644 --- a/src/components/CopyInUserDialog.component.js +++ b/src/legacy/components/CopyInUserDialog.component.js @@ -19,7 +19,7 @@ function CopyInUserDialog(props, context) { parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin]", childrenModel: d2.models.users, getChildren: user => user.userCredentials.userRoles, - getPayload: getPayload, + getPayload, }; return ( diff --git a/src/components/Dropdown.component.js b/src/legacy/components/Dropdown.component.js similarity index 64% rename from src/components/Dropdown.component.js rename to src/legacy/components/Dropdown.component.js index 35df520..2db7f73 100644 --- a/src/components/Dropdown.component.js +++ b/src/legacy/components/Dropdown.component.js @@ -1,10 +1,11 @@ -import React from "react"; -import SelectField from "material-ui/SelectField/SelectField"; -import TextField from "material-ui/TextField"; import isString from "d2-utilizr/lib/isString"; import Dialog from "material-ui/Dialog"; import FlatButton from "material-ui/FlatButton"; import MenuItem from "material-ui/MenuItem/MenuItem"; +import SelectField from "material-ui/SelectField/SelectField"; +import TextField from "material-ui/TextField"; +import PropTypes from "prop-types"; +import React from "react"; /* Selector wrapper. When options.length < props.limit -> show a normal SelectField, @@ -20,20 +21,19 @@ class Dropdown extends React.Component { this.closeDialog = this.closeDialog.bind(this); this.state = { - value: - this.props.value !== undefined && this.props.value !== null ? this.props.value : "", + value: this.props.value !== undefined && this.props.value !== null ? this.props.value : "", options: this.getOptions(this.props.options, this.props.isRequired), dialogOpen: false, }; } - componentWillReceiveProps(newProps) { + componentWillReceiveProps = newProps => { this.setState({ options: this.getOptions(newProps.options, newProps.isRequired), }); - } + }; - getOptions(options, required = false) { + getOptions = options => { let opts = options.map(option => { return { value: option.value, @@ -43,37 +43,33 @@ class Dropdown extends React.Component { return opts.map(option => { if (option.text && this.props.translateOptions) { - option.text = isString(option.text) - ? this.getTranslation(option.text.toLowerCase()) - : option.text; + option.text = isString(option.text) ? this.getTranslation(option.text.toLowerCase()) : option.text; } return option; }); - } + }; - _onChange(event, index, value) { + _onChange = (event, index, value) => { this.props.onChange({ target: { value, }, }); - } + }; - openDialog() { + openDialog = () => { this.setState({ dialogOpen: true, filterText: "" }); - } + }; - closeDialog() { + closeDialog = () => { this.setState({ dialogOpen: false }); - } + }; - getOptionText(value) { - return value && this.state.options.length - ? this.state.options.find(option => option.value === value).text - : ""; - } + getOptionText = value => { + return value && this.state.options.length ? this.state.options.find(option => option.value === value).text : ""; + }; - renderDialogOption(value, label) { + renderDialogOption = (value, label) => { return (
- {label} +
{label}
); - } + }; - render() { - const { - onFocus, - onBlur, - labelText, - modelDefinition, - models, - referenceType, - referenceProperty, - isInteger, - translateOptions, - isRequired, - options, - model, - limit, - fullWidth, - translateLabel, - ...other - } = this.props; + render = () => { + const { labelText, limit, fullWidth, ...other } = this.props; return this.state.options.length > limit ? (
@@ -116,12 +95,7 @@ class Dropdown extends React.Component { onRequestClose={this.closeDialog} autoScrollBodyContent autoDetectWindowHeight - actions={[ - , - ]} + actions={} > - {!this.props.isRequired && - this.renderDialogOption(null, this.getTranslation("no_value"))} + {!this.props.isRequired && this.renderDialogOption(null, this.getTranslation("no_value"))} {this.state.options .filter( o => @@ -140,9 +113,7 @@ class Dropdown extends React.Component { .trim() .toLocaleLowerCase() .split(" ") - .every(f => - o.text.toLocaleLowerCase().includes(f.toLocaleLowerCase()) - ) + .every(f => o.text.toLocaleLowerCase().includes(f.toLocaleLowerCase())) ) .map(o => this.renderDialogOption(o.value, o.text))} @@ -173,16 +144,11 @@ class Dropdown extends React.Component { {this.renderOptions()} ); - } + }; - renderOptions() { + renderOptions = () => { const options = this.state.options.map((option, index) => ( - + )); if (!this.props.isRequired) { @@ -190,32 +156,23 @@ class Dropdown extends React.Component { // For this value we pass an empty label to not show the label no_value // when this option is selected. options.unshift([ - , + , ]); } return options; - } + }; } Dropdown.propTypes = { - defaultValue: React.PropTypes.oneOfType([ - React.PropTypes.string, - React.PropTypes.number, - React.PropTypes.bool, - ]), - onFocus: React.PropTypes.func, - onBlur: React.PropTypes.func, - options: React.PropTypes.array.isRequired, - isRequired: React.PropTypes.bool, - labelText: React.PropTypes.string.isRequired, - translateOptions: React.PropTypes.bool, - limit: React.PropTypes.number, + defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]), + onFocus: PropTypes.func, + onBlur: PropTypes.func, + options: PropTypes.array.isRequired, + isRequired: PropTypes.bool, + labelText: PropTypes.string.isRequired, + translateOptions: PropTypes.bool, + limit: PropTypes.number, }; Dropdown.defaultProps = { @@ -223,7 +180,7 @@ Dropdown.defaultProps = { }; Dropdown.contextTypes = { - d2: React.PropTypes.any, + d2: PropTypes.any, }; export default Dropdown; diff --git a/src/components/FilteredMultiSelect.component.js b/src/legacy/components/FilteredMultiSelect.component.js similarity index 98% rename from src/components/FilteredMultiSelect.component.js rename to src/legacy/components/FilteredMultiSelect.component.js index f514474..bc2b03a 100644 --- a/src/components/FilteredMultiSelect.component.js +++ b/src/legacy/components/FilteredMultiSelect.component.js @@ -27,7 +27,7 @@ class FilteredMultiSelectComponent extends React.Component { this.setState({ filterText: event.target.value }); } - render() { + render = () => { const { options, selected, onChange } = this.props; const { filterText } = this.state; @@ -50,7 +50,7 @@ class FilteredMultiSelectComponent extends React.Component { />
); - } + }; } FilteredMultiSelectComponent.propTypes = { diff --git a/src/components/ImportExport.component.js b/src/legacy/components/ImportExport.component.js similarity index 82% rename from src/components/ImportExport.component.js rename to src/legacy/components/ImportExport.component.js index 535424b..2a0b5dd 100644 --- a/src/components/ImportExport.component.js +++ b/src/legacy/components/ImportExport.component.js @@ -24,7 +24,7 @@ class ImportExport extends React.Component { maxUsers: PropTypes.number.isRequired, settings: PropTypes.object.isRequired, allColumns: PropTypes.arrayOf( - React.PropTypes.shape({ + PropTypes.shape({ text: PropTypes.string.isRequired, value: PropTypes.string.isRequired, }) @@ -81,7 +81,7 @@ class ImportExport extends React.Component { this.setState({ isProcessing: true }); try { - const csvString = await exportTemplateToCsv(d2); + const csvString = await exportTemplateToCsv(this.props.d2); this.saveCsv(csvString, "empty-user-template"); } finally { this.closeMenu(); @@ -104,7 +104,7 @@ class ImportExport extends React.Component { fileDialog({ accept: ".csv" }) .then(files => { this.setState({ isProcessing: true }); - return importFromCsv(d2, files[0], { maxUsers, orgUnitsField }); + return importFromCsv(this.props.d2, files[0], { maxUsers, orgUnitsField }); }) .then(result => onImport(result)) .catch(err => snackActions.show({ message: err.toString() })) @@ -114,25 +114,14 @@ class ImportExport extends React.Component { }); }; - render() { - const { d2 } = this.props; + render = () => { const { isMenuOpen, anchorEl, isProcessing } = this.state; - const { - popoverConfig, - closeMenu, - importFromCsv, - exportToCsvAndSave, - exportEmptyTemplate, - } = this; + const { popoverConfig, closeMenu, importFromCsv, exportToCsvAndSave, exportEmptyTemplate } = this; const { t } = this; return (
- + @@ -146,16 +135,8 @@ class ImportExport extends React.Component { onRequestClose={closeMenu} > - } - primaryText={t("import")} - onClick={importFromCsv} - /> - } - primaryText={t("export")} - onClick={exportToCsvAndSave} - /> + } primaryText={t("import")} onClick={importFromCsv} /> + } primaryText={t("export")} onClick={exportToCsvAndSave} /> } primaryText={t("export_empty_template")} @@ -165,7 +146,7 @@ class ImportExport extends React.Component {
); - } + }; } export default ImportExport; diff --git a/src/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js similarity index 83% rename from src/components/ImportTable.component.js rename to src/legacy/components/ImportTable.component.js index 3b39d74..f80b661 100644 --- a/src/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -1,40 +1,29 @@ -import React from "react"; -import _ from "lodash"; -import memoize from "memoize-weak"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import PropTypes from "prop-types"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import TextField from "material-ui/TextField/TextField"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import { - Table, - TableBody, - TableHeader, - TableHeaderColumn, - TableRow, - TableRowColumn, -} from "material-ui/Table"; -import Chip from "material-ui/Chip"; -import Toggle from "material-ui/Toggle/Toggle"; -import Validators from "d2-ui/lib/forms/Validators"; import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; +import Validators from "d2-ui/lib/forms/Validators"; +import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; import { generateUid } from "d2/lib/uid"; import { OrderedMap } from "immutable"; +import _ from "lodash"; +import Chip from "material-ui/Chip"; +import Dialog from "material-ui/Dialog/Dialog"; +import FlatButton from "material-ui/FlatButton/FlatButton"; import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; - -import { toBuilderValidator, validateUsername, validatePassword } from "../utils/validators"; -import User from "../models/user"; -import { getExistingUsers, fieldImportSuffix } from "../models/userHelpers"; -import snackActions from "../Snackbar/snack.actions"; -import ModalLoadingMask from "./ModalLoadingMask.component"; +import RaisedButton from "material-ui/RaisedButton/RaisedButton"; +import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn } from "material-ui/Table"; +import TextField from "material-ui/TextField/TextField"; +import Toggle from "material-ui/Toggle/Toggle"; +import memoize from "memoize-weak"; +import PropTypes from "prop-types"; +import React from "react"; import LoadingMask from "../loading-mask/LoadingMask.component"; +import { fieldImportSuffix, getExistingUsers } from "../models/userHelpers"; +import { getModelValuesByField, getOrgUnitsRoots } from "../utils/dhis2Helpers"; +import { getCompactTextForModels } from "../utils/i18n"; +import { toBuilderValidator, validatePassword, validateUsername } from "../utils/validators"; import InfoDialog from "./InfoDialog"; +import ModalLoadingMask from "./ModalLoadingMask.component"; import MultipleSelector from "./MultipleSelector.component"; -import { getModelValuesByField } from "../utils/dhis2Helpers"; -import { getCompactTextForModels } from "../utils/i18n"; -import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; const styles = { dialog: { @@ -124,12 +113,22 @@ class ImportTable extends React.Component { this.getFieldsInfo = memoize(this.getFieldsInfo.bind(this)); this.getRemoveRowHandler = memoize(userId => () => this.removeRow(userId)); - this.getOnUpdateField = memoize(userId => (...args) => this.onUpdateField(userId, ...args)); - this.getOnUpdateFormStatus = memoize(userId => (...args) => - this.onUpdateFormStatus(userId, ...args) + this.getOnUpdateField = memoize( + userId => + (...args) => + this.onUpdateField(userId, ...args) + ); + this.getOnUpdateFormStatus = memoize( + userId => + (...args) => + this.onUpdateFormStatus(userId, ...args) ); this.getActionsByState = memoize(this.getActionsByState.bind(this)); - this.getOnTextFieldClicked = memoize((...args) => ev => this.onTextFieldClicked(...args)); + this.getOnTextFieldClicked = memoize( + (...args) => + () => + this.onTextFieldClicked(...args) + ); this.fieldsInfo = this.getFieldsInfo(); this.usersValidation = {}; // {USER_ID: true | false} @@ -150,7 +149,7 @@ class ImportTable extends React.Component { }; } - async componentDidMount() { + componentDidMount = async () => { const { d2 } = this.context; const { users: usersArray, columns } = this.props; @@ -174,36 +173,29 @@ class ImportTable extends React.Component { modelValuesByField, orgUnitRoots, }); - } + }; - getActionsByState(allowOverwrite, showOverwriteToggle, showProcessButton) { + getActionsByState = (allowOverwrite, showOverwriteToggle, showProcessButton) => { const { onRequestClose, actionText, templateUser } = this.props; - return _.compact([ - showOverwriteToggle && !templateUser && ( - - ), - , - , - ]); - } + return ( + + {showOverwriteToggle && !templateUser && ( + + )} + + + + ); + }; - getUser(userId) { + getUser = userId => { const { users } = this.state; const user = users.get(userId); @@ -212,20 +204,20 @@ class ImportTable extends React.Component { } else { throw new Error("Cannot get user with ID: " + userId); } - } + }; // FormBuilder usually validates only the current field, which is faster, but sometimes we // need to validate the form builder (i.e. checking uniqueness of fields). Call this method // whenever you want to fully validate the form. - validateOnNextRender(toValidate = true) { + validateOnNextRender = (toValidate = true) => { this.validateOnRender = toValidate; - } + }; - shouldValidateOnNextRender() { + shouldValidateOnNextRender = () => { return this.validateOnRender; - } + }; - onUpdateField(userId, name, value) { + onUpdateField = (userId, name, value) => { const { users } = this.state; const user = this.getUser(userId); // Clear import warnings on field update @@ -234,9 +226,7 @@ class ImportTable extends React.Component { const newUsers = users.set(userId, { ...user, [name]: value, - ...(fieldHasImportData - ? { [importField]: { ...user[importField], hasDuplicates: false } } - : {}), + ...(fieldHasImportData ? { [importField]: { ...user[importField], hasDuplicates: false } } : {}), }); const validators = (this.getFieldsInfo()[name] || {}).validators || []; // Force re-render if validations change so new error messages are shown @@ -256,9 +246,9 @@ class ImportTable extends React.Component { if (name === "username") { this.validateOnNextRender(); } - } + }; - onUpdateFormStatus(userId, formStatus) { + onUpdateFormStatus = (userId, formStatus) => { const { users } = this.state; const { usersValidation } = this; const isValid = !formStatus.asyncValidating && formStatus.valid; @@ -266,9 +256,9 @@ class ImportTable extends React.Component { this.usersValidation = newUsersValidation; const areUsersValid = users.keySeq().every(userId => newUsersValidation[userId]); this.setState({ areUsersValid }); - } + }; - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate = (nextProps, nextState) => { /* Problem: Without a custom shouldComponentUpdate, any change of a form field issues a re-render of the whole table. @@ -301,45 +291,41 @@ class ImportTable extends React.Component { ); return updateFromProps || updateFromState; - } + }; closeInfoDialog = () => { this.setState({ infoDialog: null }); }; - getUsersWithExistingUsername(users, existingUsernames) { + getUsersWithExistingUsername = (users, existingUsernames) => { return _(users.valueSeq().toJS()) .filter(user => existingUsernames.has(user.username)) .map("id") .value(); - } + }; - getUsersWithDuplicatedUsername(users) { + getUsersWithDuplicatedUsername = users => { return _(users.valueSeq().toJS()) .groupBy("username") - .flatMap((usersWithUsername, username) => - usersWithUsername.length > 1 ? usersWithUsername : [] - ) + .flatMap(usersWithUsername => (usersWithUsername.length > 1 ? usersWithUsername : [])) .map("id") .value(); - } + }; - getUsernamesInTable({ skipId } = {}) { + getUsernamesInTable = ({ skipId } = {}) => { const { users } = this.state; const usernames = _(users.valueSeq().toJS()) .map(user => (user.id !== skipId ? user.username : null)) .compact() .value(); return new Set(usernames); - } + }; - getInvalidUsernames() { - return new Set( - Array.from(this.state.existingUsernames).concat(Array.from(this.getUsernamesInTable())) - ); - } + getInvalidUsernames = () => { + return new Set(Array.from(this.state.existingUsernames).concat(Array.from(this.getUsernamesInTable()))); + }; - getFieldsInfo() { + getFieldsInfo = () => { const validators = { isRequired: { validator: Validators.isRequired, @@ -365,7 +351,7 @@ class ImportTable extends React.Component { const allowEmptyPassword = existingUsernames.has(users.get(userId).username); return validatePassword(password, { allowEmpty: allowEmptyPassword }); }, - (password, error) => this.t(`password_${error}`) + (_password, error) => this.t(`password_${error}`) ), importWarnings: objField => toBuilderValidator( @@ -377,7 +363,7 @@ class ImportTable extends React.Component { const { hasDuplicates } = user[field] || {}; return hasDuplicates ? { isValid: false } : isValid; }, - (_value, error) => this.t("multiple_matches") + () => this.t("multiple_matches") ), }; @@ -393,14 +379,14 @@ class ImportTable extends React.Component { }, _default: { validators: [] }, }; - } + }; - getColumns() { + getColumns = () => { return this.props.columns; - } + }; onTextFieldClicked = (userId, field) => { - const { users, modelValuesByField } = this.state; + const { modelValuesByField } = this.state; const options = modelValuesByField[field]; const user = this.getUser(userId); const selected = user[field] || []; @@ -410,7 +396,7 @@ class ImportTable extends React.Component { }); }; - getTextField(name, value, { validators, component, extraProps }) { + getTextField = (name, value, { validators, component, extraProps }) => { return { name, value: value || "", @@ -418,15 +404,10 @@ class ImportTable extends React.Component { props: { name, type: "string", style: { width: "100%" }, ...extraProps }, validators, }; - } + }; - getFields(user) { - const relationshipFields = [ - "userRoles", - "userGroups", - "organisationUnits", - "dataViewOrganisationUnits", - ]; + getFields = user => { + const relationshipFields = ["userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits"]; const orgUnitsField = this.props.settings.get("organisationUnitsField"); @@ -435,9 +416,7 @@ class ImportTable extends React.Component { const validators = (this.fieldsInfo[field] || this.fieldsInfo._default).validators; const isMultipleValue = relationshipFields.includes(field); const displayField = - field === "organisationUnits" || field === "dataViewOrganisationUnits" - ? orgUnitsField - : "displayName"; + field === "organisationUnits" || field === "dataViewOrganisationUnits" ? orgUnitsField : "displayName"; if (isMultipleValue) { const values = value || []; @@ -448,9 +427,7 @@ class ImportTable extends React.Component { limit: 1, field: displayField, }); - const hoverText = _(values) - .map(displayField) - .join(", "); + const hoverText = _(values).map(displayField).join(", "); const onClick = this.getOnTextFieldClicked(user.id, field); return this.getTextField(field, compactValue, { @@ -488,19 +465,16 @@ class ImportTable extends React.Component { }); } }); - } + }; addRow = () => { const { templateUser } = this.props; const { users } = this.state; - const { usersValidation } = this; let newUser; if (templateUser) { const invalidUsernames = this.getInvalidUsernames(); - const index = _.range(1, 1000).find( - i => !invalidUsernames.has(`${templateUser.username}_${i}`) - ); + const index = _.range(1, 1000).find(i => !invalidUsernames.has(`${templateUser.username}_${i}`)); newUser = { id: generateUid(), username: `${templateUser.username}_${index}`, @@ -529,14 +503,12 @@ class ImportTable extends React.Component { const { usersValidation } = this; this.setState({ users: users.remove(userId) }); - this.usersValidation = _(usersValidation) - .omit(userId) - .value(); + this.usersValidation = _(usersValidation).omit(userId).value(); this.validateOnNextRender(); }; renderTableRow = ({ id: userId, children }) => { - const { users, existingUsers, existingUsernames, allowOverwrite } = this.state; + const { users, existingUsers, allowOverwrite } = this.state; const user = this.getUser(userId); const index = users.keySeq().findIndex(_userId => _userId === userId); const existingUser = existingUsers[user.username]; @@ -568,23 +540,22 @@ class ImportTable extends React.Component { ); }; - componentDidUpdate() { + componentDidUpdate = () => { // After a render, unset validateOnRender to avoid infinite loops of FormBuilder render/validation this.validateOnNextRender(this.state.isLoading); - } + }; - renderTableRowColumn({ children }) { + renderTableRowColumn = ({ children }) => { return {children}; - } + }; - renderTable() { + renderTable = () => { const { d2 } = this.context; const { users } = this.state; const { maxUsers } = this.props; const canAddNewUser = users.size < maxUsers; const headers = this.getColumns().map(camelCaseToUnderscores); - const getColumnName = header => - _(d2.i18n.translations).has(header) ? this.t(header) : header; + const getColumnName = header => (_(d2.i18n.translations).has(header) ? this.t(header) : header); return (
@@ -625,15 +596,11 @@ class ImportTable extends React.Component {
- +
); - } + }; onSave = async () => { const { users } = this.state; @@ -670,7 +637,7 @@ class ImportTable extends React.Component { this.setState({ multipleSelector: null }); }; - renderDialogTitle() { + renderDialogTitle = () => { const { title, warnings } = this.props; const errorsCount = _(this.usersValidation) .values() @@ -687,9 +654,7 @@ class ImportTable extends React.Component { ..._(warnings) .take(maxWarnings) .map((line, idx) => `${idx + 1}. ${line}`), - hiddenWarnings > 0 - ? this.t("and_n_more_warnings", { n: hiddenWarnings }) - : null, + hiddenWarnings > 0 ? this.t("and_n_more_warnings", { n: hiddenWarnings }) : null, ]) .compact() .join("\n"); @@ -709,32 +674,21 @@ class ImportTable extends React.Component { )}
); - } + }; - getDuplicatedUsernamesExist(users, existingUsernames) { + getDuplicatedUsernamesExist = (users, existingUsernames) => { return users.valueSeq().some(user => existingUsernames.has(user.username)); - } + }; - render() { - const { onRequestClose, onSave } = this.props; - const { - infoDialog, - users, - isLoading, - existingUsernames, - allowOverwrite, - areUsersValid, - isImporting, - } = this.state; - const { multipleSelector, modelValuesByField, orgUnitRoots } = this.state; + render = () => { + const { onRequestClose } = this.props; + const { infoDialog, users, isLoading, existingUsernames, allowOverwrite, areUsersValid, isImporting } = + this.state; + const { multipleSelector, orgUnitRoots } = this.state; const duplicatedUsernamesExist = this.getDuplicatedUsernamesExist(users, existingUsernames); const showProcessButton = !users.isEmpty() && areUsersValid; - const actions = this.getActionsByState( - allowOverwrite, - duplicatedUsernamesExist, - showProcessButton - ); + const actions = this.getActionsByState(allowOverwrite, duplicatedUsernamesExist, showProcessButton); const dialogTitle = this.renderDialogTitle(); return ( @@ -775,7 +729,7 @@ class ImportTable extends React.Component { )} ); - } + }; } ImportTable.contextTypes = { diff --git a/src/components/InfoDialog.js b/src/legacy/components/InfoDialog.js similarity index 77% rename from src/components/InfoDialog.js rename to src/legacy/components/InfoDialog.js index b2d67ed..0df8f15 100644 --- a/src/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -1,10 +1,10 @@ -import React from "react"; -import PropTypes from "prop-types"; +import _ from "lodash"; +import { merge } from "lodash/fp"; import Dialog from "material-ui/Dialog/Dialog"; -import stylePropType from "react-style-proptype"; import FlatButton from "material-ui/FlatButton/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import { merge } from "lodash/fp"; +import PropTypes from "prop-types"; +import React from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; const styles = { @@ -21,7 +21,7 @@ function prettyJson(obj) { return obj ? JSON.stringify(obj, null, 2) : null; } -const InfoDialog = ({ t, title, style, onClose, response, children }) => { +const InfoDialog = ({ t, title, style, onClose, response }) => { const details = _([ t("metadata_error_description"), response.error || "Unknown error", @@ -31,13 +31,15 @@ const InfoDialog = ({ t, title, style, onClose, response, children }) => { .compact() .join("\n\n"); - const actions = [ - - - , - - , - ]; + const actions = ( + + + + + , + , + + ); return ( { this.state.availableStore.setState(nextProps.options); this.state.assignedStore.setState(nextProps.selected); - }, + }; - _onItemAssigned(newItems) { + _onItemAssigned = newItems => { const assigned = this.state.assignedStore.state.concat(newItems); this.state.assignedStore.setState(assigned); this.props.onChange(assigned); return Promise.resolve(); - }, + }; - _onItemRemoved(removedItems) { + _onItemRemoved = removedItems => { const assigned = _.difference(this.state.assignedStore.state, removedItems); this.state.assignedStore.setState(assigned); this.props.onChange(assigned); return Promise.resolve(); - }, + }; - _onOrderChanged(assigned) { + _onOrderChanged = assigned => { this.state.assignedStore.setState(assigned); this.props.onChange(assigned); return Promise.resolve(); - }, + }; - render() { + render = () => { const { errors, label, sortable, height, filterText } = this.props; const { styles } = this; const SelectedGroupEditor = sortable ? GroupEditorWithOrdering : GroupEditor; @@ -104,7 +105,7 @@ const MultiSelect = React.createClass({ />
); - }, -}); + }; +} export default MultiSelect; diff --git a/src/components/MultipleFilter.component.js b/src/legacy/components/MultipleFilter.component.js similarity index 81% rename from src/components/MultipleFilter.component.js rename to src/legacy/components/MultipleFilter.component.js index 3103cc7..f05f755 100644 --- a/src/components/MultipleFilter.component.js +++ b/src/legacy/components/MultipleFilter.component.js @@ -1,11 +1,11 @@ -import React from "react"; -import PropTypes from "prop-types"; -import TextField from "material-ui/TextField"; +import _ from "lodash"; import Dialog from "material-ui/Dialog"; import FlatButton from "material-ui/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; - -import FilteredMultiSelect from "../components/FilteredMultiSelect.component"; +import TextField from "material-ui/TextField"; +import PropTypes from "prop-types"; +import React from "react"; +import FilteredMultiSelect from "./FilteredMultiSelect.component"; class MultipleFilter extends React.Component { constructor(props, context) { @@ -46,58 +46,51 @@ class MultipleFilter extends React.Component { this.fieldValue = this.getCompactFieldValue(newProps.options, newProps.selected); } - openDialog() { + openDialog = () => { this.setState({ dialogOpen: true, selected: this.props.selected }); - } + }; - closeDialog() { + closeDialog = () => { this.setState({ dialogOpen: false }); - } + }; onChange(selected) { this.setState({ selected }); } - applyAndClose() { + applyAndClose = () => { this.props.onChange(this.state.selected); this.closeDialog(); - } + }; - getDialogButtons() { - return [ - , - , - ]; - } + getDialogButtons = () => { + return ( + + + , + , + + ); + }; getCompactFieldValue(options, selected, limit = 3) { - const names = _(options) - .keyBy("value") - .at(selected) - .map("text") - .value(); + const names = _(options).keyBy("value").at(selected).map("text").value(); if (names.length <= limit) { return names.join(", "); } else { return this.getTranslation("this_and_n_others_compact", { - this: _(names) - .take(limit) - .join(", "), + this: _(names).take(limit).join(", "), n: names.length - limit, }); } } - render() { + render = () => { const { title, options, styles } = this.props; const { dialogOpen, selected } = this.state; const { dialogButtons } = this; @@ -131,7 +124,7 @@ class MultipleFilter extends React.Component { />
); - } + }; } MultipleFilter.propTypes = { @@ -143,7 +136,7 @@ MultipleFilter.propTypes = { }; MultipleFilter.contextTypes = { - d2: React.PropTypes.any, + d2: PropTypes.any, }; export default MultipleFilter; diff --git a/src/components/MultipleSelector.component.js b/src/legacy/components/MultipleSelector.component.js similarity index 83% rename from src/components/MultipleSelector.component.js rename to src/legacy/components/MultipleSelector.component.js index 94fc6ac..fb15361 100644 --- a/src/components/MultipleSelector.component.js +++ b/src/legacy/components/MultipleSelector.component.js @@ -1,13 +1,12 @@ import React from "react"; import PropTypes from "prop-types"; -import TextField from "material-ui/TextField"; import Dialog from "material-ui/Dialog"; import FlatButton from "material-ui/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import OrgUnitForm from "./OrgUnitForm"; import _ from "lodash"; -import FilteredMultiSelect from "../components/FilteredMultiSelect.component"; +import FilteredMultiSelect from "./FilteredMultiSelect.component"; class MultipleSelector extends React.Component { constructor(props, context) { @@ -37,11 +36,7 @@ class MultipleSelector extends React.Component { onMultiSelectChange = selectedIds => { const { options } = this.props; - const selected = _(options) - .keyBy("id") - .at(selectedIds) - .compact() - .value(); + const selected = _(options).keyBy("id").at(selectedIds).compact().value(); this.setState({ selected }); }; @@ -60,20 +55,19 @@ class MultipleSelector extends React.Component { this.props.onClose(); }; - getDialogButtons() { - return [ - , - , - ]; - } + getDialogButtons = () => { + return ( + + + , + , + + ); + }; titleByField = { userGroups: "assign_groups", @@ -82,18 +76,16 @@ class MultipleSelector extends React.Component { dataViewOrganisationUnits: "assign_to_org_units_output", }; - renderForm() { + renderForm = () => { const { field, options, orgUnitRoots } = this.props; const { selected } = this.state; const t = this.getTranslation.bind(this); switch (field) { case "userGroups": - case "userRoles": + case "userRoles": { const selectOptions = options.map(o => ({ value: o.id, text: o.displayName })); - const selectedIds = _(selected) - .map("id") - .value(); + const selectedIds = _(selected).map("id").value(); return ( ); + } case "organisationUnits": return ( { const { field } = this.props; const title = this.getTranslation(this.titleByField[field]); @@ -149,7 +142,7 @@ class MultipleSelector extends React.Component { {this.renderForm()} ); - } + }; } MultipleSelector.propTypes = { @@ -166,7 +159,7 @@ MultipleSelector.defaultProps = { }; MultipleSelector.contextTypes = { - d2: React.PropTypes.any, + d2: PropTypes.any, }; export default MultipleSelector; diff --git a/src/components/OrgUnitForm.js b/src/legacy/components/OrgUnitForm.js similarity index 90% rename from src/components/OrgUnitForm.js rename to src/legacy/components/OrgUnitForm.js index 1ecbabc..cfff026 100644 --- a/src/components/OrgUnitForm.js +++ b/src/legacy/components/OrgUnitForm.js @@ -32,7 +32,7 @@ class OrgUnitForm extends React.Component { this.onChange = this.onChange.bind(this); } - componentWillMount() { + componentWillMount = () => { const d2 = this.context.d2; Promise.all([ @@ -76,11 +76,11 @@ class OrgUnitForm extends React.Component { .subscribe(orgUnits => { this.setState({ rootOrgUnits: orgUnits }); }); - } + }; - componentWillUnmount() { + componentWillUnmount = () => { this.disposable && this.disposable.unsubscribe(); - } + }; async onChange(orgUnitsPaths) { const { d2 } = this.context; @@ -94,18 +94,14 @@ class OrgUnitForm extends React.Component { } toggleOrgUnit(ev, orgUnitModel) { - const orgUnit = _(orgUnitModel) - .pick(["id", "shortName", "path", "displayName"]) - .value(); - const newSelected = _(this.props.selected).find( - selectedOu => selectedOu.path === orgUnit.path - ) + const orgUnit = _(orgUnitModel).pick(["id", "shortName", "path", "displayName"]).value(); + const newSelected = _(this.props.selected).find(selectedOu => selectedOu.path === orgUnit.path) ? this.props.selected.filter(selectedOu => selectedOu.path !== orgUnit.path) : this.props.selected.concat([orgUnit]); this.props.onChange(newSelected); } - renderRoots() { + renderRoots = () => { const selectedPaths = this.props.selected.map(ou => ou.path); if (this.state.rootOrgUnits.length) { @@ -126,20 +122,15 @@ class OrgUnitForm extends React.Component { } return
{this.context.d2.i18n.getTranslation("no_roots_found")}
; - } + }; - render() { + render = () => { if (!this.state.rootOrgUnits) { + //eslint-disable-next-line return
this.context.d2.i18n.getTranslation('determining_your_root_orgunits')
; } - const { - root, - models, - intersectionPolicy, - filteringByNameLabel, - orgUnitsSelectedLabel, - } = this.props; + const { intersectionPolicy, filteringByNameLabel, orgUnitsSelectedLabel } = this.props; const styles = { wrapper: { position: "relative", @@ -175,9 +166,7 @@ class OrgUnitForm extends React.Component {
- ) : ( - undefined - )} + ) : undefined} this._searchOrganisationUnits(event.target.value)} @@ -199,10 +188,7 @@ class OrgUnitForm extends React.Component { onUpdateSelection={this.onChange} />
- +
@@ -211,7 +197,7 @@ class OrgUnitForm extends React.Component { {this.renderRoots()}
); - } + }; } OrgUnitForm.propTypes = { diff --git a/src/components/OrgUnitsFilter.component.js b/src/legacy/components/OrgUnitsFilter.component.js similarity index 81% rename from src/components/OrgUnitsFilter.component.js rename to src/legacy/components/OrgUnitsFilter.component.js index 66befd5..493f261 100644 --- a/src/components/OrgUnitsFilter.component.js +++ b/src/legacy/components/OrgUnitsFilter.component.js @@ -1,12 +1,10 @@ -import React from "react"; -import PropTypes from "prop-types"; -import TextField from "material-ui/TextField"; +import _ from "lodash"; import Dialog from "material-ui/Dialog"; import FlatButton from "material-ui/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import last from "lodash/fp/last"; - -import FilteredMultiSelect from "../components/FilteredMultiSelect.component"; +import TextField from "material-ui/TextField"; +import PropTypes from "prop-types"; +import React from "react"; import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; import OrgUnitForm from "./OrgUnitForm"; @@ -43,46 +41,44 @@ class OrgUnitsFilter extends React.Component { }, }; - componentDidMount() { + componentDidMount = () => { return getOrgUnitsRoots().then(roots => this.setState({ roots })); - } + }; componentWillReceiveProps(newProps) { - if (newProps.selected !== this.props.selected) - this.fieldValue = this.getCompactFieldValue(newProps.selected); + if (newProps.selected !== this.props.selected) this.fieldValue = this.getCompactFieldValue(newProps.selected); } - openDialog() { + openDialog = () => { this.setState({ dialogOpen: true, selected: this.props.selected }); - } + }; - closeDialog() { + closeDialog = () => { this.setState({ dialogOpen: false }); - } + }; onChange(selected) { this.setState({ selected }); } - applyAndClose() { + applyAndClose = () => { this.props.onChange(this.state.selected); this.closeDialog(); - } + }; - getDialogButtons() { - return [ - , - , - ]; - } + getDialogButtons = () => { + return ( + + + , + , + + ); + }; getCompactFieldValue(selected, { limit = 3 } = {}) { const names = selected.map(ou => ou.displayName); @@ -91,17 +87,15 @@ class OrgUnitsFilter extends React.Component { return names.join(", "); } else { return this.getTranslation("this_and_n_others_compact", { - this: _(names) - .take(limit) - .join(", "), + this: _(names).take(limit).join(", "), n: names.length - limit, }); } } - render() { + render = () => { const { title, styles } = this.props; - const { dialogOpen, selected } = this.state; + const { dialogOpen } = this.state; const t = this.getTranslation.bind(this); return ( @@ -144,7 +138,7 @@ class OrgUnitsFilter extends React.Component { /> ); - } + }; } OrgUnitsFilter.propTypes = { @@ -155,7 +149,7 @@ OrgUnitsFilter.propTypes = { }; OrgUnitsFilter.contextTypes = { - d2: React.PropTypes.any, + d2: PropTypes.any, }; export default OrgUnitsFilter; diff --git a/src/components/ReplicateUserFromTable.component.js b/src/legacy/components/ReplicateUserFromTable.component.js similarity index 89% rename from src/components/ReplicateUserFromTable.component.js rename to src/legacy/components/ReplicateUserFromTable.component.js index 12baf74..895ed12 100644 --- a/src/components/ReplicateUserFromTable.component.js +++ b/src/legacy/components/ReplicateUserFromTable.component.js @@ -1,10 +1,9 @@ -import React from "react"; import PropTypes from "prop-types"; -import snackActions from "../Snackbar/snack.actions"; - +import React from "react"; +import LoadingMask from "../loading-mask/LoadingMask.component"; import User from "../models/user"; +import snackActions from "../Snackbar/snack.actions"; import ImportTable from "./ImportTable.component"; -import LoadingMask from "../loading-mask/LoadingMask.component"; class ReplicateUserFromTable extends React.Component { columns = [ @@ -27,11 +26,11 @@ class ReplicateUserFromTable extends React.Component { }; } - async componentDidMount() { + componentDidMount = async () => { const { userToReplicateId } = this.props; - const userToReplicate = await User.getById(d2, userToReplicateId); + const userToReplicate = await User.getById(this.context.d2, userToReplicateId); this.setState({ userToReplicate }); - } + }; replicateUsers = async users => { const { userToReplicate } = this.state; @@ -49,13 +48,11 @@ class ReplicateUserFromTable extends React.Component { } }; - render() { + render = () => { const { onRequestClose } = this.props; const { userToReplicate } = this.state; const title = this.t("replicate_user_title", { - user: userToReplicate - ? `${userToReplicate.displayName} (${userToReplicate.username})` - : "", + user: userToReplicate ? `${userToReplicate.displayName} (${userToReplicate.username})` : "", }); return !userToReplicate ? ( @@ -72,7 +69,7 @@ class ReplicateUserFromTable extends React.Component { settings={this.props.settings} /> ); - } + }; } ReplicateUserFromTable.contextTypes = { diff --git a/src/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js similarity index 83% rename from src/components/ReplicateUserFromTemplate.component.js rename to src/legacy/components/ReplicateUserFromTemplate.component.js index 5453668..df627e3 100644 --- a/src/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -9,12 +9,7 @@ import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; import Validators from "d2-ui/lib/forms/Validators"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import { - toBuilderValidator, - validateValues, - validateUsername, - validatePassword, -} from "../utils/validators"; +import { toBuilderValidator, validateValues, validateUsername, validatePassword } from "../utils/validators"; import User from "../models/user"; import { getExistingUsers } from "../models/userHelpers"; import { getFromTemplate } from "../utils/template"; @@ -53,11 +48,11 @@ class ReplicateUserFromTemplate extends React.Component { }; } - async componentDidMount() { + componentDidMount = async () => { const { userToReplicateId } = this.props; - const existingUsers = await getExistingUsers(d2); + const existingUsers = await getExistingUsers(this.context.d2); const existingUsernames = new Set(existingUsers.map(user => user.userCredentials.username)); - const userToReplicate = await User.getById(d2, userToReplicateId); + const userToReplicate = await User.getById(this.context.d2, userToReplicateId); const username = `${userToReplicate.username}_$index`; this.setState({ existingUsernames, @@ -66,7 +61,7 @@ class ReplicateUserFromTemplate extends React.Component { password: this.defaultPassword, validate: true, }); - } + }; onUpdateField = (field, value) => { this.setState({ [field]: value, validate: true }); @@ -87,7 +82,7 @@ class ReplicateUserFromTemplate extends React.Component { return getFromTemplate(template, n); } - getValidators() { + getValidators = () => { return { isRequired: { validator: Validators.isRequired, @@ -99,7 +94,7 @@ class ReplicateUserFromTemplate extends React.Component { }), isValidUsername: toBuilderValidator( usernameTemplate => { - const { existingUsernames, usersToCreate } = this.state; + const { existingUsernames } = this.state; const usernamesFromTemplate = this.getValuesFromTemplate(usernameTemplate); const getOthersInTemplate = username => { const index = _(usernamesFromTemplate).indexOf(username); @@ -123,7 +118,7 @@ class ReplicateUserFromTemplate extends React.Component { (password, error) => this.getTranslation(`password_${error}`) ), }; - } + }; getTextField(name, type, value, { label, validators }) { return { @@ -142,11 +137,7 @@ class ReplicateUserFromTemplate extends React.Component { onSave = async () => { const { onRequestClose } = this.props; const { userToReplicate, usersToCreate, username, password } = this.state; - const response = await userToReplicate.replicateFromTemplate( - usersToCreate, - username, - password - ); + const response = await userToReplicate.replicateFromTemplate(usersToCreate, username, password); if (response.success) { const message = this.getTranslation("replicate_successful", { @@ -160,45 +151,25 @@ class ReplicateUserFromTemplate extends React.Component { } }; - render() { + render = () => { const { onRequestClose } = this.props; - const { - infoDialog, - userToReplicate, - invalidUsernames, - usersToCreate, - username, - password, - isValid, - validate, - } = this.state; + const { infoDialog, userToReplicate, usersToCreate, username, password, isValid, validate } = this.state; const title = this.getTranslation("replicate_user_title", { - user: userToReplicate - ? `${userToReplicate.displayName} (${userToReplicate.username})` - : "", + user: userToReplicate ? `${userToReplicate.displayName} (${userToReplicate.username})` : "", }); const t = this.getTranslation; - const actions = [ - , - , - ]; + const actions = ( + + + , + , + + ); const fields = [ this.getTextField("usersToCreate", "number", usersToCreate, { - validators: [ - this.validators.isRequired, - this.validators.withinInterval(1, this.maxUsers), - ], + validators: [this.validators.isRequired, this.validators.withinInterval(1, this.maxUsers)], }), this.getTextField("username", "string", username, { validators: [this.validators.isValidUsername], @@ -239,7 +210,7 @@ class ReplicateUserFromTemplate extends React.Component { /> ); - } + }; } ReplicateUserFromTemplate.contextTypes = { diff --git a/src/components/SettingsDialog.component.js b/src/legacy/components/SettingsDialog.component.js similarity index 58% rename from src/components/SettingsDialog.component.js rename to src/legacy/components/SettingsDialog.component.js index cb4c2b1..b336dd4 100644 --- a/src/components/SettingsDialog.component.js +++ b/src/legacy/components/SettingsDialog.component.js @@ -1,37 +1,17 @@ -import React from "react"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import LinearProgress from "material-ui/LinearProgress/LinearProgress"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import Card from "material-ui/Card/Card"; -import CardText from "material-ui/Card/CardText"; -import { Tabs, Tab } from "material-ui/Tabs"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import TextField from "d2-ui/lib/form-fields/TextField"; import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; import Validators from "d2-ui/lib/forms/Validators"; +import _ from "lodash"; import fp from "lodash/fp"; import PropTypes from "prop-types"; -import _ from "lodash"; +import React from "react"; import Dropdown from "./Dropdown.component"; -import TextField from "d2-ui/lib/form-fields/TextField"; - -import Settings from "../models/settings"; - -const TabCard = ({ fields, onUpdateFormStatus, onUpdateField }) => ( - - - - - -); +import i18n from "../../locales"; export default class SettingsDialog extends React.Component { static propTypes = { - onRequestClose: React.PropTypes.func.isRequired, + onRequestClose: PropTypes.func.isRequired, settings: PropTypes.object.isRequired, }; @@ -71,10 +51,7 @@ export default class SettingsDialog extends React.Component { getFields(key) { const { settings } = this.state; const keys = _.get(this.tabs, key); - const tabFields = _(settings.fields) - .keyBy("name") - .at(keys) - .value(); + const tabFields = _(settings.fields).keyBy("name").at(keys).value(); return tabFields.map(field => { const value = settings.get(field.name); @@ -83,10 +60,7 @@ export default class SettingsDialog extends React.Component { case "string": return { name: field.name, - value: - (value !== null && value !== undefined && value) || - field.defaultValue || - "", + value: (value !== null && value !== undefined && value) || field.defaultValue || "", component: TextField, validators: [ { @@ -134,48 +108,29 @@ export default class SettingsDialog extends React.Component { this.props.onRequestClose(); }; - render() { + render = () => { const { settings, formStatuses } = this.state; - const saveIsEnabled = - settings && - _(formStatuses) - .values() - .every(); - - const actions = [ - , - , - ]; - - const getTabCardProps = section => ({ - fields: this.getFields(section), - onUpdateFormStatus: status => _.defer(this.onUpdateFormStatus, section, status), - onUpdateField: this.onUpdateField, - }); + const saveIsEnabled = settings && _(formStatuses).values().every(); return ( - - - +
+ _.defer(this.onUpdateFormStatus, "importExport", status)} + onUpdateField={this.onUpdateField} + /> +
+ ); - } + }; } diff --git a/src/components/TableLayout.component.js b/src/legacy/components/TableLayout.component.js similarity index 81% rename from src/components/TableLayout.component.js rename to src/legacy/components/TableLayout.component.js index 4a23b96..7e462ba 100644 --- a/src/components/TableLayout.component.js +++ b/src/legacy/components/TableLayout.component.js @@ -1,8 +1,8 @@ -import React from "react"; -import PropTypes from "prop-types"; +import _ from "lodash"; import { Dialog, FlatButton, RaisedButton } from "material-ui"; - -import MultiSelect from "../components/MultiSelect.component"; +import PropTypes from "prop-types"; +import React from "react"; +import MultiSelect from "./MultiSelect.component"; import snackActions from "../Snackbar/snack.actions"; class TableLayout extends React.Component { @@ -47,18 +47,21 @@ class TableLayout extends React.Component { } }; - getDialogButtons() { - return [ - , - , - ]; - } + getDialogButtons = () => { + return ( + + + , + , + + ); + }; - render() { + render = () => { const { options, selected } = this.props; const title = this.getTranslation("layout_settings"); @@ -85,7 +88,7 @@ class TableLayout extends React.Component { ); - } + }; } TableLayout.propTypes = { @@ -97,7 +100,7 @@ TableLayout.propTypes = { }; TableLayout.contextTypes = { - d2: React.PropTypes.any, + d2: PropTypes.any, }; export default TableLayout; diff --git a/src/components/UserGroupsDialog.component.js b/src/legacy/components/UserGroupsDialog.component.js similarity index 89% rename from src/components/UserGroupsDialog.component.js rename to src/legacy/components/UserGroupsDialog.component.js index c2050be..644ecd9 100644 --- a/src/components/UserGroupsDialog.component.js +++ b/src/legacy/components/UserGroupsDialog.component.js @@ -1,9 +1,10 @@ -import React from "react"; -import PropTypes from "prop-types"; -import BatchModelsMultiSelectModel from "./batch-models-multi-select/BatchModelsMultiSelect.model"; -import BatchModelsMultiSelectComponent from "./batch-models-multi-select/BatchModelsMultiSelect.component"; import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; +import _ from "lodash"; +import PropTypes from "prop-types"; +import React from "react"; import _m from "../utils/lodash-mixins"; +import BatchModelsMultiSelectComponent from "./batch-models-multi-select/BatchModelsMultiSelect.component"; +import BatchModelsMultiSelectModel from "./batch-models-multi-select/BatchModelsMultiSelect.model"; function getPayload(allUserGroups, pairs) { // Saving user groups is more complicated than saving userRoles. That's because we @@ -11,13 +12,10 @@ function getPayload(allUserGroups, pairs) { // have to save user groups, so we must invert the user/groups relationship. const allUserGroupsById = _.keyBy(allUserGroups, "id"); const usersToSave = _(pairs) - .map(([user, userGroupsForUser]) => user) + .map(([user]) => user) .value(); const groupIdsByUserId = _(pairs) - .map(([user, userGroupsForUser]) => [ - user.id, - new Set(userGroupsForUser.map(group => group.id)), - ]) + .map(([user, userGroupsForUser]) => [user.id, new Set(userGroupsForUser.map(group => group.id))]) .fromPairs() .value(); const getUsersForGroup = group => @@ -27,9 +25,7 @@ function getPayload(allUserGroups, pairs) { .filter(user => !groupIdsByUserId[user.id] || groupIdsByUserId[user.id].has(group.id)) .map(user => ({ id: user.id })); const userGroups = _(pairs) - .flatMap(([user, userGroupsForUser]) => - _.concat(user.userGroups.toArray(), userGroupsForUser) - ) + .flatMap(([user, userGroupsForUser]) => _.concat(user.userGroups.toArray(), userGroupsForUser)) .uniqBy(group => group.id) .map(userGroup => allUserGroupsById[userGroup.id]) .compact() diff --git a/src/components/UserRolesDialog.component.js b/src/legacy/components/UserRolesDialog.component.js similarity index 100% rename from src/components/UserRolesDialog.component.js rename to src/legacy/components/UserRolesDialog.component.js diff --git a/src/components/batch-models-multi-select/BatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js similarity index 82% rename from src/components/batch-models-multi-select/BatchModelsMultiSelect.component.js rename to src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js index 66be82d..9e6268b 100644 --- a/src/components/batch-models-multi-select/BatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js @@ -1,13 +1,14 @@ -import React from "react"; +import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; +import _ from "lodash"; import Dialog from "material-ui/Dialog/Dialog"; import FlatButton from "material-ui/FlatButton/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; import TextField from "material-ui/TextField/TextField"; -import MultiSelect from "../MultiSelect.component"; -import snackActions from "../../Snackbar/snack.actions"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; +import React from "react"; +import snackActions from "../../Snackbar/snack.actions"; +import MultiSelect from "../MultiSelect.component"; export default class BatchModelsMultiSelectComponent extends React.Component { constructor(props, context) { @@ -58,7 +59,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { }, }; - componentDidMount() { + componentDidMount = () => { const { parents, model } = this.props; return Promise.all([model.getAllChildren(), model.getParents(parents)]) .then(([allChildren, parentsLoaded]) => @@ -66,22 +67,18 @@ export default class BatchModelsMultiSelectComponent extends React.Component { state: "ready", parents: parentsLoaded, allChildren, - selectedIds: this.props.model - .getSelectedChildren(parentsLoaded) - .map(obj => obj.id), + selectedIds: this.props.model.getSelectedChildren(parentsLoaded).map(obj => obj.id), }) ) - .catch(err => - this.close(this.getTranslation("error_loading_data") + " :" + err.toString()) - ); - } + .catch(err => this.close(this.getTranslation("error_loading_data") + " :" + err.toString())); + }; close(snackMessage = null) { if (snackMessage) snackActions.show({ message: snackMessage }); this.props.onRequestClose(); } - renderStrategyToggle() { + renderStrategyToggle = () => { if (this.state.parents && this.state.parents.length > 1) { const label = this.getTranslation("update_strategy") + @@ -93,28 +90,26 @@ export default class BatchModelsMultiSelectComponent extends React.Component { label={label} style={{ width: 300, float: "right", marginTop: 20, marginRight: 15 }} checked={this.state.updateStrategy === "replace"} - onToggle={(ev, newValue) => - this.setState({ updateStrategy: newValue ? "replace" : "merge" }) - } + onToggle={(ev, newValue) => this.setState({ updateStrategy: newValue ? "replace" : "merge" })} /> ); } else { return null; } - } + }; - save() { + save = () => { const { parents, allChildren, selectedIds, updateStrategy } = this.state; this.props.model .save(parents, allChildren, selectedIds, updateStrategy) .then(() => this.close(this.props.onSuccess)) - .catch(err => this.close(this.props.onError)); - } + .catch(() => this.close(this.props.onError)); + }; onChange(selectedIds) { this.setState({ selectedIds }); } - render() { + render = () => { switch (this.state.state) { case "loading": return ( @@ -127,30 +122,30 @@ export default class BatchModelsMultiSelectComponent extends React.Component { case "ready": return this.renderForm(); default: - throw new Error(`Unknown state: ${state}`); + throw new Error(`Unknown state: ${this.state.state}`); } - } + }; onFilterTextChange(event) { this.setState({ filterText: event.target.value }); } - getDialogButtons() { - return [ - , - , - ]; - } + getDialogButtons = () => { + return ( + + + , + , + + ); + }; - render() { + //eslint-disable-next-line + render = () => { const isLoading = this.state.state === "loading"; const { parents, allChildren, filterText, selectedIds } = this.state; const title = this.props.getTitle(parents, allChildren); @@ -190,7 +185,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { ); - } + }; } BatchModelsMultiSelectComponent.propTypes = { diff --git a/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js similarity index 76% rename from src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js rename to src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js index 97c9f4f..f92caf3 100644 --- a/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js @@ -2,10 +2,7 @@ import _ from "lodash"; const toArray = obj => (obj.toArray ? obj.toArray() : obj || []); export default class BatchModelsMultiSelectModel { - constructor( - d2, - { parentModel, parentFields, getPayload, childrenModel, childrenFields, getChildren } - ) { + constructor(d2, { parentModel, parentFields, getPayload, childrenModel, childrenFields, getChildren }) { Object.assign(this, { d2, parentModel: parentModel, @@ -17,15 +14,11 @@ export default class BatchModelsMultiSelectModel { }); } - getAllChildren() { + getAllChildren = () => { return this.childrenModel .list({ fields: this.childrenFields, paging: false }) - .then(collection => - _(collection.toArray()) - .sortBy("name") - .value() - ); - } + .then(collection => _(collection.toArray()).sortBy("name").value()); + }; getParents(parents) { const parentIds = _(parents) @@ -71,25 +64,18 @@ export default class BatchModelsMultiSelectModel { const childrenAssignedToAllParents = this.getSelectedChildren(parents); const getNewChildrenForParent = parent => { switch (updateStrategy) { - case "merge": - const childrenToRemove = _.differenceBy( - childrenAssignedToAllParents, - newChildren, - "id" - ); - const childrenToAdd = _.differenceBy( - newChildren, - childrenAssignedToAllParents, - "id" - ); + case "merge": { + const childrenToRemove = _.differenceBy(childrenAssignedToAllParents, newChildren, "id"); + const childrenToAdd = _.differenceBy(newChildren, childrenAssignedToAllParents, "id"); return _(this.getChildren(parent)) .differenceBy(childrenToRemove, "id") .concat(childrenToAdd) .value(); + } case "replace": return newChildren; default: - throw new Error("Unknown strategy: " + strategy); + throw new Error("Unknown strategy: " + updateStrategy); } }; return parents.map(getNewChildrenForParent); diff --git a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js similarity index 84% rename from src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js rename to src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index b9050d6..2a49c67 100644 --- a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -1,13 +1,14 @@ -import React from "react"; +import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; +import _ from "lodash"; import Dialog from "material-ui/Dialog/Dialog"; import FlatButton from "material-ui/FlatButton/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; import TextField from "material-ui/TextField/TextField"; -import MultiSelect from "../MultiSelect.component"; -import snackActions from "../../Snackbar/snack.actions"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; +import React from "react"; +import snackActions from "../../Snackbar/snack.actions"; +import MultiSelect from "../MultiSelect.component"; export default class CopyInUserBatchModelsMultiSelectComponent extends React.Component { constructor(props, context) { @@ -80,7 +81,7 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com marginLeft: 20, }, }; - componentDidMount() { + componentDidMount = () => { const { parents, model } = this.props; return Promise.all([model.getAllChildren(), model.getParents(parents)]) .then(([allChildren, parentsLoaded]) => @@ -91,17 +92,15 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com selectedIds: [], }) ) - .catch(err => - this.close(this.getTranslation("error_loading_data") + " :" + err.toString()) - ); - } + .catch(err => this.close(this.getTranslation("error_loading_data") + " :" + err.toString())); + }; close(snackMessage = null) { if (snackMessage) snackActions.show({ message: snackMessage }); this.props.onRequestClose(); } - renderStrategyToggle() { + renderStrategyToggle = () => { const label = this.getTranslation("update_strategy") + ": " + @@ -111,14 +110,12 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com label={label} style={{ width: 280, float: "right", marginTop: 20, marginRight: 15 }} checked={this.state.updateStrategy === "replace"} - onToggle={(ev, newValue) => - this.setState({ updateStrategy: newValue ? "replace" : "merge" }) - } + onToggle={(ev, newValue) => this.setState({ updateStrategy: newValue ? "replace" : "merge" })} /> ); - } + }; - async copyInUserSave() { + copyInUserSave = async () => { const { parents, selectedIds, @@ -138,15 +135,15 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com await this.props.model .copyInUserSave(parents, selectedIds, copyAccessElements, updateStrategy) .then(() => this.close(this.props.onSuccess)) - .catch(err => this.close(this.props.onError)) + .catch(() => this.close(this.props.onError)) .finally(() => this.setState({ state: "ready" })); - } + }; onChange(selectedIds) { this.setState({ selectedIds }); } - render() { + render = () => { switch (this.state.state) { case "loading": return ( @@ -159,22 +156,16 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com case "ready": return this.renderForm(); default: - throw new Error(`Unknown state: ${state}`); + throw new Error(`Unknown state: ${this.state.state}`); } - } + }; onFilterTextChange(event) { this.setState({ filterText: event.target.value }); } - copy() { - const { - copyUserGroups, - copyUserRoles, - copyOrgUnitOutput, - copyOrgUnitsCapture, - selectedIds, - } = this.state; + copy = () => { + const { copyUserGroups, copyUserRoles, copyOrgUnitOutput, copyOrgUnitsCapture, selectedIds } = this.state; if (!copyUserGroups && !copyUserRoles && !copyOrgUnitOutput && !copyOrgUnitsCapture) { snackActions.show({ message: this.getTranslation("select_one_toggle") }); @@ -183,27 +174,32 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com } else { this.copyInUserSave(); } - } + }; - getDialogButtons() { + getDialogButtons = () => { const isLoading = this.state.state === "loading"; - return [ - , - , - ]; - } + return ( + + + , + + , + + ); + }; - render() { + //eslint-disable-next-line + render = () => { const isLoading = this.state.state === "loading"; const { parents, allChildren, filterText, selectedIds } = this.state; const title = this.props.getTitle(parents, allChildren); @@ -248,16 +244,14 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com this.setState({ copyUserGroups: newValue })} /> - this.setState({ copyOrgUnitOutput: newValue }) - } + onToggle={(ev, newValue) => this.setState({ copyOrgUnitOutput: newValue })} />
@@ -270,14 +264,14 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com this.setState({ copyOrgUnits: newValue })} />
); - } + }; } CopyInUserBatchModelsMultiSelectComponent.propTypes = { diff --git a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js similarity index 84% rename from src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js rename to src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js index 103b9c2..2aed9bc 100644 --- a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js @@ -4,10 +4,7 @@ import { getExistingUsers } from "../../models/userHelpers"; const toArray = obj => (obj.toArray ? obj.toArray() : obj || []); export default class CopyInUserBatchModelsMultiSelectModel { - constructor( - d2, - { parentModel, getPayload, parentFields, childrenModel, childrenFields, getChildren } - ) { + constructor(d2, { parentModel, getPayload, parentFields, childrenModel, childrenFields, getChildren }) { Object.assign(this, { d2, parentModel: parentModel, @@ -19,15 +16,11 @@ export default class CopyInUserBatchModelsMultiSelectModel { }); } - getAllChildren() { + getAllChildren = () => { return this.childrenModel .list({ fields: this.childrenFields, paging: false }) - .then(collection => - _(collection.toArray()) - .sortBy("name") - .value() - ); - } + .then(collection => _(collection.toArray()).sortBy("name").value()); + }; getParents(parents) { const parentIds = _(parents) @@ -42,7 +35,7 @@ export default class CopyInUserBatchModelsMultiSelectModel { return this.parentModel.list(options).then(collection => collection.toArray()); } async getUserInfo(ids) { - const users = await getExistingUsers(d2, { + const users = await getExistingUsers(this.d2, { fields: ":owner,userGroups[id]", filter: "id:in:[" + ids.join(",") + "]", }); @@ -53,6 +46,7 @@ export default class CopyInUserBatchModelsMultiSelectModel { const childrenUsers = await this.getUserInfo(selectedIds); const payload = await this.getPayload( + this.d2, ...parentWithRoles, childrenUsers, copyAccessElements, diff --git a/src/images/logo-eyeseetea.png b/src/legacy/images/logo-eyeseetea.png similarity index 100% rename from src/images/logo-eyeseetea.png rename to src/legacy/images/logo-eyeseetea.png diff --git a/src/loading-mask/LoadingMask.component.js b/src/legacy/loading-mask/LoadingMask.component.js similarity index 80% rename from src/loading-mask/LoadingMask.component.js rename to src/legacy/loading-mask/LoadingMask.component.js index ab33648..a31a2e1 100644 --- a/src/loading-mask/LoadingMask.component.js +++ b/src/legacy/loading-mask/LoadingMask.component.js @@ -1,8 +1,8 @@ import React from "react"; import CircularProgress from "material-ui/CircularProgress"; -export default React.createClass({ - render() { +export default class LoadingMask extends React.Component { + render = () => { const { style } = this.props; const loadingStatusMask = { left: "45%", @@ -12,5 +12,5 @@ export default React.createClass({ }; return ; - }, -}); + }; +} diff --git a/src/models/settings.js b/src/legacy/models/settings.js similarity index 92% rename from src/models/settings.js rename to src/legacy/models/settings.js index d1efda5..18b4ca4 100644 --- a/src/models/settings.js +++ b/src/legacy/models/settings.js @@ -58,9 +58,7 @@ class Settings { }, ]; - return _(fieldsList) - .keyBy("name") - .value(); + return _(fieldsList).keyBy("name").value(); } static build(d2) { @@ -92,7 +90,7 @@ class Settings { set(partialUpdate) { _(partialUpdate).each((value, name) => { if (!this.fields[name]) { - throw `Unknown setting: ${name}=${value}`; + throw new Error(`Unknown setting: ${name}=${value}`); } }); const newValues = { ...this.values, ...partialUpdate }; @@ -102,9 +100,7 @@ class Settings { async save() { const { values, api } = this; const namespaces = await api.get(`${endpoint}`); - const keys = _(namespaces).includes(storeNamespace) - ? await api.get(`${endpoint}/${storeNamespace}`) - : []; + const keys = _(namespaces).includes(storeNamespace) ? await api.get(`${endpoint}/${storeNamespace}`) : []; const method = _(keys).includes(storeKey) ? "update" : "post"; await api[method](`${endpoint}/${storeNamespace}/${storeKey}`, values); diff --git a/src/models/user.js b/src/legacy/models/user.js similarity index 96% rename from src/models/user.js rename to src/legacy/models/user.js index 6c91af2..34d229f 100644 --- a/src/models/user.js +++ b/src/legacy/models/user.js @@ -1,4 +1,4 @@ -import { pick, merge, unzip, flatten, times, uniq } from "lodash/fp"; +import { pick, merge, unzip, times } from "lodash/fp"; import { generateUid } from "d2/lib/uid"; import { getFromTemplate } from "../utils/template"; import { parseResponse } from "./userHelpers"; @@ -62,9 +62,7 @@ class User { async replicate(newUsersAttributes) { const ownedProperties = this.d2.models.user.getOwnedPropertyNames(); const userJson = pick(ownedProperties, this.attributes); - const newUsers = newUsersAttributes.map(newUserAttributes => - merge(userJson, newUserAttributes) - ); + const newUsers = newUsersAttributes.map(newUserAttributes => merge(userJson, newUserAttributes)); const userGroupIds = this.attributes.userGroups.map(userGroup => userGroup.id); const { userGroups } = await this.api.get("/userGroups", { filter: "id:in:[" + userGroupIds.join(",") + "]", diff --git a/src/models/userHelpers.js b/src/legacy/models/userHelpers.js similarity index 79% rename from src/models/userHelpers.js rename to src/legacy/models/userHelpers.js index 021e8cd..0477ea2 100644 --- a/src/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -1,5 +1,4 @@ import _ from "lodash"; -import _m from "../utils/lodash-mixins"; import moment from "moment"; import Papa from "papaparse"; import { generateUid } from "d2/lib/uid"; @@ -13,23 +12,6 @@ const fieldSplitChar = "||"; export const fieldImportSuffix = "Import"; -const queryFields = [ - "displayName|rename(name)", - "shortName", - "firstName", - "surname", - "created", - "email", - "id", - "userCredentials[username,disabled,userRoles[id,displayName],lastLogin]", - "lastUpdated", - "access", - "href", - "userGroups[id,displayName,publicAccess]", - "organisationUnits[id,code,shortName,displayName]", - "dataViewOrganisationUnits[id,code,shortName,displayName]", -].join(","); - const requiredPropertiesOnImport = ["username", "password", "firstName", "surname"]; const propertiesIgnoredOnImport = ["id", "created", "lastUpdated", "lastLogin"]; @@ -79,13 +61,7 @@ async function getAssociations(d2, objs, { orgUnitsField }) { })) ) .groupBy("model") - .mapValues(vs => - _(vs) - .flatMap("value") - .uniq() - .compact() - .value() - ) + .mapValues(vs => _(vs).flatMap("value").uniq().compact().value()) .pickBy(vs => !_(vs).isEmpty()) .value(); @@ -127,11 +103,7 @@ function getColumnNameFromProperty(property) { } function formatDate(stringDate) { - return !!stringDate ? moment(stringDate).format("YYYY-MM-DD HH:mm:ss") : null; -} - -function parseDate(stringDate) { - return moment(stringDate).toISOString(); + return stringDate ? moment(stringDate).format("YYYY-MM-DD HH:mm:ss") : null; } function namesFromCollection(collection, field) { @@ -150,8 +122,7 @@ function collectionFromNames(user, rowIndex, field, objectsByName) { const { username } = user; const warnings = missingValues.map( missingValue => - `Value not found: ${missingValue} [username=${username || - "-"} csv-row=${rowIndex} csv-column=${field}]` + `Value not found: ${missingValue} [username=${username || "-"} csv-row=${rowIndex} csv-column=${field}]` ); if (!value || !objectsByName) return { warnings }; @@ -186,10 +157,7 @@ function getPlainUser(user, { orgUnitsField }) { userRoles: namesFromCollection(userCredentials.userRoles, "displayName"), userGroups: namesFromCollection(user.userGroups, "displayName"), organisationUnits: namesFromCollection(user.organisationUnits, orgUnitsField), - dataViewOrganisationUnits: namesFromCollection( - user.dataViewOrganisationUnits, - orgUnitsField - ), + dataViewOrganisationUnits: namesFromCollection(user.dataViewOrganisationUnits, orgUnitsField), disabled: userCredentials.disabled, }; } @@ -199,12 +167,7 @@ function getPlainUserFromRow(user, modelValuesByField, rowIndex) { const relationships = { userRoles: collectionFromNames(user, rowIndex, "userRoles", byField.userRoles), userGroups: collectionFromNames(user, rowIndex, "userGroups", byField.userGroups), - organisationUnits: collectionFromNames( - user, - rowIndex, - "organisationUnits", - byField.organisationUnits - ), + organisationUnits: collectionFromNames(user, rowIndex, "organisationUnits", byField.organisationUnits), dataViewOrganisationUnits: collectionFromNames( user, rowIndex, @@ -212,13 +175,8 @@ function getPlainUserFromRow(user, modelValuesByField, rowIndex) { byField.organisationUnits ), }; - const warnings = _(relationships) - .values() - .flatMap("warnings") - .value(); - const objectRelationships = _(relationships) - .mapValues("objects") - .value(); + const warnings = _(relationships).values().flatMap("warnings").value(); + const objectRelationships = _(relationships).mapValues("objects").value(); const extraInfo = _(relationships) .map(({ info }, field) => [field + fieldImportSuffix, info]) .fromPairs() @@ -235,24 +193,14 @@ function getPlainUserFromRow(user, modelValuesByField, rowIndex) { async function getUsersFromCsv(d2, file, csv, { maxUsers, orgUnitsField }) { const columnNames = _.first(csv.data); - const rows = maxUsers - ? _(csv.data) - .drop(1) - .take(maxUsers) - .value() - : _(csv.data) - .drop(1) - .value(); + const rows = maxUsers ? _(csv.data).drop(1).take(maxUsers).value() : _(csv.data).drop(1).value(); const plainUserAttributes = _(d2.models.users.modelValidations) .map((value, key) => (_(["TEXT", "DATE", "URL"]).includes(value.type) ? key : null)) .compact() .value(); - const knownColumnNames = _(columnNameFromPropertyMapping) - .keys() - .union(plainUserAttributes) - .value(); + const knownColumnNames = _(columnNameFromPropertyMapping).keys().union(plainUserAttributes).value(); // Column properties can be human names (propertyFromColumnNameMapping) or direct key values const csvColumnProperties = _(columnNames) @@ -262,10 +210,7 @@ async function getUsersFromCsv(d2, file, csv, { maxUsers, orgUnitsField }) { (_(knownColumnNames).includes(columnName) ? columnName : undefined) ) .value(); - const columnMapping = _(columnNames) - .zip(csvColumnProperties) - .fromPairs() - .value(); + const columnMapping = _(columnNames).zip(csvColumnProperties).fromPairs().value(); // Insert password column after username if not found const usernameIdx = csvColumnProperties.indexOf("username"); @@ -339,16 +284,10 @@ function parseResponse(response, payload) { const toArray = xs => xs || []; const errors = toArray(response && response.typeReports).map(typeReport => toArray(typeReport.objectReports).map(objectReport => - objectReport.errorReports.map(errorReport => - [errorReport.mainKlass, errorReport.message].join(" - ") - ) + objectReport.errorReports.map(errorReport => [errorReport.mainKlass, errorReport.message].join(" - ")) ) ); - const error = _(errors) - .flatten() - .flatten() - .uniq() - .join("\n"); + const error = _(errors).flatten().flatten().uniq().join("\n"); return { success: false, response, error, payload }; } else { return { success: true, response, payload }; @@ -360,11 +299,7 @@ function getUserPayloadFromPlainAttributes(baseUser, userFields) { const userRoot = { ...baseUser, - ...clean( - _(userFields) - .omit(userCredentialsFields) - .value() - ), + ...clean(_(userFields).omit(userCredentialsFields).value()), id: baseUser.id || userFields.id, }; @@ -372,11 +307,7 @@ function getUserPayloadFromPlainAttributes(baseUser, userFields) { ...userRoot, userCredentials: { ...baseUser.userCredentials, - ...clean( - _(userFields) - .pick(userCredentialsFields) - .value() - ), + ...clean(_(userFields).pick(userCredentialsFields).value()), id: (baseUser.userCredentials && baseUser.userCredentials.id) || generateUid(), userInfo: { id: userRoot.id }, }, @@ -385,18 +316,13 @@ function getUserPayloadFromPlainAttributes(baseUser, userFields) { function getUsersToSave(users, existingUsersToUpdate) { const usersByUsername = _.keyBy(users, "username"); - const existingUsernamesSet = new Set( - existingUsersToUpdate.map(user => user.userCredentials.username) - ); + const existingUsernamesSet = new Set(existingUsersToUpdate.map(user => user.userCredentials.username)); const usersToCreate = _(users) .filter(user => !existingUsernamesSet.has(user.username)) .map(userAttributes => getUserPayloadFromPlainAttributes({}, userAttributes)) .value(); const usersToUpdate = existingUsersToUpdate.map(existingUser => - getUserPayloadFromPlainAttributes( - existingUser, - usersByUsername[existingUser.userCredentials.username] - ) + getUserPayloadFromPlainAttributes(existingUser, usersByUsername[existingUser.userCredentials.username]) ); return usersToCreate.concat(usersToUpdate); } @@ -412,7 +338,7 @@ Alternatives: We could us `/api/users/ID` or `users/ID/replica` (this copies use but that would require one request by each new user. */ -async function getUserGroupsToSave(api, usersToSave, existingUsersToUpdate) { +async function getUserGroupsToSave(d2, api, usersToSave, existingUsersToUpdate) { const userGroupsByUsername = _(usersToSave) .map(user => [user.userCredentials.username, (user.userGroups || []).map(ug => ug.id)]) .fromPairs() @@ -420,30 +346,20 @@ async function getUserGroupsToSave(api, usersToSave, existingUsersToUpdate) { const allUsers = await getExistingUsers(d2, { fields: "id,userGroups[id],userCredentials[username]", }); - const userGroupsInvolved = _(usersToSave) - .concat(existingUsersToUpdate) - .flatMap("userGroups") - .uniqBy("id") - .value(); + const userGroupsInvolved = _(usersToSave).concat(existingUsersToUpdate).flatMap("userGroups").uniqBy("id").value(); const usersByGroupId = _(usersToSave) .concat(allUsers) .uniqBy(user => user.userCredentials.username) .flatMap(user => { const userGroupIds = - userGroupsByUsername[user.userCredentials.username] || - user.userGroups.map(ug => ug.id); + userGroupsByUsername[user.userCredentials.username] || user.userGroups.map(ug => ug.id); return userGroupIds.map(userGroupId => ({ user, userGroupId })); }) .groupBy("userGroupId") .mapValues(items => items.map(item => item.user)) .value(); const { userGroups } = await api.get("/userGroups", { - filter: - "id:in:[" + - _(userGroupsInvolved) - .map("id") - .join(",") + - "]", + filter: "id:in:[" + _(userGroupsInvolved).map("id").join(",") + "]", fields: ":owner", paging: false, }); @@ -471,24 +387,16 @@ async function updateUsers(d2, users, mapper) { const api = d2.Api.getApi(); const existingUsers = await getExistingUsers(d2, { fields: ":owner", - filter: - "id:in:[" + - _(users) - .map("id") - .join(",") + - "]", + filter: "id:in:[" + _(users).map("id").join(",") + "]", }); - const usersToSave = _(existingUsers) - .map(mapper) - .compact() - .value(); + const usersToSave = _(existingUsers).map(mapper).compact().value(); const payload = { users: usersToSave }; return postMetadata(api, payload); } -async function getUserGroupsToSaveAndPostMetadata(api, users, existingUsersToUpdate) { - const userGroupsToSave = await getUserGroupsToSave(api, users, existingUsersToUpdate); +async function getUserGroupsToSaveAndPostMetadata(d2, api, users, existingUsersToUpdate) { + const userGroupsToSave = await getUserGroupsToSave(d2, api, users, existingUsersToUpdate); const payload = { users: users, userGroups: userGroupsToSave }; return postMetadata(api, payload); } @@ -498,15 +406,10 @@ async function saveUsers(d2, users) { const api = d2.Api.getApi(); const existingUsersToUpdate = await getExistingUsers(d2, { fields: ":owner,userGroups[id]", - filter: - "userCredentials.username:in:[" + - _(users) - .map("username") - .join(",") + - "]", + filter: "userCredentials.username:in:[" + _(users).map("username").join(",") + "]", }); const usersToSave = getUsersToSave(users, existingUsersToUpdate); - return getUserGroupsToSaveAndPostMetadata(api, usersToSave, existingUsersToUpdate); + return getUserGroupsToSaveAndPostMetadata(d2, api, usersToSave, existingUsersToUpdate); } async function saveCopyInUsers(d2, users, copyUserGroups) { @@ -514,14 +417,9 @@ async function saveCopyInUsers(d2, users, copyUserGroups) { if (copyUserGroups) { const existingUsersToUpdate = await getExistingUsers(d2, { fields: ":owner,userGroups[id]", - filter: - "userCredentials.username:in:[" + - _(users) - .map("userCredentials.username") - .join(",") + - "]", + filter: "userCredentials.username:in:[" + _(users).map("userCredentials.username").join(",") + "]", }); - return getUserGroupsToSaveAndPostMetadata(api, users, existingUsersToUpdate); + return getUserGroupsToSaveAndPostMetadata(d2, api, users, existingUsersToUpdate); } else { return postMetadata(api, { users: users }); } @@ -538,7 +436,7 @@ async function exportToCsv(d2, columns, filterOptions, { orgUnitsField }) { return Papa.unparse(table); } -async function exportTemplateToCsv(d2) { +async function exportTemplateToCsv() { const columnsAdded = ["password"]; const columnsRemoved = ["lastUpdated", "created", "lastLogin"]; const columnKeysToExport = _(columns) @@ -546,10 +444,7 @@ async function exportTemplateToCsv(d2) { .difference(columnsRemoved) .union(columnsAdded) .value(); - const header = _(columnKeysToExport) - .map(getColumnNameFromProperty) - .compact() - .value(); + const header = _(columnKeysToExport).map(getColumnNameFromProperty).compact().value(); const table = [header]; return Papa.unparse(table); @@ -565,7 +460,7 @@ async function importFromCsv(d2, file, { maxUsers, orgUnitsField }) { const res = await getUsersFromCsv(d2, file, csv, { maxUsers, orgUnitsField }); res.success ? resolve(res) : reject(res.errors.join("\n")); }, - error: (err, file) => reject(err), + error: err => reject(err), }); }); } @@ -592,7 +487,7 @@ function addItems(items1, items2, shouldAdd, updateStrategy) { } } -function getPayload(parentUser, destUsers, fields, updateStrategy) { +function getPayload(d2, parentUser, destUsers, fields, updateStrategy) { const users = destUsers.map(childUser => { const newChildUserCredentials = { ...childUser.userCredentials, diff --git a/src/models/userList.js b/src/legacy/models/userList.js similarity index 93% rename from src/models/userList.js rename to src/legacy/models/userList.js index 67222ad..12fa87f 100644 --- a/src/models/userList.js +++ b/src/legacy/models/userList.js @@ -123,19 +123,6 @@ function getFiltersFromObject(filtersObject) { .value(); } -// To be used when DHIS2 fixes all the API bugs */ -async function getUserListStandard(d2, filtersObject, listOptions) { - const filter = buildD2Filter(getFiltersFromObject(filtersObject)); - const collection = await d2.models.user.list({ - ..._.pick(listOptions, ["order", "page", "pageSize", "query", "canManage"]), - ...(!_.isEmpty(filter) ? { filter } : {}), - fields: queryFields.join(","), - paging: true, - }); - - return { pager: collection.pager, users: collection.toArray() }; -} - /* Manually paginate a collection of objects */ function paginate(objects, options) { const { page = 1, pageSize = 50 } = options; diff --git a/src/utils/dhis2Helpers.js b/src/legacy/utils/dhis2Helpers.js similarity index 79% rename from src/utils/dhis2Helpers.js rename to src/legacy/utils/dhis2Helpers.js index 7e6e5b1..5eee228 100644 --- a/src/utils/dhis2Helpers.js +++ b/src/legacy/utils/dhis2Helpers.js @@ -1,5 +1,5 @@ import _ from "lodash"; -import _m from "../utils/lodash-mixins"; +import _m from "./lodash-mixins"; import appStateStore from "../App/appStateStore"; @@ -22,13 +22,7 @@ async function mapPromise(inputValues, mapper) { /* Perform a model.list with a filter=FIELD:in:[VALUE1,VALUE2,...], breaking values to avoid hitting the 414 URL too-long error. */ -async function listWithInFilter( - model, - inFilterField, - inFilterValues, - listOptions, - { useInOperator = true } = {} -) { +async function listWithInFilter(model, inFilterField, inFilterValues, listOptions, { useInOperator = true } = {}) { const maxUrlLength = 8192 - 1000; // Reserve some chars for the rest of URL let filterOptions, chunkPredicate; @@ -39,22 +33,17 @@ async function listWithInFilter( } else { const getFilter = value => `${inFilterField}:eq:${value}`; chunkPredicate = values => - values.map(value => `filter=${encodeURIComponent(getFilter(value))}`).join("&").length < - maxUrlLength; + values.map(value => `filter=${encodeURIComponent(getFilter(value))}`).join("&").length < maxUrlLength; filterOptions = values => ({ filter: values.map(value => `${inFilterField}:eq:${value}`), rootJunction: "OR", }); } - const filterGroups = _m(inFilterValues) - .chunkWhile(chunkPredicate) - .value(); + const filterGroups = _m(inFilterValues).chunkWhile(chunkPredicate).value(); const listOfModels = await mapPromise(filterGroups, values => { - return model - .list({ ...listOptions, ...filterOptions(values) }) - .then(collection => collection.toArray()); + return model.list({ ...listOptions, ...filterOptions(values) }).then(collection => collection.toArray()); }); return _.flatten(listOfModels); @@ -77,10 +66,7 @@ const queryInfoByField = { Supported models: userRoles, userGroups */ async function getModelValuesByField(d2, fields) { - const queryInfos = _(queryInfoByField) - .at(fields) - .compact() - .value(); + const queryInfos = _(queryInfoByField).at(fields).compact().value(); return _.fromPairs( await mapPromise(queryInfos, async ({ model, queryFields }) => [ diff --git a/src/utils/i18n.js b/src/legacy/utils/i18n.js similarity index 69% rename from src/utils/i18n.js rename to src/legacy/utils/i18n.js index 72a4f6d..a0a3554 100644 --- a/src/utils/i18n.js +++ b/src/legacy/utils/i18n.js @@ -7,15 +7,10 @@ function getCompactTextForModels(d2, models, { limit, field, i18nKey }) { if (!models) { return ""; } else if (models.length <= limit) { - return _(models) - .map(modelField) - .join(", "); + return _(models).map(modelField).join(", "); } else { return t(i18nKey || "this_and_n_others_compact", { - this: _(models) - .take(limit) - .map(modelField) - .join(", "), + this: _(models).take(limit).map(modelField).join(", "), n: models.length - limit, }); } diff --git a/src/utils/lodash-mixins.js b/src/legacy/utils/lodash-mixins.js similarity index 92% rename from src/utils/lodash-mixins.js rename to src/legacy/utils/lodash-mixins.js index 2cc29a5..647be6c 100644 --- a/src/utils/lodash-mixins.js +++ b/src/legacy/utils/lodash-mixins.js @@ -6,7 +6,7 @@ function imerge(obj1, obj2) { } function deepMerge(object, source) { - return _.mergeWith(object, source, function(objValue, srcValue) { + return _.mergeWith(object, source, function (objValue, srcValue) { if (_.isObject(objValue) && srcValue) { return deepMerge(objValue, srcValue); } @@ -53,9 +53,7 @@ function groupByKeys(objs, keys, thruFn = _.identity) { } function joinString(getTranslation, strings, maxItems, joinString) { - const base = _(strings) - .take(maxItems) - .join(joinString); + const base = _(strings).take(maxItems).join(joinString); return strings.length <= maxItems ? base : getTranslation("this_and_n_others", { this: base, n: strings.length - maxItems }); @@ -78,7 +76,7 @@ function chunkWhile(xs, predicate) { if (predicate(potentialNewCurrentGroup)) { currentGroup = potentialNewCurrentGroup; - } else if (currentGroup.length == 0) { + } else if (currentGroup.length === 0) { throw new Error(`[chunkWhile] Item does not satisfy predicate: ${x}`); } else { output.push(currentGroup); @@ -97,7 +95,6 @@ _.mixin({ cartesianProduct, groupConsecutiveBy, transpose, - imerge, groupByKeys, joinString, chunkWhile, diff --git a/src/utils/template.js b/src/legacy/utils/template.js similarity index 89% rename from src/utils/template.js rename to src/legacy/utils/template.js index 8138f9e..68b37da 100644 --- a/src/utils/template.js +++ b/src/legacy/utils/template.js @@ -1,3 +1,5 @@ +import _ from "lodash"; + export const getFromTemplate = (template, count) => { if (count && count > 0) { return _(count).times(index => template.replace("$index", index + 1)); diff --git a/src/utils/validators.js b/src/legacy/utils/validators.js similarity index 98% rename from src/utils/validators.js rename to src/legacy/utils/validators.js index e48226e..09d4ea6 100644 --- a/src/utils/validators.js +++ b/src/legacy/utils/validators.js @@ -59,6 +59,7 @@ export const toBuilderValidator = (customValidator, getErrorMessage) => { if (result.isValid) { return true; } else { + //eslint-disable-next-line const errorValue = result.hasOwnProperty("value") ? result.value : value; return getErrorMessage(errorValue, result.error); } diff --git a/src/router.js b/src/router.js deleted file mode 100644 index e0ca3fb..0000000 --- a/src/router.js +++ /dev/null @@ -1,43 +0,0 @@ -import React from "react"; -import { Router, Route, IndexRoute, hashHistory, IndexRedirect } from "react-router"; -import log from "loglevel"; -import App from "./App/App.component"; -import List from "./List/List.component"; -import { getInstance } from "d2/lib/d2"; -import listActions from "./List/list.actions"; -import { initAppState, default as appState } from "./App/appStateStore"; - -function initState({ params }) { - initAppState({ - sideBar: { - currentSection: params.groupName, - currentSubSection: params.modelType, - }, - }); -} - -function loadList({ params }, replace, callback) { - initState({ params }); - callback(); -} - -const routes = props => ( - - {_props.children}}> - - - - - - -); - -export function goToRoute(url) { - hashHistory.push(url); -} - -export function goBack() { - hashHistory.goBack(); -} - -export default routes; diff --git a/src/setupProxy.js b/src/setupProxy.js new file mode 100644 index 0000000..b0f5286 --- /dev/null +++ b/src/setupProxy.js @@ -0,0 +1,48 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { createProxyMiddleware } = require("http-proxy-middleware"); + +/* react-script automatically executes src/setupProxy.js on init. Tasks: + + - Proxy requests from /dhis2/xyz to $REACT_APP_DHIS2_BASE_URL/xyz. Reason: Avoid problems with + CORS and cross-domain cookies, as the app connects only to the local development server. + + - Redirect paths in `redirectPaths` to the original DHIS2 URL. Reason: some apps, i.e. Pivot Table App, + do not work through the proxy. Tipically, these links are rendered on iframed dashboards. +*/ + +const redirectPaths = ["/dhis-web-pivot", "/dhis-web-data-visualizer"]; + +const dhis2UrlVar = "REACT_APP_DHIS2_BASE_URL"; +const dhis2AuthVar = "REACT_APP_DHIS2_AUTH"; +const proxyLogLevel = "REACT_APP_PROXY_LOG_LEVEL"; + +module.exports = function (app) { + const targetUrl = process.env[dhis2UrlVar]; + const auth = process.env[dhis2AuthVar]; + const logLevel = process.env[proxyLogLevel] || "warn"; + + if (!targetUrl) { + console.error(`Set ${dhis2UrlVar} to base DHIS2 URL`); + process.exit(1); + } + + const proxy = createProxyMiddleware({ + target: targetUrl, + auth, + logLevel, + changeOrigin: true, + pathRewrite: { "^/dhis2/": "/" }, + onProxyReq: function (proxyReq, req, res) { + const { path } = proxyReq; + const shouldRedirect = redirectPaths.some(redirectPath => path.startsWith(redirectPath)); + + if (shouldRedirect) { + const redirectUrl = targetUrl.replace(/\/$/, "") + path; + res.location(redirectUrl); + res.sendStatus(302); + } + }, + }); + + app.use(["/dhis2"], proxy); +}; diff --git a/src/types/d2-api.ts b/src/types/d2-api.ts new file mode 100644 index 0000000..c4227b9 --- /dev/null +++ b/src/types/d2-api.ts @@ -0,0 +1,5 @@ +import { D2Api } from "@eyeseetea/d2-api/2.34"; +import { getMockApiFromClass } from "@eyeseetea/d2-api"; + +export * from "@eyeseetea/d2-api/2.34"; +export const getMockApi = getMockApiFromClass(D2Api); diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts new file mode 100644 index 0000000..c80113f --- /dev/null +++ b/src/types/d2-ui.d.ts @@ -0,0 +1,3 @@ +declare module "@dhis2/ui" { + export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; +} diff --git a/src/types/d2.d.ts b/src/types/d2.d.ts new file mode 100644 index 0000000..8de6a6b --- /dev/null +++ b/src/types/d2.d.ts @@ -0,0 +1,6 @@ +declare module "d2" { + import { D2 } from "./d2"; + + export function init(config: { baseUrl: string; headers?: any; schemas?: string[] }): D2; + export function generateUid(): string; +} diff --git a/src/types/i18n.d.ts b/src/types/i18n.d.ts new file mode 100644 index 0000000..168a99a --- /dev/null +++ b/src/types/i18n.d.ts @@ -0,0 +1,4 @@ +declare module "@dhis2/d2-i18n" { + export function t(value: string, namespace?: object): string; + export function changeLanguage(locale: string); +} diff --git a/src/types/utils.ts b/src/types/utils.ts new file mode 100644 index 0000000..2a0bbdd --- /dev/null +++ b/src/types/utils.ts @@ -0,0 +1,66 @@ +import { JSXElementConstructor, ComponentProps } from "react"; + +export type Maybe = T | undefined | null; + +export type Dictionary = Record; + +export type PartialBy = Omit & Partial>; + +export type RequireAtLeastOne = Pick> & + { + [K in Keys]-?: Required> & Partial>>; + }[Keys]; + +/* Like Partial, but recursive on object values */ +export type RecursivePartial = { + [P in keyof T]?: T[P] extends (infer U)[] + ? RecursivePartial[] + : T[P] extends object + ? RecursivePartial + : T[P]; +}; + +/* +Extract properties from an object of a certain type: + type Person = {name: string, age: number, address: string}, + type StringFields = GetPropertiesByType + // "name" | "address" +*/ +export type GetPropertiesByType = { + [Key in keyof T]: T[Key] extends FieldType ? Key : never; +}[keyof T]; + +export type RequiredProps = { + [P in keyof T]-?: NonNullable; +}; + +export type ComponentParameter< + ObjectType extends keyof JSX.IntrinsicElements | JSXElementConstructor, + Prop extends keyof ComponentProps +> = ComponentProps[Prop]; + +export function isValueInUnionType(value: S, values: readonly T[]): value is T { + return (values as readonly S[]).indexOf(value) >= 0; +} + +export function fromPairs(pairs: Array<[Key, Value]>): Record { + const empty = {} as Record; + return pairs.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), empty); +} + +export function getKeys(obj: T): Array { + return Object.keys(obj) as Array; +} + +/* Define only the value type of an object and infer the keys: + // values :: Record<"key1" | "key2", {value: string}> + const values = recordOf<{value: string}>()({ + key1: {value: "1"}, + key2: {value: "2"}, + }) +*/ +export function recordOf() { + return function (obj: { [K in keyof Obj]: T }) { + return obj; + }; +} diff --git a/src/utils/ObservedEvents.mixin.js b/src/utils/ObservedEvents.mixin.js deleted file mode 100644 index f376031..0000000 --- a/src/utils/ObservedEvents.mixin.js +++ /dev/null @@ -1,45 +0,0 @@ -import { Subject } from "rx/dist/rx.all"; -import log from "loglevel"; - -const ObservedEvents = { - getInitialState() { - this.events = {}; - this.eventSubjects = {}; - - return {}; - }, - - createEventObserver: (function createEventObserver() { - const subjectMap = new Map(); - - return function ObservedEventHandler(referenceName) { - let subject; - - if (!subjectMap.has(referenceName)) { - subject = new Subject(); - subjectMap.set(referenceName, subject); - } else { - subject = subjectMap.get(referenceName); - } - - if (!this.events[referenceName]) { - // Run a map that keeps a copy of the event - this.events[referenceName] = subject.map(event => Object.assign({}, event)); - } - - return event => { - subject.onNext(event); - }; - }; - })(), - - componentWillUnmount() { - // Complete any eventsSubjects - Object.keys(this.eventSubjects).forEach(eventSubjectKey => { - log.debug(`Completing: ${[this.constructor.name, eventSubjectKey].join(".")}`); - this.eventSubjects[eventSubjectKey].onCompleted(); - }); - }, -}; - -export default ObservedEvents; diff --git a/src/utils/ObserverRegistry.mixin.js b/src/utils/ObserverRegistry.mixin.js deleted file mode 100644 index 76694c0..0000000 --- a/src/utils/ObserverRegistry.mixin.js +++ /dev/null @@ -1,15 +0,0 @@ -const ObserverRegistry = { - componentWillMount() { - this.observerDisposables = []; - }, - - componentWillUnmount() { - this.observerDisposables.forEach(disposable => disposable.dispose()); - }, - - registerDisposable(disposable) { - this.observerDisposables.push(disposable); - }, -}; - -export default ObserverRegistry; diff --git a/src/utils/Translate.mixin.js b/src/utils/Translate.mixin.js deleted file mode 100644 index c677576..0000000 --- a/src/utils/Translate.mixin.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; - -const Translate = { - contextTypes: { - d2: React.PropTypes.object.isRequired, - }, - - getTranslation(...args) { - return this.context.d2.i18n.getTranslation(...args); - }, -}; - -export default Translate; diff --git a/src/utils/cache.ts b/src/utils/cache.ts new file mode 100644 index 0000000..36ad6fb --- /dev/null +++ b/src/utils/cache.ts @@ -0,0 +1,104 @@ +import _ from "lodash"; +import { Dictionary } from "../types/utils"; + +type ArgumentsCache = Map; +type FunctionCache = Map; +type MethodCache = Map; + +// Cache that stores a map of serialized arguments with their results under function descriptors +const methodCache: MethodCache = new Map(); +const functionCache: FunctionCache = new Map(); + +interface CacheOptions { + maxArgs?: number; +} + +// Decorator to cache class properties and methods +export const cache = (options: CacheOptions = {}): any => + function (_target: unknown, _key: string | symbol, descriptor: PropertyDescriptor) { + const prop = descriptor.value ? "value" : "get"; + const originalFunction = descriptor[prop]; + const map: FunctionCache = new Map(); + + descriptor[prop] = function (...args: unknown[]) { + // Serialize arguments to build a key + const { maxArgs = args.length } = options; + const position = Math.max(0, maxArgs); + const key = JSON.stringify(sort(args.slice(0, position))); + + // Create a new map if it's the first time the instance has been cached + if (!map.has(this)) map.set(this, new Map()); + const cache = map.get(this); + + // If there's a memoized value, return it instead of re-calculating + const memoizedValue = cache?.get(key); + if (memoizedValue) return memoizedValue; + + // Compute the default value, store it and return it + const result = originalFunction.apply(this, args); + cache?.set(key, result); + return result; + }; + + methodCache.set(descriptor[prop], map); + + return descriptor; + }; + +// Wrapper to memoize functions +export function memoize(fn: (...args: Args) => U) { + const map: ArgumentsCache = new Map(); + + const result = function (this: Obj, ...args: Args) { + const key = JSON.stringify(args); + if (map.has(key)) return map.get(key); + + const result = fn.apply(this, args); + map.set(key, result); + return result; + }; + + functionCache.set(result, map); + + return result; +} + +// Function to clear memoized storage +export const clearCache = (fn: Function, instance?: Dictionary) => { + // Clear method entries + const methodEntries = methodCache.get(fn); + if (methodEntries && !instance) throw new Error("Cache clear must forward instance"); + if (methodEntries) methodEntries?.get(instance)?.clear(); + + // Clear function entries + const functionEntries = functionCache.get(fn); + if (functionEntries) functionEntries.clear(); +}; + +// Define a lazy cached property of an object +export function defineLazyCachedProperty( + object: Obj, + name: Key, + get: () => Res +): void { + let cachedValue: Res | undefined = undefined; + + Object.defineProperty(object, name, { + get: () => { + if (!cachedValue) cachedValue = get(); + return cachedValue; + }, + enumerable: true, + configurable: true, + }); +} + +function sort(item: unknown): unknown { + if (Array.isArray(item)) { + return _(item).map(sort).sort(); + } else if (typeof item === "object") { + return _(item).mapValues(sort).toPairs().sortBy(0).fromPairs().value(); + } else { + return item; + } +} diff --git a/src/utils/codec.ts b/src/utils/codec.ts new file mode 100644 index 0000000..e6b309a --- /dev/null +++ b/src/utils/codec.ts @@ -0,0 +1,137 @@ +import { isFunction } from "lodash"; +import { + array, + Codec, + date, + Either as PurifyEither, + enumeration, + exactly, + identity, + intersect, + lazy, + Left, + maybe, + nonEmptyList, + nullable, + nullType, + number, + oneOf, + optional, + record, + Right, + string, + unknown, +} from "purify-ts"; +import { + chainCodec, + DateFromStringFormatOf, + FormattedStringFromDate, + Integer, + IntegerFromString, + Interface, + JsonFromString, + NonEmptyString, + NumberFromString, + NumberRangedIn, + StringLengthRangedIn, +} from "purify-ts-extra-codec"; +import { Either } from "../domain/entities/Either"; + +type DefaultValue = T | (() => T); + +export const decodeModel = (model: Codec, value: unknown): Either => { + try { + const either = model.decode(value); + + if (either.isRight()) { + return Either.success(either.extract()); + } + + return Either.error(either.leftOrDefault("Couldn't decode input")); + } catch (error) { + console.error(error); + return Either.error("Couldn't read JSON"); + } +}; + +const optionalSafe = (codec: Codec, defaultValue: DefaultValue): Codec => { + const decode = (input: unknown): PurifyEither => { + if (input === undefined) { + const value = isFunction(defaultValue) ? defaultValue() : defaultValue; + return PurifyEither.of(value); + } else { + return codec.decode(input); + } + }; + + // Need to force type due private _isOptional flag + return { ...codec, decode, _isOptional: true } as Codec; +}; + +const booleanFromString = Codec.custom({ + decode: value => { + if (String(value).toLowerCase() === "true") return Right(true); + if (String(value).toLowerCase() === "false") return Right(false); + return Left(`${value} is not a parsable boolean`); + }, + encode: value => `${value}`, +}); + +const undefinedType = Codec.custom({ + decode: value => (value === undefined ? Right(value) : Left(`${value} is not undefined`)), + encode: identity, + schema: () => ({ type: "null" }), +}); + +export const trueType = Codec.custom({ + decode: value => (typeof value === "boolean" && value === true ? Right(value) : Left(`${value} is not true`)), + encode: identity, + schema: () => ({ type: "boolean" }), +}); + +export const falseType = Codec.custom({ + decode: value => (typeof value === "boolean" && value === false ? Right(value) : Left(`${value} is not false`)), + encode: identity, + schema: () => ({ type: "boolean" }), +}); + +export const Schema = { + object: Interface, + stringObject: JsonFromString, + array, + nonEmptyArray: nonEmptyList, + dictionary: record, + string, + nonEmptyString: NonEmptyString, + stringLength: StringLengthRangedIn, + integer: oneOf([Integer, IntegerFromString]), + number: oneOf([number, NumberFromString]), + numberBetween: NumberRangedIn, + boolean: booleanFromString, + true: trueType, + false: falseType, + null: nullType, + undefined: undefinedType, + unknown, + date, + formattedDate: FormattedStringFromDate, + stringDate: DateFromStringFormatOf, + oneOf, + optional, + optionalSafe, + nullable, + enum: enumeration, + exact: exactly, + extend: intersect, + maybe, + chain: chainCodec, + custom: Codec.custom, + lazy, +}; + +export declare type FromType = { + [P in keyof Required]: Pick extends Required> ? T[P] : T[P] | undefined; +}; + +export { Codec, parseError as parseSchemaError } from "purify-ts"; +export type { DecodeError as SchemaDecodeError } from "purify-ts"; diff --git a/src/utils/d2-api.ts b/src/utils/d2-api.ts new file mode 100644 index 0000000..eb76e4d --- /dev/null +++ b/src/utils/d2-api.ts @@ -0,0 +1,13 @@ +import _ from "lodash"; +import { Instance } from "../data/entities/Instance"; +import { D2Api } from "../types/d2-api"; + +export function getMajorVersion(version: string): number { + const apiVersion = _.get(version.split("."), 1); + if (!apiVersion) throw new Error(`Invalid version: ${version}`); + return Number(apiVersion); +} + +export function getD2APiFromInstance(instance: Instance) { + return new D2Api({ baseUrl: instance.url, auth: instance.auth, backend: "fetch" }); +} diff --git a/src/utils/futures.ts b/src/utils/futures.ts new file mode 100644 index 0000000..067a2ed --- /dev/null +++ b/src/utils/futures.ts @@ -0,0 +1,11 @@ +import { CancelableResponse } from "@eyeseetea/d2-api/repositories/CancelableResponse"; +import { Future, FutureData } from "../domain/entities/Future"; + +export function apiToFuture(res: CancelableResponse): FutureData { + return Future.fromComputation((resolve, reject) => { + res.getData() + .then(resolve) + .catch(err => reject(err ? err.message : "Unknown error")); + return res.cancel; + }); +} diff --git a/src/utils/tests.tsx b/src/utils/tests.tsx new file mode 100644 index 0000000..0dc1a92 --- /dev/null +++ b/src/utils/tests.tsx @@ -0,0 +1,50 @@ +import { render, RenderResult } from "@testing-library/react"; +import { SnackbarProvider } from "@eyeseetea/d2-ui-components"; +import { ReactNode } from "react"; +import { getCompositionRoot } from "../CompositionRoot"; +import { getMockApi } from "../types/d2-api"; +import { AppContext, AppContextState } from "../webapp/contexts/app-context"; +import { Instance } from "../data/entities/Instance"; +import { User } from "../domain/entities/User"; + +export function getTestUser(): User { + // @ts-ignore TODO + return { + id: "xE7jOejl9FI", + name: "John Traore", + username: "admin", + userGroups: [], + userRoles: [], + }; +} + +export function getTestConfig() { + return {}; +} + +export function getTestD2() { + return {}; +} + +export function getTestContext() { + // Mock api was working with axios but not with fetch + const { api } = getMockApi(); + const instance = new Instance({ url: "http://localhost:8080" }); + const context = { + api: api, + d2: getTestD2(), + currentUser: getTestUser(), + config: getTestConfig(), + compositionRoot: getCompositionRoot(instance), + }; + + return { api, context }; +} + +export function getReactComponent(children: ReactNode, context: AppContextState): RenderResult { + return render( + + {children} + + ); +} diff --git a/src/utils/uid.ts b/src/utils/uid.ts new file mode 100644 index 0000000..8030e0e --- /dev/null +++ b/src/utils/uid.ts @@ -0,0 +1,59 @@ +import _ from "lodash"; +// @ts-ignore +import MD5 from "md5.js"; + +// DHIS2 UID :: /^[a-zA-Z][a-zA-Z0-9]{10}$/ +const asciiLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; +const asciiNumbers = "0123456789"; +const asciiLettersAndNumbers = asciiLetters + asciiNumbers; +const uidSize = 10; +const range = Array.from(new Array(uidSize).keys()); +const uidStructure = [asciiLetters, ...range.map(() => asciiLettersAndNumbers)]; +const maxHashValue = uidStructure.map(cs => cs.length).reduce((acc, n) => acc * n, 1); + +/* Return pseudo-random UID from seed string */ +export function getUid(seed: string): string { + const md5hash: string = new MD5().update(seed).digest("hex"); + const nHashChars = Math.ceil(Math.log(maxHashValue) / Math.log(16)); + const hashInteger = parseInt(md5hash.slice(0, nHashChars), 16); + const result = uidStructure.reduce( + (acc, chars) => { + const { n, uid } = acc; + const nChars = chars.length; + const quotient = Math.floor(n / nChars); + const remainder = n % nChars; + const uidChar = chars[remainder]; + return { n: quotient, uid: uid + uidChar }; + }, + { n: hashInteger, uid: "" } + ); + + return result.uid; +} + +function randomWithMax(max: number) { + return Math.floor(Math.random() * max); +} + +export function generateUid(): string { + // First char should be a letter + let randomChars = asciiLetters.charAt(randomWithMax(asciiLetters.length)); + + for (let i = 1; i <= uidSize; i += 1) { + randomChars += asciiLettersAndNumbers.charAt(randomWithMax(asciiLettersAndNumbers.length)); + } + + return randomChars; +} + +const fullUidRegex = /^[a-zA-Z]{1}[a-zA-Z0-9]{10}$/; +const uidRegex = /[a-zA-Z]{1}[a-zA-Z0-9]{10}/g; + +export function isValidUid(code: string | undefined | null): boolean { + return !!code && fullUidRegex.test(code); +} + +export function extractUids(code: string | undefined | null): string[] { + const matches = code?.matchAll(uidRegex); + return _.compact(Array.from(matches ?? []).map(([string]) => string)); +} diff --git a/src/webapp/components/page-header/PageHeader.tsx b/src/webapp/components/page-header/PageHeader.tsx new file mode 100644 index 0000000..3ab884c --- /dev/null +++ b/src/webapp/components/page-header/PageHeader.tsx @@ -0,0 +1,66 @@ +import { ButtonProps, Icon, IconButton as MUIIConButton, Tooltip } from "@material-ui/core"; +import { Variant } from "@material-ui/core/styles/createTypography"; +import Typography from "@material-ui/core/Typography"; +import { DialogButton } from "@eyeseetea/d2-ui-components"; +import React from "react"; +import i18n from "../../../locales"; +import styled from "styled-components"; + +export const PageHeader: React.FC = React.memo(props => { + const { variant = "h5", title, onBackClick, helpText, children } = props; + return ( +
+ {!!onBackClick && ( + + arrow_back + + )} + + + {title} + + + {helpText && } + + {children} +
+ ); +}); + +export interface PageHeaderProps { + variant?: Variant; + title: string; + onBackClick?: () => void; + helpText?: string; +} + +const Title = styled(Typography)` + display: inline-block; + font-weight: 300; +`; + +const Button: React.FC = ({ onClick }) => ( + + + help + + +); + +const HelpButton: React.FC<{ text: string }> = ({ text }) => ( + +); + +const IconButton = styled(MUIIConButton)` + margin-bottom: 8px; +`; + +const BackButton = styled(IconButton)` + padding-top: 10px; + margin-bottom: 5px; +`; diff --git a/src/webapp/components/share/Share.tsx b/src/webapp/components/share/Share.tsx new file mode 100644 index 0000000..0bd6959 --- /dev/null +++ b/src/webapp/components/share/Share.tsx @@ -0,0 +1,133 @@ +import React from "react"; +import logo from "./logo-eyeseetea.png"; + +interface ShareProps { + visible: boolean; +} + +interface ShareState { + expanded: boolean; + hover: boolean; +} + +class Share extends React.PureComponent { + state: ShareState = { expanded: false, hover: false }; + + toggleExpanded = () => { + this.setState({ expanded: !this.state.expanded }); + }; + + openMainPage = () => { + window.open("http://www.eyeseetea.com/", "_blank"); + }; + + openTwitter = () => { + window.open("https://twitter.com/eyeseetealtd", "_blank"); + }; + + setHover = () => { + this.setState({ hover: true }); + }; + + unsetHover = () => { + this.setState({ hover: false }); + }; + + render() { + const { visible } = this.props; + const { expanded, hover } = this.state; + const shareStyles = hover ? { ...styles.share, ...styles.shareHover } : styles.share; + + if (!visible) return null; + + return ( +
+
+ +
+ + {expanded && ( +
+

+ +

+ +

+ +

+
+ )} +
+ ); + } +} + +const styles = { + eyeseeteaShare: { + backgroundColor: "rgb(243,243,243)", + position: "fixed" as const, + bottom: "0px", + right: "100px", + borderRadius: "0px", + height: "auto", + opacity: ".85", + paddingBottom: "30px", + width: "65px", + zIndex: 10001, + textAlign: "center" as const, + }, + + eyeseeteaShareButtons: { + width: "35px", + cursor: "pointer" as const, + backgroundColor: "white", + borderradius: 0, + opacity: 1, + color: "white", + boxShadow: "none", + textShadow: "none", + border: "0px", + textAlign: "center" as const, + }, + + eyeseeteaIcon: { + width: "15px", + }, + + twitterIcon: { + color: "#477726", + fontSize: "20px", + }, + + shareTab: { + bottom: "-3px", + right: "100px", + position: "fixed" as const, + zIndex: 10002, + }, + + share: { + textShadow: "none", + backgroundColor: "#ff9800", + color: "white", + width: "65px", + height: "38.5px", + cursor: "pointer", + border: "1px solid rgba(0, 0, 0, 0.1)", + borderRadius: "2px", + backgroundClip: "padding-box", + boxShadow: "0 4px 16px rgba(0, 0, 0, 0.2)", + }, + + shareHover: { + border: "2px solid #ff9800", + }, +}; + +export default Share; diff --git a/src/webapp/components/share/logo-eyeseetea.png b/src/webapp/components/share/logo-eyeseetea.png new file mode 100644 index 0000000000000000000000000000000000000000..6368320f3edcee7d769c80f3e7ca3ec35e43a060 GIT binary patch literal 16196 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 b#j^OIh?chRB?JBekM&YX?RlA^dFcNIZM>@f literal 0 HcmV?d00001 diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx new file mode 100644 index 0000000..6f155b9 --- /dev/null +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -0,0 +1,220 @@ +import { + ConfirmationDialog, + ConfirmationDialogProps, + ObjectsList, + ObjectsTableProps, + Pager, + TableColumn, + TableConfig, + TablePagination, + TableSorting, + useObjectsTable, +} from "@eyeseetea/d2-ui-components"; +import { Icon } from "@material-ui/core"; +import { Tune } from "@material-ui/icons"; +import FileCopyIcon from "@material-ui/icons/FileCopy"; +import _ from "lodash"; +import React, { useCallback, useMemo } from "react"; +import { hasReplicateAuthority, User } from "../../../domain/entities/User"; +import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; +import copyInUserStore from "../../../legacy/List/copyInUser.store"; +import deleteUserStore from "../../../legacy/List/deleteUser.store"; +import enableStore from "../../../legacy/List/enable.store"; +import replicateUserStore from "../../../legacy/List/replicateUser.store"; +import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.store"; +import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; +import i18n from "../../../locales"; +import { useAppContext } from "../../contexts/app-context"; + +export const UserListTable: React.FC = props => { + const { compositionRoot, currentUser } = useAppContext(); + + const [dialogProps, _openDialog] = React.useState(); + + const enableReplicate = hasReplicateAuthority(currentUser); + + const baseConfig = useMemo((): TableConfig => { + return { + columns, + details: [], + actions: [ + { + name: "details", + text: i18n.t("Details"), + multiple: false, + primary: true, + }, + { + name: "copy_in_user", + text: i18n.t("Copy in user"), + icon: content_copy, + multiple: false, + onClick: user => copyInUserStore.setState({ user, open: true }), + isActive: checkAccess(["update"]), + }, + { + name: "assign_to_org_units_capture", + text: i18n.t("Assign to organisation units"), + multiple: true, + icon: business, + onClick: users => assignToOrgUnits(users, "organisationUnits", "assign_to_org_units_capture"), + isActive: checkAccess(["update"]), + }, + { + name: "assign_to_org_units_output", + text: i18n.t("Assign to data view organisation units"), + multiple: true, + icon: business, + onClick: users => + assignToOrgUnits(users, "dataViewOrganisationUnits", "assign_to_org_units_output"), + isActive: checkAccess(["update"]), + }, + { + name: "assign_roles", + text: i18n.t("Assign roles"), + multiple: true, + icon: assignment, + onClick: users => userRolesAssignmentDialogStore.setState({ users, open: true }), + isActive: checkAccess(["update"]), + }, + { + name: "assign_groups", + text: i18n.t("Assign groups"), + icon: group_add, + multiple: true, + onClick: users => userGroupsAssignmentDialogStore.setState({ users, open: true }), + isActive: checkAccess(["update"]), + }, + { + name: "edit", + text: i18n.t("Edit"), + icon: edit, + multiple: false, + onClick: user => goToUserEditPage(user), + isActive: checkAccess(["update"]), + }, + { + name: "enable", + text: i18n.t("Enable"), + icon: playlist_add_check, + multiple: true, + onClick: users => enableStore.setState({ users, action: "enable" }), + isActive: isStateActionVisible("enable"), + }, + { + name: "disable", + text: i18n.t("Disable"), + icon: block, + multiple: true, + onClick: users => enableStore.setState({ users, action: "disable" }), + isActive: isStateActionVisible("disable"), + }, + { + name: "remove", + text: i18n.t("Remove"), + icon: delete, + multiple: true, + onClick: datasets => deleteUserStore.delete(datasets), + isActive: checkAccess(["delete"]), + }, + { + name: "replicate_user_from_template", + text: i18n.t("Replicate user from template"), + icon: , + multiple: false, + onClick: users => replicateUserStore.setState({ open: true, user: users[0], type: "template" }), + isActive: () => enableReplicate, + }, + { + name: "replicate_user_from_table", + text: i18n.t("Replicate user from table"), + icon: toc, + multiple: false, + onClick: users => replicateUserStore.setState({ open: true, user: users[0], type: "table" }), + isActive: () => enableReplicate, + }, + ], + globalActions: [ + { + name: "open-settings", + text: i18n.t("Settings"), + icon: , + onClick: () => props.openSettings(), + }, + ], + // TODO: Bug in ObjectsList + initialSorting: { + field: "firstName", + order: "asc", + }, + initialState: { + sorting: { + field: "firstName", + order: "asc", + }, + }, + paginationOptions: { + pageSizeOptions: [10, 25, 50, 100], + pageSizeInitialValue: 25, + }, + searchBoxLabel: i18n.t("Search by name"), + }; + }, [props, enableReplicate]); + + const refreshRows = useCallback( + ( + _search: string, + _paging: TablePagination, + _sorting: TableSorting + ): Promise<{ objects: User[]; pager: Pager }> => { + return compositionRoot.users.list().toPromise(); + }, + [compositionRoot] + ); + + const tableProps = useObjectsTable(baseConfig, refreshRows); + + return ( + + {dialogProps && } + + {props.children} + + ); +}; + +export const columns: TableColumn[] = [ + { name: "firstName", sortable: true, text: i18n.t("First name") }, + { name: "surname", sortable: true, text: i18n.t("Surname") }, + { name: "username", sortable: false, text: i18n.t("Username") }, + { name: "email", sortable: false, text: i18n.t("Email") }, + { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, + { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, + { name: "userRoles", sortable: false, text: i18n.t("Roles"), hidden: true }, + { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, + { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, + { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, + { name: "lastLogin", sortable: false, text: i18n.t("Last login") }, + { name: "disabled", sortable: false, text: i18n.t("Disabled") }, +]; + +function checkAccess(requiredKeys: string[]) { + return (users: User[]) => + _(users).every(user => { + const permissions = _(user.access).pickBy().keys().value(); + return _(requiredKeys).difference(permissions).isEmpty(); + }); +} + +function isStateActionVisible(action: string) { + const currentUserHasUpdateAccessOn = checkAccess(["update"]); + const requiredDisabledValue = action === "enable"; + + return (users: User[]) => + currentUserHasUpdateAccessOn(users) && _(users).some(user => user.disabled === requiredDisabledValue); +} + +type BaseTableProps = Pick, "loading">; +export interface UserListTableProps extends BaseTableProps { + openSettings: () => void; +} diff --git a/src/webapp/contexts/app-context.ts b/src/webapp/contexts/app-context.ts new file mode 100644 index 0000000..b5752b0 --- /dev/null +++ b/src/webapp/contexts/app-context.ts @@ -0,0 +1,22 @@ +import React, { useContext } from "react"; +import { CompositionRoot } from "../../CompositionRoot"; +import { User } from "../../domain/entities/User"; +import { D2Api } from "../../types/d2-api"; + +export interface AppContextState { + api: D2Api; + d2: any; + currentUser: User; + compositionRoot: CompositionRoot; +} + +export const AppContext = React.createContext(null); + +export function useAppContext() { + const context = useContext(AppContext); + if (context) { + return context; + } else { + throw new Error("App context uninitialized"); + } +} diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx new file mode 100644 index 0000000..568f066 --- /dev/null +++ b/src/webapp/pages/Router.tsx @@ -0,0 +1,21 @@ +import React from "react"; +import { HashRouter, Route, Switch } from "react-router-dom"; +import { LegacyAppWrapper } from "../../legacy/LegacyApp"; +import { ListHybrid } from "../../legacy/List/List.component"; + +export const Router: React.FC = React.memo(() => { + return ( + + + ( + + + + )} + /> + + + ); +}); diff --git a/src/webapp/pages/app/App.css b/src/webapp/pages/app/App.css new file mode 100644 index 0000000..e40776a --- /dev/null +++ b/src/webapp/pages/app/App.css @@ -0,0 +1,16 @@ +html { + background-color: #f3f3f3; + font-family: Roboto, Arial, sans-serif; +} + +body { + margin: 0; +} + +li { + line-height: 1.75; +} + +.content { + margin: 20px; +} diff --git a/src/webapp/pages/app/App.tsx b/src/webapp/pages/app/App.tsx new file mode 100644 index 0000000..c6571a4 --- /dev/null +++ b/src/webapp/pages/app/App.tsx @@ -0,0 +1,81 @@ +import { HeaderBar } from "@dhis2/ui"; +import { SnackbarProvider } from "@eyeseetea/d2-ui-components"; +import { MuiThemeProvider } from "@material-ui/core/styles"; +import _ from "lodash"; +//@ts-ignore +import OldMuiThemeProvider from "material-ui/styles/MuiThemeProvider"; +import React, { useEffect, useState } from "react"; +import { appConfig } from "../../../app-config"; +import { getCompositionRoot } from "../../../CompositionRoot"; +import { Instance } from "../../../data/entities/Instance"; +import { D2Api } from "../../../types/d2-api"; +import Share from "../../components/share/Share"; +import { AppContext, AppContextState } from "../../contexts/app-context"; +import { Router } from "../Router"; +import "./App.css"; +import { AppConfig } from "./AppConfig"; +import muiThemeLegacy from "./themes/dhis2-legacy.theme"; +import { muiTheme } from "./themes/dhis2.theme"; + +export interface AppProps { + api: D2Api; + d2: D2; + instance: Instance; +} + +export const App: React.FC = React.memo(function App({ api, d2, instance }) { + const [showShareButton, setShowShareButton] = useState(false); + const [loading, setLoading] = useState(true); + const [appContext, setAppContext] = useState(null); + + useEffect(() => { + async function setup() { + const compositionRoot = getCompositionRoot(instance); + const { data: currentUser } = await compositionRoot.users.getCurrent().runAsync(); + if (!currentUser) throw new Error("User not logged in"); + + const isShareButtonVisible = _(appConfig).get("appearance.showShareButton") || false; + + // TODO: Remove d2 + setAppContext({ d2, api, currentUser, compositionRoot }); + setShowShareButton(isShareButtonVisible); + initFeedbackTool(d2, appConfig); + setLoading(false); + } + setup(); + }, [d2, api, instance]); + + if (loading) return null; + + return ( + + + + + +
+ + + +
+ + +
+
+
+ ); +}); + +type D2 = object; + +function initFeedbackTool(d2: D2, appConfig: AppConfig): void { + const appKey = _(appConfig).get("appKey"); + + if (appConfig && appConfig.feedback) { + const feedbackOptions = { + ...appConfig.feedback, + i18nPath: "feedback-tool/i18n", + }; + window.$.feedbackDhis2(d2, appKey, feedbackOptions); + } +} diff --git a/src/webapp/pages/app/AppConfig.ts b/src/webapp/pages/app/AppConfig.ts new file mode 100644 index 0000000..e861158 --- /dev/null +++ b/src/webapp/pages/app/AppConfig.ts @@ -0,0 +1,21 @@ +export interface AppConfig { + appKey: string; + appearance: { + showShareButton: boolean; + }; + feedback?: { + token: string[]; + createIssue: boolean; + sendToDhis2UserGroups: string[]; + issues: { + repository: string; + title: string; + body: string; + }; + snapshots: { + repository: string; + branch: string; + }; + feedbackOptions: object; + }; +} diff --git a/src/webapp/pages/app/themes/dhis2-legacy.theme.ts b/src/webapp/pages/app/themes/dhis2-legacy.theme.ts new file mode 100644 index 0000000..7d4ed0d --- /dev/null +++ b/src/webapp/pages/app/themes/dhis2-legacy.theme.ts @@ -0,0 +1,63 @@ +import { + cyan100, + cyan500, + cyan700, + darkBlack, + grey100, + grey400, + grey500, + orange500, + white, +} from "material-ui/styles/colors"; +import { fade } from "material-ui/utils/colorManipulator"; +import Spacing from "material-ui/styles/spacing"; +import getMuiTheme from "material-ui/styles/getMuiTheme"; +import { MuiTheme } from "material-ui/styles"; + +const theme = { + spacing: Spacing, + fontFamily: "Roboto, sans-serif", + palette: { + primary1Color: cyan500, + primary2Color: cyan700, + primary3Color: cyan100, + accent1Color: orange500, + accent2Color: grey100, + accent3Color: grey500, + textColor: darkBlack, + alternateTextColor: white, + canvasColor: white, + borderColor: grey400, + disabledColor: fade(darkBlack, 0.3), + }, +}; + +function createAppTheme(style: MuiTheme) { + return { + sideBar: { + backgroundColor: "#F3F3F3", + backgroundColorItem: "transparent", + backgroundColorItemActive: style.palette?.accent2Color, + textColor: style.palette?.textColor, + textColorActive: "#276696", + borderStyle: "1px solid #e1e1e1", + }, + forms: { + minWidth: 350, + maxWidth: 900, + }, + formFields: { + secondaryColor: style.palette?.accent3Color, + }, + tabs: { + backgroundColor: "#E4E4E4", + inkBarColor: style.palette?.accent1Color, + textColor: "#666666", + }, + }; +} + +const muiTheme = getMuiTheme(theme); +const appTheme = createAppTheme(muiTheme); + +export default Object.assign({}, muiTheme, appTheme); diff --git a/src/webapp/pages/app/themes/dhis2.theme.ts b/src/webapp/pages/app/themes/dhis2.theme.ts new file mode 100644 index 0000000..cd14680 --- /dev/null +++ b/src/webapp/pages/app/themes/dhis2.theme.ts @@ -0,0 +1,91 @@ +import { createTheme } from "@material-ui/core/styles"; + +// Color palette from https://projects.invisionapp.com/share/A7LT4TJYETS#/screens/302550228_Color +export const colors = { + accentPrimary: "#1976d2", + accentPrimaryDark: "#004BA0", + accentPrimaryLight: "#63A4FF", + accentPrimaryLightest: "#EAF4FF", + + accentSecondary: "#fb8c00", + accentSecondaryLight: "#f57c00", + accentSecondaryDark: "#ff9800", + + black: "#000000", + greyBlack: "#494949", + grey: "#9E9E9E", + greyLight: "#E0E0E0", + greyDisabled: "#8E8E8E", + blueGrey: "#ECEFF1", + snow: "#F4F6F8", + white: "#FFFFFF", // Not included in palette! + + negative: "#E53935", + warning: "#F19C02", + positive: "#3D9305", + info: "#EAF4FF", +}; + +export const palette = { + common: { + white: colors.white, + black: colors.black, + }, + action: { + active: colors.greyBlack, + disabled: colors.greyDisabled, + }, + text: { + primary: colors.black, + secondary: colors.greyBlack, + disabled: colors.greyDisabled, + hint: colors.grey, + }, + primary: { + main: colors.accentPrimary, + dark: colors.accentPrimaryDark, + light: colors.accentPrimaryLight, + lightest: colors.accentPrimaryLightest, // Custom extension, not used by default + // contrastText: 'white', + }, + secondary: { + main: colors.accentSecondary, + light: colors.accentSecondaryLight, + dark: colors.accentSecondaryDark, + contrastText: "#fff", + }, + error: { + main: colors.negative, // This is automatically expanded to main/light/dark/contrastText, what do we use here? + }, + status: { + //Custom colors collection, not used by default in MUI + negative: colors.negative, + warning: colors.warning, + positive: colors.positive, + info: colors.info, + }, + background: { + paper: colors.white, + default: colors.snow, + grey: "#FCFCFC", + hover: colors.greyLight, + }, + divider: colors.greyLight, + shadow: colors.grey, +}; + +export const muiTheme = createTheme({ + // colors, + palette, + typography: { + fontFamily: "Roboto, Helvetica, Arial, sans-serif", + // useNextVariants: true, + }, + overrides: { + MuiDivider: { + light: { + backgroundColor: palette.divider, // No light dividers for now + }, + }, + }, +}); diff --git a/src/webapp/utils/wdyr.ts b/src/webapp/utils/wdyr.ts new file mode 100644 index 0000000..3eeeb4f --- /dev/null +++ b/src/webapp/utils/wdyr.ts @@ -0,0 +1,11 @@ +/// + +import React from "react"; + +if (process.env.NODE_ENV === "development") { + const whyDidYouRender = require("@welldone-software/why-did-you-render"); + + whyDidYouRender(React, { + trackAllPureComponents: true, + }); +} diff --git a/test/App/App.component.test.js b/test/App/App.component.test.js deleted file mode 100644 index d7bbe43..0000000 --- a/test/App/App.component.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react/addons'; -import {element} from 'd2-testutils'; -import App from '../../src/App/App.component'; - -const TestUtils = React.addons.TestUtils; - -describe('App component', () => { - let appComponent; - - beforeEach(() => { - appComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have the component name as a class', () => { - expect(element(appComponent.getDOMNode()).hasClass('app')).to.be.true; - }); -}); diff --git a/test/HeaderBar/HeaderBar.component.test.js b/test/HeaderBar/HeaderBar.component.test.js deleted file mode 100644 index 1c7c4ae..0000000 --- a/test/HeaderBar/HeaderBar.component.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react/addons'; -import {element} from 'd2-testutils'; -import HeaderBar from '../../src/HeaderBar/HeaderBar.component'; - -const TestUtils = React.addons.TestUtils; - -describe('HeaderBar component', () => { - let headerBarComponent; - - beforeEach(() => { - headerBarComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have the component name as a class', () => { - expect(element(headerBarComponent.getDOMNode()).hasClass('header-bar')).to.be.true; - }); -}); diff --git a/test/List/DetailsBox.component.test.js b/test/List/DetailsBox.component.test.js deleted file mode 100644 index c381e31..0000000 --- a/test/List/DetailsBox.component.test.js +++ /dev/null @@ -1,182 +0,0 @@ -import React from 'react/addons'; -import {element} from 'd2-testutils'; -import dataElementObjectFixture from './dataElementObject.fixture'; -import DetailsBox from '../src/DetailsBox.component'; -import injectTheme from './inject-theme'; - -const TestUtils = React.addons.TestUtils; -const findDOMNode = React.findDOMNode; - -describe('DetailsBox component', () => { - let DetailsBoxWithContext; - let detailsBoxComponent; - let dataElementObject; - - beforeEach(() => { - dataElementObject = dataElementObjectFixture(); - - DetailsBoxWithContext = injectTheme(DetailsBox); - - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have the component name as a class', () => { - expect(element(detailsBoxComponent.getDOMNode()).hasClass('details-box')).to.be.true; - }); - - it('should render an empty object when showDetailsBox=false', () => { - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - - expect(findDOMNode(detailsBoxComponent)).to.equal(null); - }); - - it('should render the details box when showDetailBox=true', () => { - expect(findDOMNode(detailsBoxComponent)).not.to.equal(null); - }); - - it('should display "No source" if the source is not there yet', () => { - expect(findDOMNode(detailsBoxComponent).querySelector('.detail-box__status').textContent).to.equal('Loading details...'); - }); - - describe('default rendered properties', () => { - beforeEach(() => { - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should render name', () => { - const nameElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__displayName'); - expect(nameElement.textContent).to.equal('BS_COLL (N, DSD) TARGET: Blood Units Donated'); - }); - - it('should render code', () => { - const nameElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__code'); - expect(nameElement.textContent).to.equal('BS_COLL_N_DSD_TARGET7'); - }); - - it('should render description', () => { - const discriptionElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__displayDescription'); - expect(discriptionElement.textContent).to.equal('Target the total number of blood units that were donated in the country National Blood Transfusion Service (NBTS) network.'); - }); - - it('should render created', () => { - const createdElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__created'); - expect(createdElement.textContent).to.equal('2014-12-21T23:15:50.886+0000'); - }); - - it('should render lastUpdated', () => { - const lastUpdatedElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__lastUpdated'); - - expect(lastUpdatedElement.textContent).to.equal('2015-09-15T11:03:24.367+0000'); - }); - - it('should render id', () => { - const idElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__id'); - expect(idElement.textContent).to.equal('umC9U5YGDq4'); - }); - - it('should render a the detail-field__label class for each of the labels', () => { - const elements = findDOMNode(detailsBoxComponent).querySelectorAll('.detail-field .detail-field__label'); - expect(elements.length).to.equal(6); - }); - - it('should render a detail-field__value for each of the value fields', () => { - const elements = findDOMNode(detailsBoxComponent).querySelectorAll('.detail-field .detail-field__value'); - expect(elements.length).to.equal(6); - }); - }); - - describe('specified fields', () => { - beforeEach(() => { - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have rendered three fields', () => { - const detailElements = findDOMNode(detailsBoxComponent).querySelectorAll('.detail-field '); - expect(detailElements.length).to.equal(3); - }); - }); - - describe('rendering values', () => { - beforeEach(() => { - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should render an array of objects as a string of names', () => { - const dataSetNameElements = findDOMNode(detailsBoxComponent).querySelectorAll('.detail-field .detail-field__dataSets ul li'); - - expect(dataSetNameElements.length).to.equal(5); - expect(dataSetNameElements[0].textContent).to.equal('MER Targets: Facility Based - DoD ONLY'); - expect(dataSetNameElements[4].textContent).to.equal('MER Targets: Facility Based'); - }); - - it('should render the displayName when it is available', () => { - dataElementObject.dataSets[0].displayName = 'MER Targets: Facility Based - DoD ONLY: Translated'; - - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - - const dataSetNameElements = findDOMNode(detailsBoxComponent).querySelectorAll('.detail-field .detail-field__dataSets ul li'); - expect(dataSetNameElements.length).to.equal(5); - expect(dataSetNameElements[0].textContent).to.equal('MER Targets: Facility Based - DoD ONLY: Translated'); - }); - - it('should render the stringified date', () => { - dataElementObject.created = '2015-09-15'; - - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - const createdElement = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__created'); - - expect(createdElement.textContent).to.equal('Tue Sep 15 2015 02:00:00 GMT+0200 (CEST)'); - }); - - it('should render a label for each of the values', () => { - const createdElementLabel = findDOMNode(detailsBoxComponent).querySelector('.detail-field .detail-field__created-label'); - - expect(createdElementLabel.textContent).to.equal('created'); - }); - }); - - describe('onClose prop', () => { - let closeButtonCallback; - - beforeEach(() => { - closeButtonCallback = spy(); - - detailsBoxComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should display the close icon', () => { - const closeButtonElement = findDOMNode(detailsBoxComponent).querySelector('.details-box__close-button.material-icons'); - - expect(closeButtonElement.textContent).to.equal('close'); - }); - - it('should just render one close button', () => { - const closeButtonElement = findDOMNode(detailsBoxComponent).querySelectorAll('.details-box__close-button.material-icons'); - - expect(closeButtonElement.length).to.equal(1); - }); - - it('should be called when the close button was called', () => { - const closeButtonElement = findDOMNode(detailsBoxComponent).querySelector('.details-box__close-button'); - TestUtils.Simulate.click(closeButtonElement); - - expect(closeButtonCallback).to.be.called; - }); - }); -}); diff --git a/test/List/List.component.test.js b/test/List/List.component.test.js deleted file mode 100644 index 3b810dd..0000000 --- a/test/List/List.component.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react/addons'; -import {element} from 'd2-testutils'; -import List from '../../src/List/List.component'; - -const TestUtils = React.addons.TestUtils; - -describe('List component', () => { - let listComponent; - - beforeEach(() => { - listComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have the component name as a class', () => { - expect(element(listComponent.getDOMNode()).hasClass('list')).to.be.true; - }); -}); diff --git a/test/List/dataElementObject.fixture.js b/test/List/dataElementObject.fixture.js deleted file mode 100644 index 8c4a397..0000000 --- a/test/List/dataElementObject.fixture.js +++ /dev/null @@ -1,153 +0,0 @@ -export default function dataElementObjectFixture() { - return JSON.parse(`{ - "code": "BS_COLL_N_DSD_TARGET7", - "lastUpdated": "2015-09-15T11:03:24.367+0000", - "href": "http://localhost:8080/dhis/api/dataElements/umC9U5YGDq4", - "id": "umC9U5YGDq4", - "created": "2014-12-21T23:15:50.886+0000", - "name": "BS_COLL (N, DSD) TARGET: Blood Units Donated", - "shortName": "BS_COLL (N, DSD) TARGET7", - "aggregationType": "SUM", - "dimensionType": "PROGRAM_DATAELEMENT", - "domainType": "AGGREGATE", - "displayName": "BS_COLL (N, DSD) TARGET: Blood Units Donated", - "publicAccess": "--------", - "description": "Target the total number of blood units that were donated in the country National Blood Transfusion Service (NBTS) network.", - "displayShortName": "BS_COLL (N, DSD) TARGET7", - "externalAccess": false, - "valueType": "INTEGER", - "dimension": "umC9U5YGDq4", - "displayDescription": "Target the total number of blood units that were donated in the country National Blood Transfusion Service (NBTS) network.", - "allItems": false, - "zeroIsSignificant": true, - "url": "", - "aggregationOperator": "sum", - "dataDimension": true, - "optionSetValue": true, - "access": {"read": true, "update": true, "externalize": false, "delete": true, "write": true, "manage": true}, - "optionSet": { - "id": "P5T6XLxAMuT", - "name": "EA Point of Service", - "created": "2014-06-30T15:27:07.998+0000", - "lastUpdated": "2014-06-30T15:27:07.998+0000", - "href": "http://localhost:8080/dhis/api/optionSets/P5T6XLxAMuT" - }, - "categoryCombo": { - "id": "bjDvmb4bfuf", - "name": "default", - "created": "2014-01-28T17:43:51.405+0000", - "lastUpdated": "2015-02-19T13:50:59.543+0000", - "href": "http://localhost:8080/dhis/api/categoryCombos/bjDvmb4bfuf" - }, - "commentOptionSet": { - "id": "P5T6XLxAMuT", - "name": "EA Point of Service", - "created": "2014-06-30T15:27:07.998+0000", - "lastUpdated": "2014-06-30T15:27:07.998+0000", - "href": "http://localhost:8080/dhis/api/optionSets/P5T6XLxAMuT" - }, - "user": { - "id": "kwwcGq36yOZ", - "name": "Jim Grace", - "created": "2014-01-29T00:45:59.984+0000", - "lastUpdated": "2015-04-13T12:51:14.865+0000", - "href": "http://localhost:8080/dhis/api/users/kwwcGq36yOZ" - }, - "userGroupAccesses": [{"access": "r-------", "userGroupUid": "c6hGi8GEZot"}], - "attributeValues": [{ - "lastUpdated": "2015-09-15T11:03:25.798+0000", - "created": "2015-09-14T10:29:07.383+0000", - "value": "123", - "attribute": { - "id": "FpoWdhxCMwH", - "name": "marktribute", - "code": "marktribute3", - "created": "2015-08-24T13:15:09.589+0000", - "lastUpdated": "2015-09-15T10:19:28.280+0000" - } - }, { - "lastUpdated": "2015-09-15T11:03:25.971+0000", - "created": "2015-09-14T10:34:26.131+0000", - "value": "", - "attribute": { - "id": "tpA3Ngyvp9N", - "name": "marktribute2", - "code": "marktribute2", - "created": "2015-08-27T08:27:02.743+0000", - "lastUpdated": "2015-08-31T16:30:14.953+0000" - } - }, { - "lastUpdated": "2015-09-15T11:03:25.862+0000", - "created": "2015-09-14T10:29:07.470+0000", - "value": "John", - "attribute": { - "id": "S8a2OBRnqEc", - "name": "name", - "created": "2015-08-31T16:15:23.963+0000", - "lastUpdated": "2015-08-31T16:30:24.234+0000" - } - }, { - "lastUpdated": "2015-09-15T11:03:25.915+0000", - "created": "2015-09-14T10:29:07.519+0000", - "value": "Medium", - "attribute": { - "id": "Rin3jjx18PI", - "name": "select", - "code": "select", - "created": "2015-09-09T11:20:13.173+0000", - "lastUpdated": "2015-09-09T11:20:13.173+0000" - } - }], - "dataElementGroups": [{ - "id": "mLYVq09X8i6", - "name": "All SIMS Above Site", - "created": "2015-03-23T15:52:46.438+0000", - "lastUpdated": "2015-09-14T10:33:32.806+0000", - "href": "http://localhost:8080/dhis/api/dataElementGroups/mLYVq09X8i6" - }, { - "id": "RXqZwdvvXav", - "name": "All SI - Targets Narratives (DSD, TA)", - "created": "2015-03-19T15:28:45.337+0000", - "lastUpdated": "2015-09-14T10:29:07.362+0000", - "href": "http://localhost:8080/dhis/api/dataElementGroups/RXqZwdvvXav" - }], - "dataSets": [{ - "id": "JXKUYJqmyDd", - "name": "MER Targets: Facility Based - DoD ONLY", - "code": "MER_TARGETS_SITE_FY15_DOD", - "created": "2015-01-28T04:27:57.550+0000", - "lastUpdated": "2015-09-14T10:29:07.092+0000", - "href": "http://localhost:8080/dhis/api/dataSets/JXKUYJqmyDd" - }, { - "id": "xxo1G5V1JG2", - "name": "MER Targets: Operating Unit Level (IM)", - "code": "MER_TARGETS_OU_IM_FY15", - "created": "2014-10-01T11:46:59.588+0000", - "lastUpdated": "2015-09-14T10:29:07.097+0000", - "href": "http://localhost:8080/dhis/api/dataSets/xxo1G5V1JG2" - }, { - "id": "lbwuIo56YoG", - "name": "MER Targets: Community Based - DoD ONLY", - "code": "MER_TARGETS_SUBNAT_FY15_DOD", - "created": "2015-01-28T01:19:13.837+0000", - "lastUpdated": "2015-09-14T10:29:07.100+0000", - "href": "http://localhost:8080/dhis/api/dataSets/lbwuIo56YoG" - }, { - "id": "tCIW2VFd8uu", - "name": "MER Targets: Community Based", - "code": "MER_TARGETS_SUBNAT_FY15", - "created": "2014-09-27T17:44:34.834+0000", - "lastUpdated": "2015-09-14T10:29:07.102+0000", - "href": "http://localhost:8080/dhis/api/dataSets/tCIW2VFd8uu" - }, { - "id": "qRvKHvlzNdv", - "name": "MER Targets: Facility Based", - "code": "MER_TARGETS_SITE_FY15", - "created": "2014-09-23T15:22:46.107+0000", - "lastUpdated": "2015-09-14T10:29:07.104+0000", - "href": "http://localhost:8080/dhis/api/dataSets/qRvKHvlzNdv" - }], - "aggregationLevels": [1, 2, 8], - "items": [] - }`); -} diff --git a/test/List/list.store.test.js b/test/List/list.store.test.js deleted file mode 100644 index d8c266d..0000000 --- a/test/List/list.store.test.js +++ /dev/null @@ -1,3 +0,0 @@ -describe('Store: listStore', () => { - -}); diff --git a/test/MainContent/MainContent.component.test.js b/test/MainContent/MainContent.component.test.js deleted file mode 100644 index 1255e53..0000000 --- a/test/MainContent/MainContent.component.test.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react/addons'; -import {element} from 'd2-testutils'; -import MainContent from '../../src/MainContent/MainContent.component'; - -const TestUtils = React.addons.TestUtils; - -describe('MainContent component', () => { - let mainContentComponent; - - beforeEach(() => { - mainContentComponent = TestUtils.renderIntoDocument( - - ); - }); - - it('should have the component name as a class', () => { - expect(element(mainContentComponent.getDOMNode()).hasClass('main-content')).to.be.true; - }); -}); diff --git a/test/config/inject-theme.js b/test/config/inject-theme.js deleted file mode 100644 index 731c7e2..0000000 --- a/test/config/inject-theme.js +++ /dev/null @@ -1,12 +0,0 @@ -import stubContext from 'react-stub-context'; -import ThemeManager from 'material-ui/lib/styles/theme-manager'; - -const Manager = new ThemeManager(); - - -function injectTheme(Component, theme) { - const injectedTheme = theme || Manager.getCurrentTheme(); - return stubContext(Component, {muiTheme: injectedTheme}); -} - -export default injectTheme; diff --git a/test/config/karma.config.js b/test/config/karma.config.js deleted file mode 100644 index f88d646..0000000 --- a/test/config/karma.config.js +++ /dev/null @@ -1,64 +0,0 @@ -module.exports = function karmaConfig( config ) { - config.set({ - basePath: '../../', - - // Frameworks to use with karma - frameworks: ['mocha', 'chai', 'sinon-chai', 'sinon'], - - // How will the results of the tests be reported (coverage reporter generates the coverage) - reporters: ['mocha', 'coverage'], - - preprocessors: { - // source files, that you wanna generate coverage for - // do not include tests or libraries - // (these files will be instrumented by Istanbul) - 'src/**/*.js': ['babel'], - 'test/*': ['webpack'], - }, - - // optionally, configure the reporter - coverageReporter: { - type: 'lcov', - dir: './coverage/', - subdir: function flattenBrowserName(browser) { - // normalization process to keep a consistent browser name accross different OS - return browser.toLowerCase().split(/[ /-]/)[0]; - }, - }, - - babelPreprocessor: { - options: { - sourceMap: 'inline', - }, - }, - - webpack: { - context: __dirname, - module: { - loaders: [ - { - test: /.+?/, - exclude: /(node_modules)/, - loader: 'babel', - query: { - stage: 2, - }, - }, - ], - }, - }, - - // Files that should be included by karma - files: [ - './node_modules/phantomjs-polyfill/bind-polyfill.js', - './node_modules/babel-core/browser-polyfill.js', - 'test/index.js', - 'src/**/*.js', - ], - - logLevel: config.LOG_INFO, - - browsers: ['PhantomJS'], - singleRun: false, - }); -}; diff --git a/test/config/testSetup.js b/test/config/testSetup.js deleted file mode 100644 index a0c9eb3..0000000 --- a/test/config/testSetup.js +++ /dev/null @@ -1,13 +0,0 @@ -const global = window; - -beforeEach(function beforeEachSetup() { - this.sandbox = global.sinon.sandbox.create(); - global.stub = this.sandbox.stub.bind(this.sandbox); - global.spy = this.sandbox.spy.bind(this.sandbox); -}); - -afterEach(function afterEachSetup() { - delete global.stub; - delete global.spy; - this.sandbox.restore(); -}); diff --git a/test/index.js b/test/index.js deleted file mode 100644 index ac90c7c..0000000 --- a/test/index.js +++ /dev/null @@ -1,2 +0,0 @@ -const testsContext = require.context('.', true, /\.test$/); -testsContext.keys().forEach(testsContext); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a440a74 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es2015", + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "noImplicitAny": true, + "jsx": "react-jsx", + "noUnusedParameters": false, + "noUnusedLocals": false, + "strictNullChecks": true, + "noUncheckedIndexedAccess": true, + "experimentalDecorators": true, + "noFallthroughCasesInSwitch": true, + "lib": ["dom", "dom.iterable", "esnext"] + }, + "include": ["src"] +} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 39a05f0..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,154 +0,0 @@ -"use strict"; - -var webpack = require("webpack"); -var HtmlWebpackPlugin = require("html-webpack-plugin"); -var path = require("path"); -var colors = require("colors"); - -const isDevBuild = process.argv[1].indexOf("webpack-dev-server") !== -1; -const dhisConfigPath = process.env.DHIS2_HOME - ? `${process.env.DHIS2_HOME}/config` - : `${__dirname}/config`; -var dhisConfig; - -try { - dhisConfig = require(dhisConfigPath); - console.log("\nLoaded DHIS config:"); -} catch (e) { - // Failed to load config file - use default config - console.warn(`\nWARNING! Failed to load DHIS config:`, e.message); - console.info("Using default config"); - dhisConfig = { - baseUrl: "http://localhost:8080", - authorization: "Basic YWRtaW46ZGlzdHJpY3Q=", // admin:district - }; -} -console.log(JSON.stringify(dhisConfig, null, 2), "\n"); - -function bypass(req, res, opt) { - req.headers.Authorization = dhisConfig.authorization; - console.log( - "[PROXY]".cyan.bold, - req.method.green.bold, - req.url.magenta, - "=>".dim, - opt.target.dim - ); -} - -const webpackConfig = { - context: __dirname, - contentBase: __dirname, - entry: "./src/app.js", - devtool: "source-map", - output: { - path: __dirname + "/build", - filename: "app.js", - publicPath: isDevBuild ? "/" : "", - }, - module: { - loaders: [ - { - test: /\.jsx?$/, - exclude: /node_modules/, - loader: "babel", - query: { - presets: ["es2015", "stage-0", "react"], - }, - }, - { - test: /\.css$/, - loader: "style!css", - }, - { - test: /\.scss$/, - loader: "style!css!sass", - }, - { - test: /\.(png|jp(e*)g|svg)$/, - loader: "url-loader", - options: { - limit: 8000, // Convert images < 8kb to base64 strings - name: "images/[hash]-[name].[ext]", - }, - }, - ], - }, - resolve: { - alias: { - react: path.resolve("./node_modules/react"), - "material-ui": path.resolve("./node_modules/material-ui"), - d2: path.resolve("./node_modules/d2"), - }, - }, - devServer: { - progress: true, - colors: true, - port: 8081, - inline: true, - compress: true, - proxy: [ - { path: "/api/**", target: dhisConfig.baseUrl, bypass }, - { path: "/dhis-web-commons/**", target: dhisConfig.baseUrl, bypass }, - { path: "/dhis-web-core-resource/**", target: dhisConfig.baseUrl, bypass }, - { path: "/icons/**", target: dhisConfig.baseUrl, bypass }, - { path: "/i18n/**", target: "http://localhost:8081/src", bypass }, - { - path: "/jquery.min.js", - target: "http://localhost:8081/node_modules/jquery/dist", - bypass, - }, - { - path: "/polyfill.min.js", - target: "http://localhost:8081/node_modules/babel-polyfill/dist", - bypass, - }, - ], - }, -}; - -if (!isDevBuild) { - webpackConfig.plugins = [ - // Replace any occurance of process.env.NODE_ENV with the string 'production' - new webpack.DefinePlugin({ - "process.env.NODE_ENV": '"production"', - DHIS_CONFIG: JSON.stringify({}), - }), - new webpack.optimize.DedupePlugin(), - new webpack.optimize.OccurenceOrderPlugin(), - new webpack.optimize.UglifyJsPlugin({ - // compress: { - // warnings: false, - // }, - comments: false, - beautify: true, - }), - ]; -} else { - webpackConfig.plugins = [ - new webpack.DefinePlugin({ - DHIS_CONFIG: JSON.stringify(dhisConfig), - }), - ]; -} - -// Generates an `index.html` file with the ` - : ``; - }) - .join("\n"), - }) -); - -module.exports = webpackConfig; diff --git a/yarn.lock b/yarn.lock index 5ac6e62..4e54c08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,2172 +2,5905 @@ # yarn lockfile v1 -"@types/prop-types@*": - version "15.5.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@>=16": - version "16.4.13" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.13.tgz#1385f5dc3486aa493849a32ccce626a817543e28" - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@7.12.3": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -abbrev@1, abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +"@babel/core@7.15.5", "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.6.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.4": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" -accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" +"@babel/generator@^7.12.1", "@babel/generator@^7.15.4", "@babel/generator@^7.7.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" + "@babel/types" "^7.15.4" + jsesc "^2.5.1" + source-map "^0.5.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: - acorn "^3.0.4" - -acorn@^3.0.0, acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.2.1, acorn@^5.4.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + "@babel/types" "^7.15.4" -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - -ajv-errors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" - -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - -ajv@^4.7.0, ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" -ajv@^5.1.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" -ajv@^6.1.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" -alter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" + integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1", "@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== + dependencies: + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" + integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" + integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" + integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.12.1" + +"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" + integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== dependencies: - stable "~0.1.3" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.15.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -ansi-styles@^2.1.0, ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +"@babel/plugin-proposal-optional-chaining@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - sprintf-js "~1.0.2" + "@babel/helper-plugin-utils" "^7.8.0" -"argparse@~ 0.1.11": - version "0.1.16" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - underscore "~1.7.0" - underscore.string "~2.4.0" + "@babel/helper-plugin-utils" "^7.8.0" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" +"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - arr-flatten "^1.0.1" + "@babel/helper-plugin-utils" "^7.12.13" -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +"@babel/plugin-syntax-decorators@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +"@babel/plugin-syntax-flow@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" + integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== dependencies: - array-uniq "^1.0.1" + "@babel/helper-plugin-utils" "^7.14.5" -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -array.prototype.find@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" +"@babel/plugin-syntax-jsx@7.14.5", "@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + "@babel/helper-plugin-utils" "^7.14.5" -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -asap@^2.0.6, asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -asn1@0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -assert-plus@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" +"@babel/plugin-syntax-typescript@^7.14.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - util "0.10.3" + "@babel/helper-plugin-utils" "^7.14.5" -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -ast-traverse@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" -ast-types@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.15.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + globals "^11.1.0" -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -async@1.x, async@^1.3.0, async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -async@^0.9.0, async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -author-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-0.2.1.tgz#8bdefaac6065a931799bec07eeef51b940e08f3c" +"@babel/plugin-transform-flow-strip-types@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" + integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.12.1" -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" + "@babel/helper-plugin-utils" "^7.14.5" -aws-sign2@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -aws4@^1.2.1, aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" + babel-plugin-dynamic-import-node "^2.3.3" -babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^5.0.0: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" - dependencies: - babel-plugin-constant-folding "^1.0.1" - babel-plugin-dead-code-elimination "^1.0.2" - babel-plugin-eval "^1.0.1" - babel-plugin-inline-environment-variables "^1.0.1" - babel-plugin-jscript "^1.0.4" - babel-plugin-member-expression-literals "^1.0.1" - babel-plugin-property-literals "^1.0.1" - babel-plugin-proto-to-assign "^1.0.3" - babel-plugin-react-constant-elements "^1.0.3" - babel-plugin-react-display-name "^1.0.3" - babel-plugin-remove-console "^1.0.1" - babel-plugin-remove-debugger "^1.0.1" - babel-plugin-runtime "^1.0.7" - babel-plugin-undeclared-variables-check "^1.0.2" - babel-plugin-undefined-to-void "^1.1.6" - babylon "^5.8.38" - bluebird "^2.9.33" - chalk "^1.0.0" - convert-source-map "^1.1.0" - core-js "^1.0.0" - debug "^2.1.1" - detect-indent "^3.0.0" - esutils "^2.0.0" - fs-readdir-recursive "^0.1.0" - globals "^6.4.0" - home-or-tmp "^1.0.0" - is-integer "^1.0.4" - js-tokens "1.0.1" - json5 "^0.4.0" - lodash "^3.10.0" - minimatch "^2.0.3" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - regenerator "0.8.40" - regexpu "^1.3.0" - repeating "^1.1.2" - resolve "^1.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - source-map-support "^0.2.10" - to-fast-properties "^1.0.0" - trim-right "^1.0.0" - try-resolve "^1.0.0" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + babel-plugin-dynamic-import-node "^2.3.3" -babel-core@^6.26.0, babel-core@^6.8.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -babel-eslint@^6.0.4: - version "6.1.2" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-6.1.2.tgz#5293419fe3672d66598d327da9694567ba6a5f2f" +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: - babel-traverse "^6.0.20" - babel-types "^6.0.19" - babylon "^6.0.18" - lodash.assign "^4.0.0" - lodash.pickby "^4.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz#41790d856f7c5cec82d2bcf5d0e5064d682522ed" + integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" +"@babel/plugin-transform-react-display-name@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.10.4" -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" +"@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" +"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/plugin-transform-react-jsx" "^7.14.5" -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" +"@babel/plugin-transform-react-jsx-self@^7.12.1": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz#33041e665453391eb6ee54a2ecf3ba1d46bd30f4" + integrity sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" +"@babel/plugin-transform-react-jsx-source@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz#79f728e60e6dbd31a2b860b0bf6c9765918acf1d" + integrity sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.14.5" -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" +"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^6.2.4: - version "6.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" + +"@babel/plugin-transform-react-pure-annotations@^7.12.1", "@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.16" - mkdirp "^0.5.1" - object-assign "^4.0.1" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + +"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.12.1", "@babel/plugin-transform-typescript@^7.15.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz#db7a062dcf8be5fc096bc0eeb40a13fbfa1fa251" + integrity sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== + dependencies: + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.1" + core-js-compat "^3.6.2" + semver "^5.5.0" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.8.4": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" + integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.4" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: - babel-runtime "^6.22.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" + integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.1" + "@babel/plugin-transform-react-jsx-development" "^7.12.1" + "@babel/plugin-transform-react-jsx-self" "^7.12.1" + "@babel/plugin-transform-react-jsx-source" "^7.12.1" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-react@^7.12.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + +"@babel/preset-typescript@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz#86480b483bb97f75036e8864fe404cc782cc311b" + integrity sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.12.1" + +"@babel/preset-typescript@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" + integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== + dependencies: + core-js-pure "^3.16.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" + integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.1", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.15.4", "@babel/template@^7.3.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: - babel-runtime "^6.22.0" + exec-sh "^0.3.2" + minimist "^1.2.0" -babel-plugin-constant-folding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" +"@craco/craco@^5.5.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-5.9.0.tgz#dcd34330b558596a4841374743071b7fa041dce9" + integrity sha512-2Q8gIB4W0/nPiUxr9iAKUhGsFlXYN0/wngUdK1VWtfV2NtBv+yllNn2AjieaLbttgpQinuOYmDU65vocC0NMDg== + dependencies: + cross-spawn "^7.0.0" + lodash "^4.17.15" + webpack-merge "^4.2.2" -babel-plugin-dead-code-elimination@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== -babel-plugin-eval@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" +"@cspotcode/source-map-support@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" + integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" -babel-plugin-inline-environment-variables@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -babel-plugin-jscript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== -babel-plugin-member-expression-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" +"@date-io/core@1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.6.tgz#5c518cee6fa011e754293aebc6f1192360061797" + integrity sha512-cihiu8YaTHh7IqrzekbZcA7dh+7uhViHgWyxcKAO2cg1DYGYC5J7z4/rnGGL7swrK5xFVLIeyoxJ+sacziIRKg== -babel-plugin-property-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" +"@date-io/core@1.x", "@date-io/core@^1.0.2": + version "1.3.13" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.13.tgz#90c71da493f20204b7a972929cc5c482d078b3fa" + integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA== -babel-plugin-proto-to-assign@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" +"@date-io/moment@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@date-io/moment/-/moment-1.0.2.tgz#898ca98d2031376cfed3c7258a8078a26892a501" + integrity sha512-iQFRMH49cFYH/jzgYhdvmO+YfLRmsBZX293Vcfrvkfk+ovrd2g5KOtP5Je3CBlywfqNOQlCC3tKAxsIvaIDSYw== + dependencies: + "@date-io/core" "^1.0.2" + +"@dhis2-ui/alert@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-7.2.1.tgz#07faad192ec7a145c4ced0adfd6987fa10484aa6" + integrity sha512-cwefqFr+tu7L0iLA+6yG6zgSsLt5nWfFxANEAOEJ9Seqo+p+pSzlI8vL25KtkwiK7fy3z4+Owl3x/SaOwkj6Yg== + dependencies: + "@dhis2-ui/portal" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/box@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-7.2.1.tgz#c6a5ace28dcfaff6457eebe737cf4f4a608ae271" + integrity sha512-0QU07UMG1XXfkXw7c4amN6Iiqp2YCk6n6YHtWPfuMw1vi3bqAn03DjY4BZTNVOw2jNJHqCb12HG9mIFZR7vo7w== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/button@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-7.2.1.tgz#c03d21a370848deefe73d3db0ea276cf07707d18" + integrity sha512-qCfv2iYLvKaelptQm/LdBYd1rkdyFvEZjwqqJWZ9hZ9rBXocsMyXQycCv/He/KV1OjJh89MrJQP5j1P7KwjM0w== + dependencies: + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/card@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-7.2.1.tgz#4038044dd48358702e73371d9d08cc1d55e01d6d" + integrity sha512-ZUexl6JV92FZ3anWt0Z66TFpwfNPO0CeWI8c08VAZZvF32gzL5MaODOcNo4ydiEHt0i/ZunopqGa1HFXkZgdvA== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/center@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-7.2.1.tgz#bc0b04ab414da45124207cc8fff7612b5f6f3209" + integrity sha512-Sttu9+r/7TzAaE3uW6p4s71dwnFlY0UTJKTiB7NJnq05Pmo/bIUjkODIE0p9pjTUZbOyQuMLaDovOgB/S+CVQA== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/checkbox@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-7.2.1.tgz#8825cdf7a05169154ab59f0f825c624a54f033bb" + integrity sha512-o5+tjhlZ1/tSl0tMmuG6pLUn9E4hIbTI/6PxHNCM8qjm65gOS9MMORgHhVAuA4zFOTMyjckQq6DHDoATinFEFw== + dependencies: + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/required" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/chip@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-7.2.1.tgz#19fca26500e235f39b4c45ebbb65935ac01f997c" + integrity sha512-1iWBLiROR7DKB7Iq9i6syvgn9WAwSDoYOFfcEIHyc7Kgo7q/tfiEGPLmphco/7ICy+6+te1NVS7/t3P4GRoN4w== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/cover@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-7.2.1.tgz#1ee4a7a1bc23509faeb781d1c8edb1f527442a2f" + integrity sha512-5whzTn7/qM+bw9bnpG7c4pBTe3gngLdle9bDrCmZ7EcwJJzwASoDKEiXPvof3yEkO455qZSQT1pCe46trUvnVw== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/css@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-7.2.1.tgz#5f1942246b907d6e0fdadf7f089bbaff080ebed5" + integrity sha512-BwetAk4Jx/JHYymbXI+HbnBNqvGjxRV6G/XXXCXNOmEx36wwxSrmJR3D8AQ9fXZrsQCiisYTUcbTCjWjctyS9A== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/divider@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-7.2.1.tgz#37b219edafaaff2728f1661f28f72114fe23096b" + integrity sha512-QWEXZwexv7LTvK7a7uwO+068hD6X2j5fDjvqovEJaEDW53oCB2L/gwRgWNAsi4YATcio0l+xQA1JuCA8Jb0dVg== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/field@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-7.2.1.tgz#e16733cc34f231e525420a05d47685b2b1e61914" + integrity sha512-mnm1gMOwRlx8mZSm5gWlBQpj1O3cOGkS25xErIEKH4Jhei/BaR1JAOqKFlG3dSM6tc2saYpAYMAp8wIvKWH5fQ== + dependencies: + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/help" "7.2.1" + "@dhis2-ui/label" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/file-input@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-7.2.1.tgz#2cc043d1f3b930954bdc1884a97b28b98144e1f9" + integrity sha512-UFDKml9p00xtGQRRQ6UKB2c3V07xz1piO2q3VDYxYL+54r5EE5tMuv026+A3FyfxKUhFlPeCxTv/XLboHnA+/A== + dependencies: + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/label" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/header-bar@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-7.2.1.tgz#fa311a30acb1b2b118a44d2575634f7baebace7d" + integrity sha512-qd73urSc36FrXOYmgEPMQsPl4ruiOT6mk/TqiTMrjyVMzNcXvPCDBiFNb5mSQqd7W07XT9tFQENqjykyYbCenA== + dependencies: + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/center" "7.2.1" + "@dhis2-ui/divider" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/logo" "7.2.1" + "@dhis2-ui/menu" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + moment "^2.29.1" + prop-types "^15.7.2" + +"@dhis2-ui/help@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-7.2.1.tgz#ccb574e3c90a4777fcc06cb2510032daa74eb237" + integrity sha512-hLFnmcX1iXEq1SmT1uZEdfM6N2MYwUltj2vclpFDrI8Zc4fHsMmNiNA+YteQVEKhuQkJ9T8vklN7D/XkMlKASg== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/input@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-7.2.1.tgz#1cf1057899a6d65b2f677423c217a5f92930b8da" + integrity sha512-WuERw3dT2ZhSnbCYm4fnfDYaOIakcgWz2RJ2/1jF4TDp5qSYgTc+Dj74mM+C9MmePRzKzYV0NAH+/6a4f8J8cw== + dependencies: + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/intersection-detector@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-7.2.1.tgz#2c5ea36d5adafe7914cd3c8cef9536a0c053d2b8" + integrity sha512-XC4potWnPWzoEMvIoxyO8fsLTQVR4AogJnyZEtf76feeyPxYg5ni44iQsACDaXMbHGjkkRN2nvDe6Recr27wuw== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/label@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-7.2.1.tgz#903c0d377c0f1ca1cb0112c25bd4b0d551b8bb7c" + integrity sha512-LgJLk0EU6mzywgAZeq4T5lud5Jss2EV/sgO/n8ZzHj/NE8l4feunKY4tz21NM9o1N+6RCUQ8zhJUWcI/7S5jlw== + dependencies: + "@dhis2-ui/required" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/layer@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-7.2.1.tgz#566643906bbbfbf064aaf617d519ac099906580e" + integrity sha512-x5Sy0vppTN+TdDwas5Te7CLBQj6MEyGirlD4u9y6guNSO8gyKIyKoklQI/+SLek+q6rMV1dVZleDr4ZY49e0eA== + dependencies: + "@dhis2-ui/portal" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/legend@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-7.2.1.tgz#cee54be7715ef50443dc52f1198cdc1fac998eb3" + integrity sha512-nLuNiB5wQ/NCDwXjqBgRafn9kHa0gfYyAN4nvZCaWH2EU4AMI1uo0wUHurujQAoIwQKQGjV+OwiyHU8hLcPSGw== + dependencies: + "@dhis2-ui/required" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/loader@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-7.2.1.tgz#49c7fa1fea3bb53a86c1a2d631a79ffd3d2dcdd5" + integrity sha512-4z3OOI/jf4m2CH3/j9RqbbwFuDmBpAZ6w3AV1ry8HWeQWO+T2AlXpnYdE++cITrhvzKx39fX7M7IrP1J8h95FQ== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/logo@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-7.2.1.tgz#d9d19c0b8eac073a374b6ae7e5812b7260aab1d7" + integrity sha512-FJmzH92XWuFPywzQ7DPaTaWoOBo3K8xqaevBTQzfmg+EjAxXBrM++xxXn4VR6z1V1OblZHx1rJbxfzLA9Ds7lQ== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/menu@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-7.2.1.tgz#39d314ef4fc251ffc68dc7c6d963d9bd6dab4ecc" + integrity sha512-zCCqaT9HxqKekRPV6OoXf9NCHVbtI4Su36m54Dfyn2tKCrou/fqEw0o6dRWrS1F0+eOIiXvsKu7IHCu8r7okYQ== + dependencies: + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/divider" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2-ui/portal" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/modal@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-7.2.1.tgz#7a656235a3a976bac962fb89fa3cce1876a264ee" + integrity sha512-lqjCe7xHGEcoAqYJPQf/Cu+y2ocDnw7X6z9K8WW4UFXcJsBulYtkhRYuTLseZ845fhEVbQ7J/qsjWCCLN6otOg== + dependencies: + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/center" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/portal" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/node@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-7.2.1.tgz#2f408b26804b11c10d07edafa9a615fcaa388e48" + integrity sha512-M9BAQiE5rNaLhnE4OtpSFJRHrsz02pN/m34DFh+/pN2/WbdGW+DWooeBcfVChHw8z8frHoYlTzR6gWFBeiyywg== + dependencies: + "@dhis2-ui/loader" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/notice-box@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-7.2.1.tgz#80074caa3f04847ce2b492e93d9ad11fc49e5b80" + integrity sha512-5hObn5ZAVBw6jkXUXe1KgKcfvcE3KtDisc5z+tsqXcbkBD6zBmNzxeRKO8eiVDdx+HrBFM7ohUziEyOE1MuY5g== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/organisation-unit-tree@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-7.2.1.tgz#94f7097f5bb3fe9af74f324537abb36e31166a89" + integrity sha512-DrGf2yfmmslH0cQj1kkY2AxOMt14R/zqE5bW85YqGOxw1v12ikKHrFBjJ8TCZ40hHHG0xj43K6mIHlQOD44Nzw== + dependencies: + "@dhis2-ui/checkbox" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/node" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/pagination@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-7.2.1.tgz#c2e0e5105f04a2fed491dcafb97a2ce9d62ce405" + integrity sha512-hihhtokcVFdRtnLYoH33HE2Xo4ywmu8vngaIILaJiG/viZv70xa/xF+ax2dtRvA8rCy/TsLIU9kK0DlUoN5+0Q== + dependencies: + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/select" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/popover@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-7.2.1.tgz#ef26c45bc927f130eb4928daed3451f269572860" + integrity sha512-B54IRfnB34Hmqr21KuV3K02VuvmmyC8yHoT4pLlSxoH1ux7wF3PflTZs3bzjVjeiH20glE7DWeQA1Yry/9xMUA== + dependencies: + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/popper@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-7.2.1.tgz#09ff9aaec832ee2e484c72971da755887f18879a" + integrity sha512-+4Yz366hj0NBs3VHzawZSd3d5mOujQChAm4ClJKA5D9VTl5ECOhvwu7ZwY6coqxGJ0pxyYN/Dr/yTd8s6xiMHQ== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@popperjs/core" "^2.10.1" + classnames "^2.3.1" + prop-types "^15.7.2" + react-popper "^2.2.5" + resize-observer-polyfill "^1.5.1" + +"@dhis2-ui/portal@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/portal/-/portal-7.2.1.tgz#2b581f863ec26f696a7e72864f4cbcb1a2b82846" + integrity sha512-2Lw8ywBVznj4rklxRMB5A050WHJtN8oiTMEDYp6V7aOn8oHKmmQCkADxJSpJmeYtI1xeAp/AUjZa5sHeixJovw== + dependencies: + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/radio@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-7.2.1.tgz#4f1935b65ebe1dfcda66b40ff22fd2dde73a0fef" + integrity sha512-1bhnCRoOD/9Ar3GS22y3xHKAPuMX99ZDuF06xxE5wLPpbI+m9yf0Ar4gsnE+HbRpFN7N2bvhjEJmd2gXvK8lqw== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/required@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-7.2.1.tgz#ef7034cc9068a52077de7f167ea5f19a5918cd09" + integrity sha512-2nUKhVEdX87ph+b5HhCbay2N6pO0Izxw/F0q/QS0RxHgy0Uhk5B51TuHfuQEwqwkBcDWP71NW+0GCUZCz1lrIw== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/select@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-7.2.1.tgz#336374348ad42ff1a78057aa8e34def2550be45c" + integrity sha512-W+/b5kNMviahDaB8k8m/fXUou3XZ74Uh16Dv6BxVc1NMeHA19kP4d42CCoO/0RdZTFzcvvS8O8Eb6ZHpf6BAYQ== + dependencies: + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/checkbox" "7.2.1" + "@dhis2-ui/chip" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/sharing-dialog@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/sharing-dialog/-/sharing-dialog-7.2.1.tgz#608c5078ebf2765a9f12faa15e7474aee91a2615" + integrity sha512-9toXS49ag7yW/smdy3ZXbbRn/jn1mULDEMtTL3gWbrQtbKvCO4I/0To2QSLOHG2qDnHNpcIPC7BFEuHrXWh3aA== + dependencies: + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/divider" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/menu" "7.2.1" + "@dhis2-ui/modal" "7.2.1" + "@dhis2-ui/notice-box" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2-ui/select" "7.2.1" + "@dhis2-ui/tab" "7.2.1" + "@dhis2-ui/tooltip" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/switch@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-7.2.1.tgz#ee513fcf78237b945e3de2a762e4dedfdf45092b" + integrity sha512-aDeOOlo4b6erYSnWK/nQMXT7TtyhORBN7OZLvoWIU0sozXo0ssPDtb2Oo4zASZ1Eu5KZooWo7dTHowNq6/8Kxw== + dependencies: + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/required" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/tab@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-7.2.1.tgz#79bdcdc04f4c718ce14728675980b43c0e64f290" + integrity sha512-Vyr8J4e1c5RImNNGQ70meZx85sojtDSHzTRNZ/lAc73qn4vZE3+x9jEACG8zLtkNsZsDsAkR6sHAYpBWQL9c8g== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/table@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-7.2.1.tgz#764ad1aff730d1f1ca603ee5f4028f5b5478dcf2" + integrity sha512-8KaitnbJevtdaAV/y7vAAljVTQzsXFw/21yuEPwfrs4UjyOFfCkpH0X9Id8x6vCth7CjUkjnKXnt58jjUBKmCw== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/tag@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-7.2.1.tgz#93ad67cd4f0dd4231d4ae5be5db5180aabf628a3" + integrity sha512-IQRsqTNW/4i8RfqdY6HJeWZUCjOhLf9LAkplgvfMPENUQQQHgcsD2J2a7rMinxSRiRC86Bc3ExVviY9Ab85XwQ== + dependencies: + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/text-area@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-7.2.1.tgz#d562c44db5774783465ed18c04e6f53b48052df6" + integrity sha512-klrme3v94XolEYOjfeiaKs8eO8QF5cbuXfAB6zW3S0yhW4I21PQ/hk4zXNbiAW5qQ3pVLzePkyco9BpRVAUS7g== + dependencies: + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/tooltip@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-7.2.1.tgz#72a221a0e47d96486f9af4554f441282b7d03cbf" + integrity sha512-31lHqkXTB7vFVsR8ZTnGAjtyVk9yRtNjGRJnS9lQrwSNwH9BbVDlc1gmoWiaNQTYadcUw8GOhtz+yJWfJQP4oQ== + dependencies: + "@dhis2-ui/popper" "7.2.1" + "@dhis2-ui/portal" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2-ui/transfer@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-7.2.1.tgz#0968dc66dc03e9c183400d95173130f7e437fbf2" + integrity sha512-5k2cymx3INNrDoCgWUUFL+2C29jVo21q2H5JX9fNWdvxIMmpqbxewSuvUJW/qOrUzxvpuOvUDnWpJ2ZC7Dxo+A== + dependencies: + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/intersection-detector" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + "@dhis2/ui-constants" "7.2.1" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2/app-runtime@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-runtime/-/app-runtime-3.2.2.tgz#9cc4c9a8397f3268bc6eb3b40e86c8c1c9919599" + integrity sha512-DE8CYq3R5cEcvltTQHTV7uDoFyb5wvZ1urW3aEPz8v5BmUL76uqeaazAdUcwZPFFhB3rg4XpmRGCeqEHHIO64A== dependencies: - lodash "^3.9.3" + "@dhis2/app-service-alerts" "3.2.2" + "@dhis2/app-service-config" "3.2.2" + "@dhis2/app-service-data" "3.2.2" + "@dhis2/app-service-offline" "3.2.2" -babel-plugin-react-constant-elements@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" +"@dhis2/app-service-alerts@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-alerts/-/app-service-alerts-3.2.2.tgz#5f969a568a5c9a002bf8604e5b8e773596b0978c" + integrity sha512-BtqrlQnwl6+4jzEKBGeqm3WnRxeZ79qEgqtP6sPTLwLisoFljTNt8P6RYKJGWR2inymIvXaWO7GgIy6FpauP1g== -babel-plugin-react-display-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" +"@dhis2/app-service-config@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-config/-/app-service-config-3.2.2.tgz#64cb0a488c2938a2e876ace074ee244deda5a02b" + integrity sha512-rXiN7MNkGoF7q23AuGeHMFqnXZyWsqq6DStLzO6UbqmRc7FasxEO4dndqS9t0v1VEXf9KfM3LYSCHCI32+2zUg== -babel-plugin-remove-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" +"@dhis2/app-service-data@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-data/-/app-service-data-3.2.2.tgz#487dda93593a026d29749fbd88b6063a5b727aa4" + integrity sha512-J3iIPlsC2qweqVJ18F0eWKiTZ3MMaGLn2V7a7HajVtJgJfn4qXduFp1XDCG38Lcq2ssv15iGNz6ZPMXlcuUtPA== + dependencies: + react-query "^3.13.11" -babel-plugin-remove-debugger@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" +"@dhis2/app-service-offline@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-offline/-/app-service-offline-3.2.2.tgz#5aab27fd408fb3d50a628798387260f4a3fcffca" + integrity sha512-8liyb43a7/MzejA2d524fojL9ViOds2E2aJrizh6LzLGEgq8GtV1WvIMjMl3uynejYbIpwglHVpKIdz4NfzSEg== + dependencies: + lodash "^4.17.21" -babel-plugin-runtime@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" +"@dhis2/d2-i18n-extract@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@dhis2/d2-i18n-extract/-/d2-i18n-extract-1.0.8.tgz#9d98690d522a51895c8ef3fe7136f026b0f8dacd" + integrity sha512-wjQ5J0v8Td12+KcQYSuuZ1tQLReXJ1gBSqkyImf2aNtLwJKERaTOjZ71da+GXdHtd6ph/DP1ezQvFDFKhBHa/A== + dependencies: + argparse "^1.0.10" + i18next-conv "^6.0.0" + i18next-scanner "^2.4.4" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" +"@dhis2/d2-i18n-generate@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@dhis2/d2-i18n-generate/-/d2-i18n-generate-1.2.0.tgz#4b7944eb4046bb1452b9ce7598b13b5c5b80c984" + integrity sha512-1jdcRs6ZA+WvK2h93y4nGSPAnvqlhAMR5YMEv4+c7bs6fjcG7UHevIK8xdm95hRATYGVhbegQRIuNWWAQ8/ylw== + dependencies: + argparse "^1.0.10" + handlebars "^4.0.11" + i18next-conv "^6.0.0" + moment "^2.22.1" + rimraf "^2.6.2" -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" +"@dhis2/d2-i18n@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@dhis2/d2-i18n/-/d2-i18n-1.0.6.tgz#2914be8acf296f3a6bf7b51c76c46da6a120b0ff" + integrity sha512-7YdA4ppFosjuyf7ZMm47BrdsA5TWLM9lmS0lUPgjcCVeeWfUgagqzf4W5JGB9XQ3w1vzK+yy5zH2Ij8IgRAGhA== + dependencies: + i18next "^10.3" + moment "^2.24.0" -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" +"@dhis2/d2-i18n@1.1.0", "@dhis2/d2-i18n@^1.0.5": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@dhis2/d2-i18n/-/d2-i18n-1.1.0.tgz#ec777c5091f747e4c5aa4f9801c62ba4d1ef3d16" + integrity sha512-x3u58goDQsMfBzy50koxNrJjofJTtjRZOfz6f6Py/wMMJfp/T6vZjWMQgcfWH0JrV6d04K1RTt6bI05wqsVQvg== + dependencies: + i18next "^10.3" + moment "^2.24.0" -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" +"@dhis2/d2-ui-core@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@dhis2/d2-ui-core/-/d2-ui-core-6.3.0.tgz#ec0ef63978a34d5b2330303c426bf7d59e0836fc" + integrity sha512-ZFthluJBkmbi1F0vNaIvx2Zbjioapo+Ewn1vNqb2MsUadTHOlPcrWQjDz3JCB0qce2ZW2avZ+spasEOytPNsFA== + dependencies: + babel-runtime "^6.26.0" + d2 "~31.7" + lodash "^4.17.10" + material-ui "^0.20.0" -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" +"@dhis2/prop-types@^3.0.0-beta.1": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-3.0.0.tgz#a17dd1b8475ab7e4e66c736624ac83fd372876af" + integrity sha512-Crqimyk6XTJWWqmVZ+Asnle3OgOXsnUYVM2ozC+Z6Ad0O0M3I4lE2QS6V20nGEmUDl3K1Vri9lzmL8vAMpUBsw== + +"@dhis2/ui-constants@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-7.2.1.tgz#5b0c39a173508043345ebb6bb41a60dc15fdb01f" + integrity sha512-AIHZtgJr+h+RlogrTEnrBAnVpxe1cgWtYqbDqbhW/GU86nRWNDMEOfnlqmkgOlEPMRDBZITZSYZlxNPqZ0MfUg== + dependencies: + prop-types "^15.7.2" + +"@dhis2/ui-forms@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-7.2.1.tgz#cfb5b9f5da66214871af66fd1f11bee9b52e7865" + integrity sha512-M+nwJ57SjaOpyqKKOfptO5gXV9zLemYUHeoOguGhFgQwKJnQFZbjrWZHsSl9bIuD5bTtDm2UyNHV8WwGL14Lvg== + dependencies: + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/checkbox" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/file-input" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/radio" "7.2.1" + "@dhis2-ui/select" "7.2.1" + "@dhis2-ui/switch" "7.2.1" + "@dhis2-ui/text-area" "7.2.1" + "@dhis2/prop-types" "^3.0.0-beta.1" + classnames "^2.3.1" + final-form "^4.20.2" + prop-types "^15.7.2" + react-final-form "^6.5.3" + +"@dhis2/ui-icons@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-7.2.1.tgz#e29a05c9f210f0be982523a70b024fca58029cdd" + integrity sha512-3G+HPtPQnrds7Tf7m96lqdlRmCeoMEqvql2HOThjhbt1iCxrVLBVSAD0nNTl+rgntl3tUxXorDaCVTiWzp4+Qg== + +"@dhis2/ui@7.2.1": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-7.2.1.tgz#50ac8cbc276174cf37062bbaccf2cd842a95625e" + integrity sha512-6hxpzKbToZ5NBsEIARJXIHgaNZ6ZNyRtJi+2jj45/B/iQvCzAB+lXhq/zbduwK72V5R/ZKzQZhtWkZXUMTki0g== + dependencies: + "@dhis2-ui/alert" "7.2.1" + "@dhis2-ui/box" "7.2.1" + "@dhis2-ui/button" "7.2.1" + "@dhis2-ui/card" "7.2.1" + "@dhis2-ui/center" "7.2.1" + "@dhis2-ui/checkbox" "7.2.1" + "@dhis2-ui/chip" "7.2.1" + "@dhis2-ui/cover" "7.2.1" + "@dhis2-ui/css" "7.2.1" + "@dhis2-ui/divider" "7.2.1" + "@dhis2-ui/field" "7.2.1" + "@dhis2-ui/file-input" "7.2.1" + "@dhis2-ui/header-bar" "7.2.1" + "@dhis2-ui/help" "7.2.1" + "@dhis2-ui/input" "7.2.1" + "@dhis2-ui/intersection-detector" "7.2.1" + "@dhis2-ui/label" "7.2.1" + "@dhis2-ui/layer" "7.2.1" + "@dhis2-ui/legend" "7.2.1" + "@dhis2-ui/loader" "7.2.1" + "@dhis2-ui/logo" "7.2.1" + "@dhis2-ui/menu" "7.2.1" + "@dhis2-ui/modal" "7.2.1" + "@dhis2-ui/node" "7.2.1" + "@dhis2-ui/notice-box" "7.2.1" + "@dhis2-ui/organisation-unit-tree" "7.2.1" + "@dhis2-ui/pagination" "7.2.1" + "@dhis2-ui/popover" "7.2.1" + "@dhis2-ui/popper" "7.2.1" + "@dhis2-ui/portal" "7.2.1" + "@dhis2-ui/radio" "7.2.1" + "@dhis2-ui/required" "7.2.1" + "@dhis2-ui/select" "7.2.1" + "@dhis2-ui/sharing-dialog" "7.2.1" + "@dhis2-ui/switch" "7.2.1" + "@dhis2-ui/tab" "7.2.1" + "@dhis2-ui/table" "7.2.1" + "@dhis2-ui/tag" "7.2.1" + "@dhis2-ui/text-area" "7.2.1" + "@dhis2-ui/tooltip" "7.2.1" + "@dhis2-ui/transfer" "7.2.1" + "@dhis2/ui-constants" "7.2.1" + "@dhis2/ui-forms" "7.2.1" + "@dhis2/ui-icons" "7.2.1" + prop-types "^15.7.2" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" +"@eyeseetea/d2-api@1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-api/-/d2-api-1.9.2.tgz#a06bef44199b1e7031d1bb74d50bd3223d745b2a" + integrity sha512-O0NtSIse8ZimyA7kbjS+/D3M/ZeEA6nvW1DYaiXnG8hF7vQ15+d2Y4JuFunbg9mdo3KVcZLPPS8NAGi6rsKLWw== + dependencies: + "@babel/runtime" "^7.5.4" + "@dhis2/d2-i18n" "^1.0.5" + "@types/prettier" "^1.18.3" + "@types/qs" "^6.5.3" + abort-controller "3.0.0" + argparse "^2.0.1" + axios "0.19.2" + axios-debug-log "^0.6.2" + axios-mock-adapter "1.18.2" + btoa "^1.2.1" + cronstrue "^1.81.0" + cryptr "^4.0.2" + d2 "^31.8.1" + dotenv "^8.0.0" + express "^4.17.1" + iconv-lite "0.6.2" + isomorphic-fetch "3.0.0" + lodash "^4.17.15" + log4js "^4.5.1" + node-schedule "^1.3.2" + qs "^6.9.0" + react "^16.12.0" + yargs "^14.0.0" + +"@eyeseetea/d2-ui-components@2.6.7": + version "2.6.7" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.7.tgz#f6d2b9b39f40d128b1099b5ad2d4817cfeca2408" + integrity sha512-SAVK7l028ORB7l2b4jmP4awbPujwKhlXz3z76UG1CXwLMUmHH0GJ4TC5G7X8hootXBS+ag0Ilv4nbNfZZK66/w== + dependencies: + "@date-io/core" "1.3.6" + "@date-io/moment" "1.0.2" + "@dhis2/d2-i18n" "1.0.6" + "@dhis2/d2-ui-core" "6.3.0" + "@material-ui/pickers" "3.2.10" + classnames "2.2.6" + downshift "5.4.2" + lodash "4.17.20" + moment "2.22.2" + nano-memoize "1.2.1" + react-linkify "1.0.0-alpha" + rxjs-compat "6.6.3" + throttle-debounce "2.1.0" + +"@gar/promisify@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" +"@hapi/joi@^15.1.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" -babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" + "@hapi/hoek" "^8.3.0" -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/console@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.2.4.tgz#2f1a4bf82b9940065d4818fac271def99ec55e5e" + integrity sha512-94znCKynPZpDpYHQ6esRJSc11AmONrVkBOBZiD7S+bSubHhrUfbS95EY5HIOxhm4PQO7cnvZkL3oJcY0oMA+Wg== + dependencies: + "@jest/types" "^27.2.4" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.2.4" + jest-util "^27.2.4" + slash "^3.0.0" + +"@jest/core@^26.6.0", "@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/core@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.2.4.tgz#0b932da787d64848eab720dbb88e5b7a3f86e539" + integrity sha512-UNQLyy+rXoojNm2MGlapgzWhZD1CT1zcHZQYeiD0xE7MtJfC19Q6J5D/Lm2l7i4V97T30usKDoEtjI8vKwWcLg== + dependencies: + "@jest/console" "^27.2.4" + "@jest/reporters" "^27.2.4" + "@jest/test-result" "^27.2.4" + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^27.2.4" + jest-config "^27.2.4" + jest-haste-map "^27.2.4" + jest-message-util "^27.2.4" + jest-regex-util "^27.0.6" + jest-resolve "^27.2.4" + jest-resolve-dependencies "^27.2.4" + jest-runner "^27.2.4" + jest-runtime "^27.2.4" + jest-snapshot "^27.2.4" + jest-util "^27.2.4" + jest-validate "^27.2.4" + jest-watcher "^27.2.4" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/environment@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.2.4.tgz#db3e60f7dd30ab950f6ce2d6d7293ed9a6b7cbcd" + integrity sha512-wkuui5yr3SSQW0XD0Qm3TATUbL/WE3LDEM3ulC+RCQhMf2yxhci8x7svGkZ4ivJ6Pc94oOzpZ6cdHBAMSYd1ew== + dependencies: + "@jest/fake-timers" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + jest-mock "^27.2.4" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/fake-timers@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.4.tgz#00df08bd60332bd59503cb5b6db21e4903785f86" + integrity sha512-cs/TzvwWUM7kAA6Qm/890SK6JJ2pD5RfDNM3SSEom6BmdyV6OiWP1qf/pqo6ts6xwpcM36oN0wSEzcZWc6/B6w== + dependencies: + "@jest/types" "^27.2.4" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.2.4" + jest-mock "^27.2.4" + jest-util "^27.2.4" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/globals@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.4.tgz#0aeb22b011f8c8c4b8ff3b4dbd1ee0392fe0dd8a" + integrity sha512-DRsRs5dh0i+fA9mGHylTU19+8fhzNJoEzrgsu+zgJoZth3x8/0juCQ8nVVdW1er4Cqifb/ET7/hACYVPD0dBEA== + dependencies: + "@jest/environment" "^27.2.4" + "@jest/types" "^27.2.4" + expect "^27.2.4" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/reporters@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.4.tgz#1482ff007f2e919d85c54b1563abb8b2ea2d5198" + integrity sha512-LHeSdDnDZkDnJ8kvnjcqV8P1Yv/32yL4d4XfR5gBiy3xGO0onwll1QEbvtW96fIwhx2nejug0GTaEdNDoyr3fQ== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.2.4" + "@jest/test-result" "^27.2.4" + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^27.2.4" + jest-resolve "^27.2.4" + jest-util "^27.2.4" + jest-worker "^27.2.4" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/source-map@^27.0.6": + version "27.0.6" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" + integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.2.4.tgz#d1ca8298d168f1b0be834bfb543b1ac0294c05d7" + integrity sha512-eU+PRo0+lIS01b0dTmMdVZ0TtcRSxEaYquZTRFMQz6CvsehGhx9bRzi9Zdw6VROviJyv7rstU+qAMX5pNBmnfQ== + dependencies: + "@jest/console" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/test-sequencer@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.2.4.tgz#df66422a3e9e7440ce8b7498e255fa6b52c0bc03" + integrity sha512-fpk5eknU3/DXE2QCCG1wv/a468+cfPo3Asu6d6yUtM9LOPh709ubZqrhuUOYfM8hXMrIpIdrv1CdCrWWabX0rQ== + dependencies: + "@jest/test-result" "^27.2.4" + graceful-fs "^4.2.4" + jest-haste-map "^27.2.4" + jest-runtime "^27.2.4" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/transform@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.2.4.tgz#2fe5b6836895f7a1b8bdec442c51e83943c62733" + integrity sha512-n5FlX2TH0oQGwyVDKPxdJ5nI2sO7TJBFe3u3KaAtt7TOiV4yL+Y+rSFDl+Ic5MpbiA/eqXmLAQxjnBmWgS2rEA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.2.4" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.2.4" + jest-regex-util "^27.0.6" + jest-util "^27.2.4" + micromatch "^4.0.4" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.0", "@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.2.4": + version "27.2.4" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.4.tgz#2430042a66e00dc5b140c3636f4474d464c21ee8" + integrity sha512-IDO2ezTxeMvQAHxzG/ZvEyA47q0aVfzT95rGFl7bZs/Go0aIucvfDbS2rmnoEdXxlLQhcolmoG/wvL/uKx4tKA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@material-ui/core@4.12.3": + version "4.12.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/pickers@3.2.10": + version "3.2.10" + resolved "https://registry.yarnpkg.com/@material-ui/pickers/-/pickers-3.2.10.tgz#19df024895876eb0ec7cd239bbaea595f703f0ae" + integrity sha512-B8G6Obn5S3RCl7hwahkQj9sKUapwXWFjiaz/Bsw1fhYFdNMnDUolRiWQSoKPb1/oKe37Dtfszoywi1Ynbo3y8w== + dependencies: + "@babel/runtime" "^7.6.0" + "@date-io/core" "1.x" + "@types/styled-jsx" "^2.2.8" + clsx "^1.0.2" + react-transition-group "^4.0.0" + rifm "^0.7.0" + +"@material-ui/styles@^4.11.4": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d" + integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz#2dd96c243f8c0a331b2bb6d46efd7771a399707c" + integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== dependencies: - babel-runtime "^6.22.0" + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - babel-runtime "^6.22.0" + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -babel-plugin-transform-es2015-classes@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" +"@npmcli/fs@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" + integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@gar/promisify" "^1.0.1" + semver "^7.3.5" -babel-plugin-transform-es2015-computed-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" + mkdirp "^1.0.4" + rimraf "^3.0.2" -babel-plugin-transform-es2015-destructuring@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" +"@pmmmwh/react-refresh-webpack-plugin@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" + integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== + dependencies: + ansi-html "^0.0.7" + error-stack-parser "^2.0.6" + html-entities "^1.2.1" + native-url "^0.2.6" + schema-utils "^2.6.5" + source-map "^0.7.3" + +"@popperjs/core@^2.10.1": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" + integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== + +"@rollup/plugin-node-resolve@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-replace@^2.3.1": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== dependencies: - babel-runtime "^6.22.0" + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" -babel-plugin-transform-es2015-duplicate-keys@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" -babel-plugin-transform-es2015-for-of@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: - babel-runtime "^6.22.0" + type-detect "4.0.8" -babel-plugin-transform-es2015-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@sinonjs/commons" "^1.7.0" -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" +"@sinonjs/fake-timers@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" + integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== dependencies: - babel-runtime "^6.22.0" + "@sinonjs/commons" "^1.7.0" -babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" +"@surma/rollup-plugin-off-main-thread@^1.1.1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + ejs "^2.6.1" + magic-string "^0.25.0" -babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== -babel-plugin-transform-es2015-object-super@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== -babel-plugin-transform-es2015-parameters@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== -babel-plugin-transform-es2015-shorthand-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@testing-library/cypress@8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@testing-library/cypress/-/cypress-8.0.1.tgz#46bf2ae45ba8599a5f77b1dc2386444564cad3ce" + integrity sha512-JCGy8u4ia+OQQJxVqKqjqpb0i4kmHQhu5jKFVBp+v/YSICnf52fil2MWIJqO+tH9ZQXtp3aF7uKHsVipWaI0BQ== + dependencies: + "@babel/runtime" "^7.14.6" + "@testing-library/dom" "^8.1.0" + +"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.1.0": + version "8.7.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.7.1.tgz#c17b1e90e682c7945b2d88ce2f078e522c775ce3" + integrity sha512-nMqxP8qPHgYAiIPMVb6zko5DInPJ/LdILgrkWB5HBJhBCIU5avso8pU9IafnXVGLRq+LDtbvo0LuVbjEo27BgQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + chalk "^4.1.0" + dom-accessibility-api "^0.5.6" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@5.14.1": + version "5.14.1" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" + integrity sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^4.2.2" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.1.tgz#e693943aa48d0190099acdc3928a751d73bcf7d5" + integrity sha512-JDyWbvMuedEpP6SPL4Cvbhk59TVxQ3pwuR6ZfJHdRsHuxDd/ziSMA3nVM3fViaSbsQhuQFE/mvFrPrvQbL5kRQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== -babel-plugin-transform-es2015-sticky-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== -babel-plugin-transform-es2015-typeof-symbol@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -babel-plugin-transform-es2015-unicode-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== -babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" +"@types/babel__generator@*": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" + "@babel/types" "^7.0.0" -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" + "@babel/types" "^7.3.0" -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" +"@types/debug@^4.0.0": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" + "@types/ms" "*" -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" +"@types/eslint@^7.2.6": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" + integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== dependencies: - babel-runtime "^6.22.0" + "@types/estree" "*" + "@types/json-schema" "*" -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +"@types/estree@*": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" +"@types/glob@^7.1.1": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" + "@types/minimatch" "*" + "@types/node" "*" -babel-plugin-transform-regenerator@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: - regenerator-transform "^0.10.0" + "@types/node" "*" -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" +"@types/history@*": + version "4.7.9" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== -babel-plugin-undeclared-variables-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" +"@types/hoist-non-react-statics@*": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: - leven "^1.0.2" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" -babel-plugin-undefined-to-void@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -babel-polyfill@^6.26.0, babel-polyfill@^6.8.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-es2015@^6.6.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@^6.5.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-preset-stage-0@^6.5.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" + "@types/node" "*" -babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" + "@types/istanbul-lib-coverage" "*" -babel-traverse@^6.0.20, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" + "@types/istanbul-lib-report" "*" -babel-types@^6.0.19, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" +"@types/jest@*", "@types/jest@27.0.2": + version "27.0.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" + integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" - -babylon@^6.0.18, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + jest-diff "^27.0.0" + pretty-format "^27.0.0" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +"@types/json-schema@7.0.8": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -base62@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.1.tgz#95a5a22350b0a557f3f081247fc2c398803ecb0c" +"@types/lodash@4.14.175": + version "4.14.175" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45" + integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw== -base64-arraybuffer@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz#474df4a9f2da24e05df3158c3b1db3c3cd46a154" +"@types/material-ui@0.21.9": + version "0.21.9" + resolved "https://registry.yarnpkg.com/@types/material-ui/-/material-ui-0.21.9.tgz#156a7e78274b8d0c55e19a6b5483b105aa53c0f3" + integrity sha512-YhZzW7rRqT2VpNTDYdXAB4Qgy1oBK2YDL1QSeL8t2ALmFTv141a5KW1buTobkc840QN+GGvon/u814jOxsvZLw== + dependencies: + "@types/react" "*" + "@types/react-addons-linked-state-mixin" "*" -base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" +"@types/node@*", "@types/node@16.10.2": + version "16.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" + integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== -benchmark@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-1.0.0.tgz#2f1e2fa4c359f11122aa183082218e957e390c73" +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - dependencies: - callsite "1.0.0" +"@types/prettier@^1.18.3": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +"@types/prettier@^2.0.0", "@types/prettier@^2.1.5": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" + integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -bindings@1.2.x, bindings@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" +"@types/qs@^6.5.3": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" +"@types/react-addons-linked-state-mixin@*": + version "0.14.22" + resolved "https://registry.yarnpkg.com/@types/react-addons-linked-state-mixin/-/react-addons-linked-state-mixin-0.14.22.tgz#a8fe5929bbfa10947f3bf62d4a878706ec6b7718" + integrity sha512-DF9utM6VjuIaY388R6XWWDs7CIDTH7on1k1yR+hqaL/T4/OqSCW5uij28APq9KI82CZf0/qtBJI+pjvXcOh0kQ== dependencies: - inherits "~2.0.0" - -bluebird@^2.9.27, bluebird@^2.9.33: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + "@types/react" "*" -body-parser@1.18.2, body-parser@^1.12.4: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +"@types/react-dom@17.0.9": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + "@types/react" "*" -boom@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" +"@types/react-router-dom@5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.0.tgz#8c4e0aa0ccaf638ba965829ad29a10ac3cbe2212" + integrity sha512-svUzpEpKDwK8nmfV2vpZNSsiijFNKY8+gUqGqvGGOVrXvX58k1JIJubZa5igkwacbq/0umphO5SsQn/BQsnKpw== dependencies: - hoek "0.9.x" + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" +"@types/react-router@*": + version "5.1.16" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" + integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== dependencies: - hoek "2.x.x" + "@types/history" "*" + "@types/react" "*" -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" +"@types/react-transition-group@^4.2.0": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" + integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== dependencies: - hoek "4.x.x" + "@types/react" "*" -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" +"@types/react@*", "@types/react@17.0.26": + version "17.0.26" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.26.tgz#960ea4b3518cc154ed7df3b35656c508df653331" + integrity sha512-MXxuXrH2xOcv5cp/su4oz69dNQnSA90JjFw5HBd5wifw6Ihi94j7dRJm7qNsB30tnruXSCPc9qmlhGop4nh9Hw== dependencies: - hoek "4.x.x" - -bowser@^1.7.3: - version "1.9.2" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.2.tgz#d66fc868ca5f4ba895bee1363c343fe7b37d3394" + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "@types/node" "*" -braces@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" - dependencies: - expand-range "^0.1.0" +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== -breakable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -browserify-aes@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" +"@types/styled-components@5.1.14": + version "5.1.14" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.14.tgz#e9cf8cdb5eef9d139628183a84c083f630635d67" + integrity sha512-d6P1/tyNytqKwam3cQXq7a9uPtovc/mdAs7dBiz1YbDdNIT3X4WmuFU78YdSYh84TXVuhOwezZ3EeKuNBhwsHQ== dependencies: - inherits "^2.0.1" + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + csstype "^3.0.2" -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" +"@types/styled-jsx@^2.2.8": + version "2.2.9" + resolved "https://registry.yarnpkg.com/@types/styled-jsx/-/styled-jsx-2.2.9.tgz#e50b3f868c055bcbf9bc353eca6c10fdad32a53f" + integrity sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw== dependencies: - pako "~0.2.0" + "@types/react" "*" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== -buffer@^4.9.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.1" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.1.tgz#014162a5cee6571819d48e999980694e2f657c3c" + integrity sha512-Gk9vaXfbzc5zCXI9eYE9BI5BNHEp4D3FWjgqBE/ePGYElLAP+KvxBcsdkwfIVvezs605oiyd/VrpiHe3Oeg+Aw== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + "@types/jest" "*" -bufferutil@1.2.x: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-1.2.1.tgz#37be5d36e1e06492221e68d474b1ac58e510cbd7" +"@types/uglify-js@*": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: - bindings "1.2.x" - nan "^2.0.5" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + source-map "^0.6.1" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.39.2", "@types/webpack@^4.41.8": + version "4.41.31" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa" + integrity sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@4.32.0", "@typescript-eslint/eslint-plugin@^4.5.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.32.0.tgz#46d2370ae9311092f2a6f7246d28357daf2d4e89" + integrity sha512-+OWTuWRSbWI1KDK8iEyG/6uK2rTm3kpS38wuVifGUTDB6kjEuNrzBI1MUtxnkneuWG/23QehABe2zHHrj+4yuA== + dependencies: + "@typescript-eslint/experimental-utils" "4.32.0" + "@typescript-eslint/scope-manager" "4.32.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.32.0", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.32.0.tgz#53a8267d16ca5a79134739129871966c56a59dc4" + integrity sha512-WLoXcc+cQufxRYjTWr4kFt0DyEv6hDgSaFqYhIzQZ05cF+kXfqXdUh+//kgquPJVUBbL3oQGKQxwPbLxHRqm6A== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.32.0" + "@typescript-eslint/types" "4.32.0" + "@typescript-eslint/typescript-estree" "4.32.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/experimental-utils@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@4.32.0", "@typescript-eslint/parser@^4.5.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.32.0.tgz#751ecca0e2fecd3d44484a9b3049ffc1871616e5" + integrity sha512-lhtYqQ2iEPV5JqV7K+uOVlPePjClj4dOw7K4/Z1F2yvjIUvyr13yJnDzkK6uon4BjHYuHy3EG0c2Z9jEhFk56w== + dependencies: + "@typescript-eslint/scope-manager" "4.32.0" + "@typescript-eslint/types" "4.32.0" + "@typescript-eslint/typescript-estree" "4.32.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz#e03c8668f8b954072b3f944d5b799c0c9225a7d5" + integrity sha512-DK+fMSHdM216C0OM/KR1lHXjP1CNtVIhJ54kQxfOE6x8UGFAjha8cXgDMBEIYS2XCYjjCtvTkjQYwL3uvGOo0w== + dependencies: + "@typescript-eslint/types" "4.32.0" + "@typescript-eslint/visitor-keys" "4.32.0" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +"@typescript-eslint/types@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.32.0.tgz#52c633c18da47aee09449144bf59565ab36df00d" + integrity sha512-LE7Z7BAv0E2UvqzogssGf1x7GPpUalgG07nGCBYb1oK4mFsOiFC/VrSMKbZQzFJdN2JL5XYmsx7C7FX9p9ns0w== -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.32.0.tgz#db00ccc41ccedc8d7367ea3f50c6994b8efa9f3b" + integrity sha512-tRYCgJ3g1UjMw1cGG8Yn1KzOzNlQ6u1h9AmEtPhb5V5a1TmiHWcRyF/Ic+91M4f43QeChyYlVTcf3DvDTZR9vw== + dependencies: + "@typescript-eslint/types" "4.32.0" + "@typescript-eslint/visitor-keys" "4.32.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.32.0.tgz#455ba8b51242f2722a497ffae29313f33b14cb7f" + integrity sha512-e7NE0qz8W+atzv3Cy9qaQ7BTLwWsm084Z0c4nIO2l3Bp6u9WIgdqCgyPyV5oSPDMIW3b20H59OOCmVk3jw3Ptw== + dependencies: + "@typescript-eslint/types" "4.32.0" + eslint-visitor-keys "^2.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@welldone-software/why-did-you-render@6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@welldone-software/why-did-you-render/-/why-did-you-render-6.2.1.tgz#6a87926cc8386b748dc07341cf495caa5be1db28" + integrity sha512-eIVKeK6ueS3tuzCqMVTaaNrPYvb9cA8NHiNgLA7Op8SD4TiT31zqNjxmhzLEK+y3sBxcwr6YhsiQGX9EThrvaw== + dependencies: + lodash "^4" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== -camel-case@3.0.x: +abort-controller@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" + event-target-shim "^5.0.0" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" + mime-types "~2.1.24" + negotiator "0.6.2" -camelcase@^1.0.2, camelcase@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +acorn-bigint@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/acorn-bigint/-/acorn-bigint-0.4.0.tgz#af3245ed8a7c3747387fca4680ae1960f617c4cd" + integrity sha512-W9iaqWzqFo7ZBLmI9dMjHYGrN0Nm/ZgToqhvd3RELJux7RsX6k1/80h+bD9TtTpeKky/kYNbr3+vHWqI3hdyfA== -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" +acorn-class-fields@^0.3.1: + version "0.3.7" + resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.3.7.tgz#a35122f3cc6ad2bb33b1857e79215677fcfdd720" + integrity sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ== + dependencies: + acorn-private-class-elements "^0.2.7" -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" +acorn-export-ns-from@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/acorn-export-ns-from/-/acorn-export-ns-from-0.1.0.tgz#192687869bba3bcb2ef1a1ba196486ea7e100e5c" + integrity sha512-QDQJBe2DfxNBIMxs+19XY2i/XXilJn+kPgX30HWNYK4IXoNj3ACNSWPU7szL0SzqjFyOG4zoZxG9P7JfNw5g7A== + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" + acorn "^7.1.1" + acorn-walk "^7.1.1" -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000804" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000804.tgz#84feb42018fc64cf6aff6371e43115f292c00179" +acorn-import-meta@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/acorn-import-meta/-/acorn-import-meta-1.1.0.tgz#c384423462ee7d4721d4de83231021a36cb09def" + integrity sha512-pshgiVR5mhpjFVdizKTN+kAGRqjJFUOEB3TvpQ6kiAutb1lvHrIVVcGoe5xzMpJkVNifCeymMG7/tsDkWn8CdQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" +acorn-logical-assignment@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/acorn-logical-assignment/-/acorn-logical-assignment-0.1.4.tgz#1a143a21f022e1707b2bc82f587ae2943f0a570e" + integrity sha512-SeqO1iRtc/NeXo4bTkyK0hN0CIoKi/FQMN1NqhTr5UxqEn4p2wKNTZl+xzvU7i2u/k0f66YR7pNPi2ckPwYubg== + +acorn-numeric-separator@^0.3.0: + version "0.3.6" + resolved "https://registry.yarnpkg.com/acorn-numeric-separator/-/acorn-numeric-separator-0.3.6.tgz#af7f0abaf8e74bd9ca1117602954d0a3b75804f3" + integrity sha512-jUr5esgChu4k7VzesH/Nww3EysuyGJJcTEEiXqILUFKpO96PNyEXmK21M6nE0TSqGA1PeEg1MzgqJaoFsn9JMw== + +acorn-private-class-elements@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz#b14902c705bcff267adede1c9f61c1a317ef95d2" + integrity sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA== + +acorn-private-methods@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/acorn-private-methods/-/acorn-private-methods-0.3.3.tgz#724414ce5b2fec733089d73a5cbba8f7beff75b1" + integrity sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w== dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + acorn-private-class-elements "^0.2.7" + +acorn-stage3@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/acorn-stage3/-/acorn-stage3-2.1.0.tgz#63ffe0f00b8ac7ccdce34ce82b3b9a6777af390a" + integrity sha512-6R3IWwmMl1MBYf6JtaquuE8OqtCArA1zaDlY7QUeUNDcUzNJoZJm1nFQrv0SzdjkRv1khADbMfucFsF661LGow== + dependencies: + acorn-bigint "^0.4.0" + acorn-class-fields "^0.3.1" + acorn-dynamic-import "^4.0.0" + acorn-export-ns-from "^0.1.0" + acorn-import-meta "^1.0.0" + acorn-logical-assignment "^0.1.0" + acorn-numeric-separator "^0.3.0" + acorn-private-methods "^0.3.0" + acorn-static-class-features "^0.2.0" + +acorn-static-class-features@^0.2.0: + version "0.2.4" + resolved "https://registry.yarnpkg.com/acorn-static-class-features/-/acorn-static-class-features-0.2.4.tgz#a0f5261dd483f25196716854f2d7652a1deb39ee" + integrity sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA== + dependencies: + acorn-private-class-elements "^0.2.7" + +acorn-walk@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.0.0, acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== -chai@3.0.0, chai@~3.0: +adjust-sourcemap-loader@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.0.0.tgz#71bfd1034fc8c2d8c5053875bb38f59b2a6f1928" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" + loader-utils "^2.0.0" + regex-parser "^2.2.11" -chain-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" -chalk@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.0.tgz#09b453cec497a75520e4a60ae48214a8700e0921" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: - ansi-styles "^2.1.0" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + clean-stack "^2.0.0" + indent-string "^4.0.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" +ajv@^8.0.1: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -chokidar@^1.0.0, chokidar@^1.0.1, chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - chalk "^1.1.3" + type-fest "^0.21.3" -classnames@^2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" +ansi-html@0.0.7, ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= -classnames@^2.2.5: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -clean-css@4.2.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" - integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - source-map "~0.6.0" + color-convert "^1.9.0" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - restore-cursor "^1.0.1" + color-convert "^2.0.1" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -cli@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - exit "0.1.2" - glob "^7.1.1" + micromatch "^3.1.4" + normalize-path "^2.1.1" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + normalize-path "^3.0.0" + picomatch "^2.0.4" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" + buffer-equal "^1.0.0" -clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" +argparse@^1.0.10, argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - q "^1.1.2" + sprintf-js "~1.0.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: - color-name "^1.1.1" + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" -color-name@^1.0.0, color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -colors@^1.0.3, colors@^1.1.0, colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -combined-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" +array-includes@^3.1.1, array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: - delayed-stream "0.0.5" - -commander@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" - -commander@2.17.x: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== - -commander@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" - -commander@^2.11.0, commander@^2.5.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" - -commander@~2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" -commoner@^0.10.1, commoner@~0.10.3: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" + array-uniq "^1.0.1" -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -compressible@~2.0.11: - version "2.0.12" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: - mime-db ">= 1.30.0 < 2" + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" -compression@^1.5.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" +array.prototype.flatmap@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== dependencies: - accepts "~1.3.4" - bytes "3.0.0" - compressible "~2.0.11" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" -concat-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -connect-history-api-fallback@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -connect@^3.3.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da" +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: - debug "2.6.9" - finalhandler "1.0.6" - parseurl "~1.3.2" - utils-merge "1.0.1" + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" -console-browserify@1.1.x, console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + object-assign "^4.1.1" + util "0.10.3" -constants-browserify@^1.0.0: +assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -convert-source-map@^1.1.0, convert-source-map@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -copy-to-clipboard@^3: - version "3.0.8" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" - dependencies: - toggle-selection "^1.0.3" +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -core-js@^1.0.0, core-js@^1.0.1: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" +author-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-0.2.1.tgz#8bdefaac6065a931799bec07eeef51b940e08f3c" + integrity sha1-i976rGBlqTF5m+wH7u9RuUDgjzw= -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +autoprefixer@^9.6.1: + version "9.8.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.7.tgz#e3c12de18a800af1a1a8155fbc01dc7de29ea184" + integrity sha512-7Hg99B1eTH5+LgmUBUSmov1Z3bsggQJS7v3IMGo6wcScnbRuvtMc871J9J+4bSbIqa9LSX/zypFXJ8sXHpMJeQ== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + nanocolors "^0.2.8" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +axe-core@^4.0.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" + integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== -coveralls@2.11.4: - version "2.11.4" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.4.tgz#b42f4e156f6ba9419d27434a4289094f219267f7" +axios-debug-log@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/axios-debug-log/-/axios-debug-log-0.6.2.tgz#c7761ced8f1990e6d48c556b517af8e00edcef31" + integrity sha512-aavexsFWw+T09e9JkbsNe/zLjdG4r2vwhnKUtCNC/0wpogI/i+bQWJ0jJIuXof734dQ43uiOiFPgbRu8EVa64Q== dependencies: - js-yaml "3.0.1" - lcov-parse "0.0.6" - log-driver "1.2.4" - request "2.40.0" + "@types/debug" "^4.0.0" + debug "^4.0.0" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" +axios-mock-adapter@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.18.2.tgz#01fa9e88e692e8f1bbc1ad1200dde672486e03c7" + integrity sha512-e5aTsPy2Viov22zNpFTlid76W1Scz82pXeEwwCXdtO85LROhHAF8pHF2qDhiyMONLxKyY3lQ+S4UCsKgrlx8Hw== dependencies: - lru-cache "^4.0.1" - which "^1.2.9" + fast-deep-equal "^3.1.1" + is-buffer "^2.0.3" -cryptiles@0.2.x: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" +axios@0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== dependencies: - boom "0.4.x" + follow-redirects "1.5.10" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" +axios@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: - boom "2.x.x" + follow-redirects "^1.14.0" -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== dependencies: - boom "5.x.x" + babylon "^6.18.0" -crypto-browserify@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" +babel-jest@^26.6.0, babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-jest@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.2.4.tgz#21ed6729d51bdd75470bbbf3c8b08d86209fb0dc" + integrity sha512-f24OmxyWymk5jfgLdlCMu4fTs4ldxFBIdn5sJdhvGC1m08rSkJ5hYbWkNmfBSvE/DjhCVNSHXepxsI6THGfGsg== + dependencies: + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^27.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" + integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== dependencies: - browserify-aes "0.4.0" - pbkdf2-compat "2.0.1" - ripemd160 "0.2.0" - sha.js "2.2.6" + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" +babel-plugin-named-asset-import@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" + integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== -css-in-js-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz#5af1dd70f4b06b331f48d22a3d86e0786c0b9435" +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: - hyphenate-style-name "^1.0.2" + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" -css-loader@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.23.1.tgz#9fa23f2b5c0965235910ad5ecef3b8a36390fe50" - dependencies: - css-selector-tokenizer "^0.5.1" - cssnano ">=2.6.1 <4" - loader-utils "~0.2.2" - lodash.camelcase "^3.0.1" - object-assign "^4.0.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.0.0" - postcss-modules-local-by-default "^1.0.1" - postcss-modules-scope "^1.0.0" - postcss-modules-values "^1.1.0" - source-list-map "^0.1.4" - -css-select@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= +babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" -css-selector-tokenizer@^0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz#139bafd34a35fd0c1428487049e0699e6f6a2c21" +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" +"babel-plugin-styled-components@>= 1.12.0": + version "1.13.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" + integrity sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA== dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= -"cssnano@>=2.6.1 <4": - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-jest@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" + integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== + dependencies: + babel-plugin-jest-hoist "^27.2.0" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" + integrity sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg== + dependencies: + "@babel/core" "7.12.3" + "@babel/plugin-proposal-class-properties" "7.12.1" + "@babel/plugin-proposal-decorators" "7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" + "@babel/plugin-proposal-numeric-separator" "7.12.1" + "@babel/plugin-proposal-optional-chaining" "7.12.1" + "@babel/plugin-transform-flow-strip-types" "7.12.1" + "@babel/plugin-transform-react-display-name" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.1" + "@babel/preset-env" "7.12.1" + "@babel/preset-react" "7.12.1" + "@babel/preset-typescript" "7.12.1" + "@babel/runtime" "7.12.1" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: - clap "^1.0.9" - source-map "^0.5.3" + core-js "^2.4.0" + regenerator-runtime "^0.11.0" -csstype@^2.2.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -ctype@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= -d2-manifest@^1.0.0-2: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d2-manifest/-/d2-manifest-1.0.0.tgz#19d4a4c4e8151442ab730e932c9c2170be9ebcc9" +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== dependencies: - author-regex "^0.2.1" - colors "^1.0.3" - lodash.isplainobject "^4.0.3" - loglevel "^1.4.0" - minimist "^1.1.0" - readline-sync "^1.4.1" + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" -"d2-ui@github:EyeSeeTea/d2-ui#user-extended-app": - version "27.0.1" - resolved "https://codeload.github.com/EyeSeeTea/d2-ui/tar.gz/9480ff44ae953075990fd77ce1623ef750858dcc" +big-integer@^1.6.16: + version "1.6.49" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.49.tgz#f6817d3ea5d4f3fb19e24df9f4b1b4471a8328ce" + integrity sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw== -d2-utilizr@0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/d2-utilizr/-/d2-utilizr-0.2.9.tgz#b1cdf25820c825cf683a0bdd69a88fa524a424d3" - dependencies: - lodash.isboolean "^3.0.3" - lodash.isfunction "^3.0.8" - lodash.ismap "^4.3.0" - lodash.isnumber "^3.0.3" - lodash.isobject "^3.0.2" - lodash.isset "^4.3.0" - lodash.isstring "^4.0.1" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -d2@27.0.0-8: - version "27.0.0-8" - resolved "https://registry.yarnpkg.com/d2/-/d2-27.0.0-8.tgz#9cbad9d0f37d149c03412ace358e30f18e561eb0" +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: - whatwg-fetch "^2.0.3" + file-uri-to-path "1.0.0" -d3-color@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.2.tgz#83cb4b3a9474e40795f009d97e97a15649830bbc" +bluebird@^3.5.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -d3@^3.5.6: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: - es5-ext "~0.10.2" + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" +bowser@^1.7.3: + version "1.9.4" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" + integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - assert-plus "^1.0.0" + balanced-match "^1.0.0" + concat-map "0.0.1" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" -dateformat@^1.0.6: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" + fill-range "^7.0.1" -debug@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" +broadcast-channel@^3.4.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" + integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.1.0" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + oblivious-set "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -debug@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.2.tgz#3849591c10cce648476c3c7c2e2e3416db5963c4" +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: - ms "0.6.2" + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" -debug@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.3.tgz#fc8c6b2d6002804b4081c0208e0f6460ba1fa3e4" +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: - ms "0.6.2" + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" -debug@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-1.0.4.tgz#5b9c256bd54b6ec02283176fa8a0ede6d154cbf8" +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: - ms "0.6.2" + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" -debug@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef" +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - ms "0.6.2" + bn.js "^5.0.0" + randombytes "^2.0.1" -debug@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.1.0.tgz#33ab915659d8c2cc8a41443d94d6ebd37697ed21" +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: - ms "0.6.2" + pako "~1.0.5" -debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== dependencies: - ms "2.0.0" + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.1, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.17.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.2.tgz#aa15dbd2fab399a399fe4df601bb09363c5458a6" + integrity sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ== + dependencies: + caniuse-lite "^1.0.30001261" + electron-to-chromium "^1.3.854" + escalade "^3.1.1" + nanocolors "^0.2.12" + node-releases "^1.1.76" -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: - type-detect "0.1.1" + fast-json-stable-stringify "2.x" -deep-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -deep-is@~0.1.2, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= -define-properties@^1.1.2: +buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001261: + version "1.0.30001261" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz#96d89813c076ea061209a4e040d8dcf0c66a1d01" + integrity sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +chain-function@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" + integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +classnames@2.3.1, classnames@^2.2.5, classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -defs@~1.1.0: +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-deep@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +clsx@^1.0.2, clsx@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" - dependencies: - alter "~0.2.0" - ast-traverse "~0.1.1" - breakable "~1.0.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - simple-fmt "~0.1.0" - simple-is "~0.2.0" - stringmap "~0.2.2" - stringset "~0.2.1" - tryor "~0.1.2" - yargs "~3.27.0" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +cmd-ts@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/cmd-ts/-/cmd-ts-0.7.0.tgz#c718555baeb4653b27c235b64206fa7c9ff70bda" + integrity sha512-4pmMPaBrVtK2+dC1FxublDtPsukrz3efLA9kc1k1DfX1i7YxZ37UBYZ/b6fTHY91l6hyqntwrTTbwV4MyzqXoQ== dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" + chalk "^4.0.0" + debug "^4.1.1" + didyoumean "^1.2.1" + strip-ansi "^6.0.0" -delayed-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -delayed-stream@~1.0.0: +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colors@^1.0.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.15.1, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.13: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.6.2: + version "3.18.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.1.tgz#01942a0877caf9c6e5007c027183cf0bdae6a191" + integrity sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg== + dependencies: + browserslist "^4.17.1" + semver "7.0.0" + +core-js-pure@^3.16.0: + version "3.18.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.1.tgz#097d34d24484be45cea700a448d1e74622646c80" + integrity sha512-kmW/k8MaSuqpvA1xm2l3TVlBuvW+XBkcaOroFUpO3D4lsTGQWBTb/tBDCf/PNkkPLrwgrkQRIYNPB0CeqGJWGQ== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.6.5: + version "3.18.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.1.tgz#289d4be2ce0085d40fc1244c0b1a54c00454622f" + integrity sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +craco@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/craco/-/craco-0.0.3.tgz#1e464b0ae5d9176570382d3a3fcdbf3599577012" + integrity sha512-eeibbwJm1CTf/j3xvNgNmsRS7abegp4Cfm5qtn5nE9/0JjZRas+FHj8IlT8FMFWR0XOyZFGcWZgzaTU19DNGoQ== + dependencies: + "@babel/core" "^7.6.0" + "@craco/craco" "^5.5.0" + "@types/babel__core" "^7.1.3" + "@types/webpack" "^4.39.2" + webpack "^4.41.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" -delegates@^1.0.0: +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cron-parser@^2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.18.0.tgz#de1bb0ad528c815548371993f81a54e5a089edcf" + integrity sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg== + dependencies: + is-nan "^1.3.0" + moment-timezone "^0.5.31" + +cronstrue@^1.81.0: + version "1.117.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.117.0.tgz#a7413ca510a85935380ae1ad8fef99d5b31ce8a4" + integrity sha512-XeRPOHNnkitGDqiLj3V6XJgn/UbrRSaWdVrDjV/IBt2cT+SRPeURiTt6Fbm16liCp78+XFklwuwWpPzPBg08NQ== + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +cryptr@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cryptr/-/cryptr-4.0.2.tgz#8a93b5ca7667d1a6131e396bab23a134ff1f5dc6" + integrity sha512-gLTcYjmLGe0Kk1yyacvjNKvSdkWBNNgG2tDnbRQP7yE559x/RJLo/I3WAmwCXNXf/fzMHCNp9vDv3PCopZDpXw== + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + +css-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.1" + semver "^7.3.2" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.5.2: + version "2.6.18" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.18.tgz#980a8b53085f34af313410af064f2bd241784218" + integrity sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ== -depd@1.1.1: +csstype@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +cypress-xpath@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/cypress-xpath/-/cypress-xpath-1.6.2.tgz#e9d44c3ab694fefa8608f1d977e3e389647f10d3" + integrity sha512-mtwJPl840GQPGtb480fKR5vDIcijBHhAVwby5/AIPIT/UVT7UJhM2L42/R+venR7N01I0PoOJErb6UiMbCyUxg== + +d2-manifest@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d2-manifest/-/d2-manifest-1.0.0.tgz#19d4a4c4e8151442ab730e932c9c2170be9ebcc9" + integrity sha1-GdSkxOgVFEKrcw6TLJwhcL6evMk= + dependencies: + author-regex "^0.2.1" + colors "^1.0.3" + lodash.isplainobject "^4.0.3" + loglevel "^1.4.0" + minimist "^1.1.0" + readline-sync "^1.4.1" + +d2-ui@29.0.35: + version "29.0.35" + resolved "https://registry.yarnpkg.com/d2-ui/-/d2-ui-29.0.35.tgz#b0f8540957e90ded7bf2257bbd2604b7b8034c0c" + integrity sha512-NS4YXUdDti5igBLAT+IdWnQeAygf/m2ubG8+nakkrKhP4RHGgwuZmKveLKkpmbZDATvE4Dz/0DLnTaP+/ZLgaA== + +d2-utilizr@0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/d2-utilizr/-/d2-utilizr-0.2.16.tgz#b71df7ca8c7ab5125ca8bdb4899611bc6782a754" + integrity sha512-8Cqwe/3TIsHeLfRVsWFKYqRrY3ZzuHAJqkEMCPGW9gyNCAAnTPVjROFwBwonv0zodQhVntn1DlJCay/GTBPj1A== + dependencies: + lodash.isboolean "^3.0.3" + lodash.isfunction "^3.0.8" + lodash.ismap "^4.3.0" + lodash.isnumber "^3.0.3" + lodash.isobject "^3.0.2" + lodash.isset "^4.3.0" + lodash.isstring "^4.0.1" + +d2@27.0.0-8: + version "27.0.0-8" + resolved "https://registry.yarnpkg.com/d2/-/d2-27.0.0-8.tgz#9cbad9d0f37d149c03412ace358e30f18e561eb0" + integrity sha1-nLrZ0PN9FJwDQSrONY4w8Y5WHrA= + dependencies: + whatwg-fetch "^2.0.3" + +d2@^31.8.1: + version "31.10.0" + resolved "https://registry.yarnpkg.com/d2/-/d2-31.10.0.tgz#0b7e14d0c33edfe4b1cd77bc8fee3edb293d7a04" + integrity sha512-H1g0qXYAmAoHi57I4wBvKcuNjz4XEakSpt4Dpau0ubUee9Zmk0SlbzFQA47s43F09iQRY1Cw189TzAfkC4YK+Q== + dependencies: + isomorphic-fetch "^2.2.1" + +d2@~31.7: + version "31.7.0" + resolved "https://registry.yarnpkg.com/d2/-/d2-31.7.0.tgz#3a843240fecaafdf213da78b55aed9b8611ee22e" + integrity sha512-+ubKyPWKxUz90g5RHCYIt4KxKPzcCOBvDS7X0076XSycecfx4qvtkGBcKyFmXdz27iwTLUpNtruL9pUK9aTi/A== + dependencies: + isomorphic-fetch "^2.2.1" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.14.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.24.0.tgz#7d86dc0d93c87b76b63d213b4413337cfd1c105d" + integrity sha512-6ujwvwgPID6zbI0o7UbURi2vlLDR9uP26+tW6Lg+Ji3w7dd0i3DOcjcClLjLPranT60SSEFBwdSyYwn/ZkPIuw== + +date-format@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-equal@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.0.0, deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" -depd@~1.1.1: +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" +detect-node@^2.0.4, detect-node@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: - repeating "^2.0.0" + address "^1.0.1" + debug "^2.6.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +didyoumean@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -detective@^4.3.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" - dependencies: - acorn "^5.2.1" - defined "^1.0.0" +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" +diff-sequences@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -disposables@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/disposables/-/disposables-1.0.2.tgz#36c6a674475f55a2d6913567a601444e487b4b6e" +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" -dnd-core@^2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-2.5.4.tgz#0c70a8dcbb609c0b222e275fcae9fa83e5897397" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - asap "^2.0.6" - invariant "^2.0.0" - lodash "^4.2.0" - redux "^3.7.1" + path-type "^4.0.0" -doctrine@1.3.x: - version "1.3.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + ip "^1.1.0" + safe-buffer "^5.0.1" -doctrine@^1.2.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + buffer-indexof "^1.0.0" -doctrine@^2.0.0: +doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" -dom-converter@^0.2: +dom-accessibility-api@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.7.tgz#8c2aa6325968f2933160a0b7dbb380893ddf3e7d" + integrity sha512-ml3lJIq9YjUfM9TUnEPvEYWFSwivwIGBPKpewX7tii7fwCazA8yCioGdqQcNsItPpfFvSJ3VIdMQPj60LJhcQA== + +dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== @@ -2175,64 +5908,67 @@ dom-converter@^0.2: utila "~0.4" dom-helpers@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" -dom-serialize@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domhandler@2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - dependencies: - domelementtype "1" +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== dependencies: - domelementtype "1" + webidl-conversions "^5.0.0" -domutils@1.5, domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== dependencies: - dom-serializer "0" - domelementtype "1" + domelementtype "^2.2.0" -domutils@^1.5.1: +domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -2240,604 +5976,852 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +dotenv@^8.0.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +downshift@5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-5.4.2.tgz#3f6b7bf4ad7e0ff5503414efe3a398421763ebae" + integrity sha512-IVwIc4iw5OF5Bi/MbITarW2E8/5akm++5b6UL7aXyPoZmuVe4ilFGaQaktdFW/IwuzHieIwaWj4AQgI0lQNslQ== + dependencies: + "@babel/runtime" "^7.9.1" + compute-scroll-into-view "^1.0.13" + prop-types "^15.7.2" + react-is "^16.13.1" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +editions@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" + integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== dependencies: - jsbn "~0.1.0" + errlop "^2.0.0" + semver "^6.3.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.854: + version "1.3.854" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz#003f0b9c80eccc35be0ef04a0e0b1c31a10b90d5" + integrity sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -electron-to-chromium@^1.2.7: - version "1.3.33" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz#bf00703d62a7c65238136578c352d6c5c042a545" +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.1: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -engine.io-client@1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.5.4.tgz#c6ad65a65752a29cb930c6911e579d2b28d1106c" - dependencies: - component-emitter "1.1.2" - component-inherit "0.0.3" - debug "1.0.4" - engine.io-parser "1.2.2" - has-cors "1.0.3" - indexof "0.0.1" - parsejson "0.0.1" - parseqs "0.0.2" - parseuri "0.0.4" - ws "0.8.0" - xmlhttprequest "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz" - -engine.io-parser@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.2.2.tgz#cd081041feea39c64323ff79b82a90a72afcccdd" +encoding@^0.1.11, encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.2" - blob "0.0.4" - has-binary "0.1.6" - utf8 "2.1.0" + iconv-lite "^0.6.2" -engine.io@1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.5.4.tgz#c6141012911c350631c1b390f5324eb4202e29f2" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: - base64id "0.1.0" - debug "1.0.3" - engine.io-parser "1.2.2" - ws "0.8.0" + once "^1.4.0" -enhanced-resolve@~0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" +enhanced-resolve@^4.3.0, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" - memory-fs "^0.2.0" - tapable "^0.1.8" + memory-fs "^0.5.0" + tapable "^1.0.0" -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" -entities@1.0: +ensure-array@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + resolved "https://registry.yarnpkg.com/ensure-array/-/ensure-array-1.0.0.tgz#317e9fc632c656bb849eb649133528e205b23abc" + integrity sha512-A+3Ntl5WS+GjDnHtC67dKIjw+IoGoeFdNvjn3ZfKEmZgWUz0nxBPE4W52QMCbGZsat0VwWskD5T6AEpe3T2d1g== -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +eol@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" + integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== -envify@^3.0.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8" - dependencies: - jstransform "^11.0.3" - through "~2.3.4" +errlop@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" + integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== -errno@^0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" + stackframe "^1.1.1" -es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" +es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.1, es-abstract@^1.18.2: + version "1.18.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.7.tgz#122daaa523d0a10b0f1be8ed4ce1ee68330c5bb2" + integrity sha512-uFG1gyVX91tZIiDWNmPsL8XNpiCk/6tkB7MZphoSJflS4w+KgWyQ2gjCVDnsPxFAo9WjRXG3eqONNYdfbJjAtw== dependencies: - es-to-primitive "^1.1.1" + call-bind "^1.0.2" + es-to-primitive "^1.2.1" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-string "^1.0.7" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6: - version "0.10.38" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== dependencies: es6-iterator "~2.0.3" - es6-symbol "~3.1.1" + es6-symbol "~3.1.3" + next-tick "~1.0.0" -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: +es6-iterator@2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-iterator@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" - dependencies: - d "~0.1.1" - es5-ext "~0.10.5" - es6-symbol "~2.0.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@^0.1.4, es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" + d "^1.0.1" + ext "^1.1.2" -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: +escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-symbol@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" - dependencies: - d "~0.1.1" - es5-ext "~0.10.5" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -es6-weak-map@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" - dependencies: - d "~0.1.1" - es5-ext "~0.10.6" - es6-iterator "~0.1.3" - es6-symbol "~2.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.6.x: - version "1.6.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.6.1.tgz#367de17d8510540d12bc6dcb8b3f918391265815" +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: - esprima "^1.2.2" - estraverse "^1.9.1" - esutils "^1.1.6" - optionator "^0.5.0" + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" optionalDependencies: - source-map "~0.1.40" + source-map "~0.6.1" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" +eslint-config-react-app@6.0.0, eslint-config-react-app@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" + integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" + confusing-browser-globals "^1.0.10" -eslint-config-airbnb-base@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" - -eslint-config-airbnb@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-12.0.0.tgz#ab282b756a25f03d04ac264c24d673a08a803270" +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - eslint-config-airbnb-base "^8.0.0" + debug "^3.2.7" + resolve "^1.20.0" -eslint-config-dhis2@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-dhis2/-/eslint-config-dhis2-2.1.0.tgz#ee6a6fa2d92be85ea182c0be838c6e4b36bc2926" +eslint-module-utils@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-cypress@2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz#9aeee700708ca8c058e00cdafe215199918c2632" + integrity sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA== + dependencies: + globals "^11.12.0" + +eslint-plugin-flowtype@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-6.1.0.tgz#626f44d9adbdb681644accd5fa29dffcb0d6d531" + integrity sha512-md72y02Gq/1mmLkW31wPpUmjT0CSYHbFA1IVfkQ1kViaFrKYGR1yCWKS1THqz0hmoIUlx8Jm7NHa4B6lDvJj3g== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-flowtype@^5.2.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz#7764cc63940f215bf3f0bd2d9a1293b2b9b2b4bb" + integrity sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw== + dependencies: + lodash "^4.17.15" + string-natural-compare "^3.0.1" + +eslint-plugin-import@2.24.2, eslint-plugin-import@^2.22.1: + version "2.24.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" + integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.6.2" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.6.0" + minimatch "^3.0.4" + object.values "^1.1.4" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" + +eslint-plugin-jest@^24.1.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.5.0.tgz#a223a0040a19af749a161807254f0e47f5bfdcc3" + integrity sha512-Cm+XdX7Nms2UXGRnivHFVcM3ZmlKheHvc9VD78iZLO1XcqB59WbVjrMSiesCbHDlToxWjMJDiJMgc1CzFE13Vg== dependencies: - eslint "^3.8.1" - eslint-config-airbnb "^12.0.0" - eslint-plugin-import "1.16.0" - eslint-plugin-jsx-a11y "^2.2.3" - eslint-plugin-react "^6.4.1" - lodash.assign "^4.0.4" - strip-json-comments "2.0.1" + "@typescript-eslint/experimental-utils" "^4.0.1" -eslint-import-resolver-node@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" +eslint-plugin-jsx-a11y@6.4.1, eslint-plugin-jsx-a11y@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-react-hooks@4.2.0, eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@7.26.1, eslint-plugin-react@^7.21.5: + version "7.26.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz#41bcfe3e39e6a5ac040971c1af94437c80daa40e" + integrity sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" + doctrine "^2.1.0" + estraverse "^5.2.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.hasown "^1.0.0" + object.values "^1.1.4" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.5" + +eslint-plugin-testing-library@^3.9.2: + version "3.10.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" + integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== + dependencies: + "@typescript-eslint/experimental-utils" "^3.10.1" + +eslint-plugin-unused-imports@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.5.tgz#a2b992ef0faf6c6c75c3815cc47bde76739513c2" + integrity sha512-TeV8l8zkLQrq9LBeYFCQmYVIXMjfHgdRQLw7dEZp4ZB3PeR10Y5Uif11heCsHRmhdRIYMoewr1d9ouUHLbLHew== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: - debug "^2.2.0" - object-assign "^4.0.1" - resolve "^1.1.6" + esrecurse "^4.1.0" + estraverse "^4.1.1" -eslint-plugin-import@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.2.0" - doctrine "1.3.x" - es6-map "^0.1.3" - es6-set "^0.1.4" - eslint-import-resolver-node "^0.2.0" - has "^1.0.1" - lodash.cond "^4.3.0" - lodash.endswith "^4.0.1" - lodash.find "^4.3.0" - lodash.findindex "^4.3.0" - minimatch "^3.0.3" - object-assign "^4.0.1" - pkg-dir "^1.0.0" - pkg-up "^1.0.0" + esrecurse "^4.3.0" + estraverse "^4.1.1" -eslint-plugin-jsx-a11y@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: - damerau-levenshtein "^1.0.0" - jsx-ast-utils "^1.0.0" - object-assign "^4.0.1" + eslint-visitor-keys "^1.1.0" -eslint-plugin-react@^6.3.0, eslint-plugin-react@^6.4.1: - version "6.10.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - array.prototype.find "^2.0.1" - doctrine "^1.2.2" - has "^1.0.1" - jsx-ast-utils "^1.3.4" - object.assign "^4.0.4" + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^3.6.0, eslint@^3.8.1: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" +eslint-webpack-plugin@^2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz#473b84932f1a8e2c2b8e66a402d0497bf440b986" + integrity sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw== + dependencies: + "@types/eslint" "^7.2.6" + arrify "^2.0.1" + jest-worker "^26.6.2" + micromatch "^4.0.2" + normalize-path "^3.0.0" + schema-utils "^3.0.0" + +eslint@7.32.0, eslint@^7.11.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - -espree@^3.4.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^5.4.0" - acorn-jsx "^3.0.0" - -esprima-fb@^15001.1.0-dev-harmony-fb: - version "15001.1.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" - -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - -esprima@2.5.x: - version "2.5.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" - -esprima@^1.2.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" -"esprima@~ 1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - -esprima@~3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" + estraverse "^5.2.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@~0.3.4, event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== dependencies: - original ">=0.0.5" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + original "^1.0.0" -exit@0.1.2, exit@0.1.x: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-braces@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: - array-slice "^0.2.3" - array-unique "^0.2.1" - braces "^0.1.2" + md5.js "^1.3.4" + safe-buffer "^5.1.1" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== -expand-range@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" - dependencies: - is-number "^0.1.1" - repeat-string "^0.2.2" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -express@^4.13.3: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" - dependencies: - accepts "~1.3.4" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.0, expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +expect@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.4.tgz#4debf546050bcdad8914a8c95fec7662e02bf67c" + integrity sha512-gOtuonQ8TCnbNNCSw2fhVzRf8EFYDII4nB5NmG4IEV0rbUnW1I5zXvoTntU4iicB/Uh0oZr20NGlOLdJiwsOZA== + dependencies: + "@jest/types" "^27.2.4" + ansi-styles "^5.0.0" + jest-get-type "^27.0.6" + jest-matcher-utils "^27.2.4" + jest-message-util "^27.2.4" + jest-regex-util "^27.0.6" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" + body-parser "1.19.0" + content-disposition "0.5.3" content-type "~1.0.4" - cookie "0.3.1" + cookie "0.4.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "~1.1.2" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.2" + parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" - setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: - is-extglob "^1.0.0" + is-extendable "^0.1.0" -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -fast-levenshtein@~1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - websocket-driver ">=0.5.1" + reusify "^1.0.4" -fbjs@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.2.1.tgz#622061630a43e11f845017b9044aaa648ed3f731" +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: - core-js "^1.0.0" - promise "^7.0.3" - whatwg-fetch "^0.9.0" + websocket-driver ">=0.5.1" -fbjs@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: - core-js "^1.0.0" - loose-envify "^1.0.0" - promise "^7.0.3" - ua-parser-js "^0.7.9" - whatwg-fetch "^0.9.0" + bser "2.1.1" -fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.6: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2845,284 +6829,413 @@ fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.6: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.9" + ua-parser-js "^0.7.18" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -file-dialog@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/file-dialog/-/file-dialog-0.0.7.tgz#1cef1a10d25043bb548e2dfa5b00b423ef669f63" +file-dialog@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/file-dialog/-/file-dialog-0.0.8.tgz#9137155ffe4abf4e1546aba3ed17e395fbf92aba" + integrity sha512-KnYitqNf/rANEhUxWzkINAaMVc7SshejwA5HEd5Wr8lEJQX1Js1LCndectS44SXTnXWK+jbHQYs4R6CaG+7Jkg== -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^3.0.4" -file-saver@^1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8" +file-loader@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" +file-saver@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== -fileset@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: - glob "5.x" - minimatch "2.x" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + to-regex-range "^5.0.1" -finalhandler@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" +final-form@^4.20.2: + version "4.20.4" + resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.4.tgz#8d59e36d3248a227265cc731d76c0564dd2606f6" + integrity sha512-hyoOVVilPLpkTvgi+FSJkFZrh0Yhy4BhE6lk/NiBwrF4aRV8/ykKEyXYvQH/pfUbRkOosvpESYouFb+FscsLrw== dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" + "@babel/runtime" "^7.10.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" + parseurl "~1.3.3" + statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" + make-dir "^2.0.0" + pkg-dir "^3.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" + locate-path "^5.0.0" + path-exists "^4.0.0" -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - for-in "^1.0.1" + flatted "^3.1.0" + rimraf "^3.0.2" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -forever-agent@~0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== -form-data@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - async "~0.9.0" - combined-stream "~0.0.4" - mime "~1.2.11" + inherits "^2.0.3" + readable-stream "^2.3.6" -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +fluture@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/fluture/-/fluture-14.0.0.tgz#81e1cae996a262e214aa2a8d7845fe1359018e3b" + integrity sha512-pENtLF948a8DfduVKugT8edTAbFi4rBS94xjHwzLanQqIu5PYtLGl+xqs6H8TaIRL7z/B0cDpswdINzH/HRUGA== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + sanctuary-show "^2.0.0" + sanctuary-type-identifiers "^3.0.0" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fork-ts-checker-webpack-plugin@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.8" mime-types "^2.1.12" -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" - dependencies: - samsam "~1.1" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" -fs-readdir-recursive@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" + minipass "^3.0.0" -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -function-bind@^1.0.2, function-bind@^1.1.1: +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@^2.1.3, fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gaze@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: - globule "^1.0.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: - is-property "^1.0.0" + pump "^3.0.0" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: - assert-plus "^1.0.0" + call-bind "^1.0.2" + get-intrinsic "^1.1.1" -git-validate@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/git-validate/-/git-validate-2.2.2.tgz#9cc8ff001177957a11726ab508d415bb80b18bcf" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" +gettext-parser@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-1.4.0.tgz#f8baf34a292f03d5e42f02df099d301f167a7ace" + integrity sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA== dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + encoding "^0.1.12" + safe-buffer "^5.1.1" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - is-glob "^2.0.0" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - graceful-fs "~2.0.0" - inherits "2" - minimatch "~0.2.11" + is-glob "^4.0.1" -glob@5.x, glob@^5.0.10, glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3131,2245 +7244,4665 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -"global@https://github.com/component/global/archive/v2.0.1.tar.gz": - version "2.0.1" - resolved "https://github.com/component/global/archive/v2.0.1.tar.gz#3fb25343fb66d79991b0f4a429ce3b54480eec3c" - -globals@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" - -globals@^9.14.0, globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0, globals@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" - arrify "^1.0.0" glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" -globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" - dependencies: - glob "~7.1.1" - lodash "~4.17.4" - minimatch "~3.0.2" +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graceful-fs@^4.1.2, graceful-fs@^4.1.4: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -graceful-fs@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" +gulp-sort@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-sort/-/gulp-sort-2.0.0.tgz#c6762a2f1f0de0a3fc595a21599d3fac8dba1aca" + integrity sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso= + dependencies: + through2 "^2.0.1" -growl@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" -handlebars@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-3.0.0.tgz#7f4e537f4dd6992869d66c01b7505eba3561a5d5" +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +handlebars@^4.0.11: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: - optimist "^0.6.1" - source-map "^0.1.40" + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: - uglify-js "~2.3" + uglify-js "^3.1.4" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-binary-data@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/has-binary-data/-/has-binary-data-0.1.3.tgz#8ebb18388b57f19a5231275a16fc18d51f379aae" - dependencies: - isarray "0.0.1" +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - isarray "0.0.1" + has-symbols "^1.0.2" -has-cors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.0.3.tgz#502acb9b3104dac33dd2630eaf2f888b0baf4cb3" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: - global "https://github.com/component/global/archive/v2.0.1.tar.gz" + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" -has-flag@^1.0.0: +has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= -has-symbols@^1.0.0: +has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: - function-bind "^1.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" -has@^1.0.3: +has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hawk@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" - dependencies: - boom "0.4.x" - cryptiles "0.2.x" - hoek "0.9.x" - sntp "0.2.x" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" + inherits "^2.0.3" + minimalistic-assert "^1.0.1" -he@1.2.x: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -history@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/history/-/history-2.1.2.tgz#4aa2de897a0e4867e4539843be6ecdb2986bfdec" +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: - deep-equal "^1.0.0" - invariant "^2.0.0" - query-string "^3.0.0" - warning "^2.0.0" + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" -hoek@0.9.x: - version "0.9.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" -hoist-non-react-statics@^1.0.0, hoist-non-react-statics@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== -hoist-non-react-statics@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0" +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -html-minifier@^3.2.3: - version "3.5.21" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" - integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== - dependencies: - camel-case "3.0.x" - clean-css "4.2.x" - commander "2.17.x" - he "1.2.x" - param-case "2.1.x" - relateurl "0.2.x" - uglify-js "3.4.x" - -html-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" - integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== dependencies: - html-minifier "^3.2.3" - loader-utils "^0.2.16" - lodash "^4.17.3" - pretty-error "^2.0.2" - tapable "^1.0.0" - toposort "^1.0.0" + whatwg-encoding "^1.0.5" + +html-entities@^1.2.1, html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@3.8.x: - version "3.8.3" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" -htmlparser2@^3.3.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: - depd "1.1.1" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" -http-parser-js@>=0.4.0: - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== -http-proxy-middleware@~0.17.1: - version "0.17.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: - http-proxy "^1.16.2" - is-glob "^3.1.0" - lodash "^4.17.2" - micromatch "^2.3.11" + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" -http-proxy@^1.11.1, "http-proxy@git+https://github.com/nicolayr/node-http-proxy.git": - version "1.13.3" - resolved "git+https://github.com/nicolayr/node-http-proxy.git#98b0fbd683dbddb41b8bf876a39d234671c83846" +http-proxy-middleware@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" -http-proxy@^1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -http-signature@~0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - asn1 "0.1.11" - assert-plus "^0.1.5" - ctype "0.5.3" + agent-base "6" + debug "4" -http-signature@~1.1.0: +human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +husky@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.2.tgz#21900da0f30199acca43a46c043c4ad84ae88dff" + integrity sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg== + +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +i18next-conv@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/i18next-conv/-/i18next-conv-6.1.1.tgz#b3f9b0a76a20a67e2902c9e3273642a882a2442d" + integrity sha512-vtFjlOS1/3mDq/sXfDcwHuBj0jMi6xTZehTNhls6ndelaEUn9brHUaE0wuChmoLHOcsqchZZQWWH8gSv41qoZA== + dependencies: + bluebird "^3.5.1" + chalk "^2.4.1" + commander "^2.15.1" + gettext-parser "^1.3.1" + mkdirp "^0.5.1" + node-gettext "^2.0.0" + +i18next-scanner@^2.4.4: + version "2.11.0" + resolved "https://registry.yarnpkg.com/i18next-scanner/-/i18next-scanner-2.11.0.tgz#58c7ffadd5192cdb2b1b2a6c743b1314050ccb4c" + integrity sha512-/QqbSnUj9v6EwndaWeHp8NkHqLKAIHSlI1HXSyLdIPKWYM+Fnpk2tjnyjP8qn7L0rLT7HLH4bvyiw61wOIxf0A== + dependencies: + acorn "^6.0.0" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.2.0" + acorn-stage3 "^2.0.0" + acorn-walk "^6.0.0" + chalk "^2.4.1" + clone-deep "^4.0.0" + commander "^3.0.1" + deepmerge "^4.0.0" + ensure-array "^1.0.0" + eol "^0.9.1" + esprima "^4.0.0" + gulp-sort "^2.0.0" + i18next "*" + lodash "^4.0.0" + parse5 "^5.0.0" + sortobject "^1.1.1" + through2 "^3.0.1" + vinyl "^2.2.0" + vinyl-fs "^3.0.1" + +i18next@*: + version "21.2.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.2.0.tgz#07346948d8c1e7be91518897839f8158c50dd76d" + integrity sha512-I2BLM/YNyEjCzRak1kL3uYYawwkfduQbNramMx7uMjjbos3zGZB1ag6dgbdoTR0baR34fpG4X4oWKaQExNo8wg== dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + "@babel/runtime" "^7.12.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" +i18next@^10.3: + version "10.6.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-10.6.0.tgz#90ffd9f9bc617f34b9a12e037260f524445f7684" + integrity sha1-kP/Z+bxhfzS5oS4DcmD1JERfdoQ= + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + safer-buffer ">= 2.1.2 < 3" -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +iconv-lite@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" -hyphenate-style-name@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@0.4.19, iconv-lite@^0.4.5, iconv-lite@~0.4.13: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^3.2.0: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -immutability-helper@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.6.4.tgz#a931aef97257fcb6d2b5456de652ab6e3bba8408" - dependencies: - invariant "^2.2.0" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -immutable@^3.8.2: +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== + +immutable@3.8.2: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" -in-publish@^2.0.0: +import-fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" -indent-string@^2.1.0: +import-from@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: - repeating "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-prefixer@^3.0.2: +inline-style-prefixer@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534" + integrity sha1-hVG45bTVcyROZqNLBPfTIHaitTQ= dependencies: bowser "^1.7.3" css-in-js-utils "^2.0.0" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -interpret@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" - -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" -invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - loose-envify "^1.0.0" + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" +is-buffer@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" +is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== dependencies: - is-primitive "^2.0.0" + has "^1.0.3" -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" -is-extglob@^1.0.0: +is-data-descriptor@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" -is-finite@^1.0.0: +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: - number-is-nan "^1.0.0" + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: - number-is-nan "^1.0.0" + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" -is-integer@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - is-finite "^1.0.0" + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-my-json-valid@^2.10.0: - version "2.17.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" +is-nan@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" + call-bind "^1.0.0" + define-properties "^1.1.3" -is-number@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== dependencies: - is-path-inside "^1.0.0" + is-path-inside "^2.1.0" -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== dependencies: - path-is-inside "^1.0.1" + path-is-inside "^1.0.2" is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== dependencies: - has "^1.0.1" + is-unc-path "^1.0.0" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-stream@^1.0.1: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.2" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" -is-utf8@^0.2.0: +is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" -isomorphic-fetch@^2.1.1: +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istanbul@0.3.18, istanbul@^0.3.15: - version "0.3.18" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.3.18.tgz#1599ef08f061da235f6e70e848bc9f96dddf12c1" - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.6.x" - esprima "2.5.x" - fileset "0.2.x" - handlebars "3.0.0" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "1.3.x" - which "1.0.x" - wordwrap "0.0.x" - -jade@0.26.3: - version "0.26.3" - resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" - dependencies: - commander "0.6.1" - mkdirp "0.3.0" - -jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" +istanbul-lib-coverage@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" + integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== -js-base64@^2.1.8, js-base64@^2.1.9: - version "2.4.3" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" -js-tokens@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -js-tokens@^3.0.0, js-tokens@^3.0.2: +istanbul-reports@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-changed-files@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.2.4.tgz#d7de46e90e5a599c47e260760f5ab53516e835e6" + integrity sha512-eeO1C1u4ex7pdTroYXezr+rbr957myyVoKGjcY4R1TJi3A+9v+4fu1Iv9J4eLq1bgFyT3O3iRWU9lZsEE7J72Q== + dependencies: + "@jest/types" "^27.2.4" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" + integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.0" + "@jest/test-result" "^26.6.0" + "@jest/types" "^26.6.0" + "@types/babel__traverse" "^7.0.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^26.6.0" + is-generator-fn "^2.0.0" + jest-each "^26.6.0" + jest-matcher-utils "^26.6.0" + jest-message-util "^26.6.0" + jest-runner "^26.6.0" + jest-runtime "^26.6.0" + jest-snapshot "^26.6.0" + jest-util "^26.6.0" + pretty-format "^26.6.0" + stack-utils "^2.0.2" + throat "^5.0.0" + +jest-circus@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.2.4.tgz#3bd898a29dcaf6a506f3f1b780dff5f67ca83c23" + integrity sha512-TtheheTElrGjlsY9VxkzUU1qwIx05ItIusMVKnvNkMt4o/PeegLRcjq3Db2Jz0GGdBalJdbzLZBgeulZAJxJWA== + dependencies: + "@jest/environment" "^27.2.4" + "@jest/test-result" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.2.4" + is-generator-fn "^2.0.0" + jest-each "^27.2.4" + jest-matcher-utils "^27.2.4" + jest-message-util "^27.2.4" + jest-runtime "^27.2.4" + jest-snapshot "^27.2.4" + jest-util "^27.2.4" + pretty-format "^27.2.4" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^26.6.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-cli@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.2.4.tgz#acda7f367aa6e674723fc1a7334e0ae1799448d2" + integrity sha512-4kpQQkg74HYLaXo3nzwtg4PYxSLgL7puz1LXHj5Tu85KmlIpxQFjRkXlx4V47CYFFIDoyl3rHA/cXOxUWyMpNg== + dependencies: + "@jest/core" "^27.2.4" + "@jest/test-result" "^27.2.4" + "@jest/types" "^27.2.4" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + jest-config "^27.2.4" + jest-util "^27.2.4" + jest-validate "^27.2.4" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-config@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.2.4.tgz#0204969f5ae2e5190d47be2c14c04d631b7836e2" + integrity sha512-tWy0UxhdzqiKyp4l5Vq4HxLyD+gH5td+GCF3c22/DJ0bYAOsMo+qi2XtbJI6oYMH5JOJQs9nLW/r34nvFCehjA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^27.2.4" + "@jest/types" "^27.2.4" + babel-jest "^27.2.4" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + is-ci "^3.0.0" + jest-circus "^27.2.4" + jest-environment-jsdom "^27.2.4" + jest-environment-node "^27.2.4" + jest-get-type "^27.0.6" + jest-jasmine2 "^27.2.4" + jest-regex-util "^27.0.6" + jest-resolve "^27.2.4" + jest-runner "^27.2.4" + jest-util "^27.2.4" + jest-validate "^27.2.4" + micromatch "^4.0.4" + pretty-format "^27.2.4" + +jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-diff@^27.0.0, jest-diff@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.2.4.tgz#171c51d3d2c105c457100fee6e7bf7cee51c8d8c" + integrity sha512-bLAVlDSCR3gqUPGv+4nzVpEXGsHh98HjUL7Vb2hVyyuBDoQmja8eJb0imUABsuxBeUVmf47taJSAd9nDrwWKEg== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.0.6" + jest-get-type "^27.0.6" + pretty-format "^27.2.4" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-docblock@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" + integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.0, jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-each@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.2.4.tgz#b4f280aafd63129ba82e345f0e74c5a10200aeef" + integrity sha512-w9XVc+0EDBUTJS4xBNJ7N2JCcWItFd006lFjz77OarAQcQ10eFDBMrfDv2GBJMKlXe9aq0HrIIF51AXcZrRJyg== + dependencies: + "@jest/types" "^27.2.4" + chalk "^4.0.0" + jest-get-type "^27.0.6" + jest-util "^27.2.4" + pretty-format "^27.2.4" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-jsdom@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.2.4.tgz#39ae80bbb8675306bfaf0440be1e5f877554539a" + integrity sha512-X70pTXFSypD7AIzKT1mLnDi5hP9w9mdTRcOGOmoDoBrNyNEg4rYm6d4LQWFLc9ps1VnMuDOkFSG0wjSNYGjkng== + dependencies: + "@jest/environment" "^27.2.4" + "@jest/fake-timers" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + jest-mock "^27.2.4" + jest-util "^27.2.4" + jsdom "^16.6.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-environment-node@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.2.4.tgz#b79f98cb36e0c9111aac859c9c99f04eb2f74ff6" + integrity sha512-ZbVbFSnbzTvhLOIkqh5lcLuGCCFvtG4xTXIRPK99rV2KzQT3kNg16KZwfTnLNlIiWCE8do960eToeDfcqmpSAw== + dependencies: + "@jest/environment" "^27.2.4" + "@jest/fake-timers" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + jest-mock "^27.2.4" + jest-util "^27.2.4" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-get-type@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" + integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-haste-map@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.4.tgz#f8974807bedf07348ca9fd24e5861ab7c8e61aba" + integrity sha512-bkJ4bT00T2K+1NZXbRcyKnbJ42I6QBvoDNMTAQQDBhaGNnZreiQKUNqax0e6hLTx7E75pKDeltVu3V1HAdu+YA== + dependencies: + "@jest/types" "^27.2.4" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.2.4" + jest-worker "^27.2.4" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-jasmine2@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.2.4.tgz#4a1608133dbdb4d68b5929bfd785503ed9c9ba51" + integrity sha512-fcffjO/xLWLVnW2ct3No4EksxM5RyPwHDYu9QU+90cC+/eSMLkFAxS55vkqsxexOO5zSsZ3foVpMQcg/amSeIQ== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^27.2.4" + "@jest/source-map" "^27.0.6" + "@jest/test-result" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.2.4" + is-generator-fn "^2.0.0" + jest-each "^27.2.4" + jest-matcher-utils "^27.2.4" + jest-message-util "^27.2.4" + jest-runtime "^27.2.4" + jest-snapshot "^27.2.4" + jest-util "^27.2.4" + pretty-format "^27.2.4" + throat "^6.0.1" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-leak-detector@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.2.4.tgz#9bb7eab26a73bb280e9298be8d80f389288ec8f1" + integrity sha512-SrcHWbe0EHg/bw2uBjVoHacTo5xosl068x2Q0aWsjr2yYuW2XwqrSkZV4lurUop0jhv1709ymG4or+8E4sH27Q== + dependencies: + jest-get-type "^27.0.6" + pretty-format "^27.2.4" + +jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.4.tgz#008fff018151415ad1b6cfc083fd70fe1e012525" + integrity sha512-nQeLfFAIPPkyhkDfifAPfP/U5wm1x0fLtAzqXZSSKckXDNuk2aaOfQiDYv1Mgf5GY6yOsxfUnvNm3dDjXM+BXw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.2.4" + jest-get-type "^27.0.6" + pretty-format "^27.2.4" + +jest-message-util@^26.6.0, jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-message-util@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.4.tgz#667e8c0f2b973156d1bac7398a7f677705cafaca" + integrity sha512-wbKT/BNGnBVB9nzi+IoaLkXt6fbSvqUxx+IYY66YFh96J3goY33BAaNG3uPqaw/Sh/FR9YpXGVDfd5DJdbh4nA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.2.4" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + pretty-format "^27.2.4" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-mock@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.2.4.tgz#c8f0ef33f73d8ff53e3f60b16d59f1128f4072ae" + integrity sha512-iVRU905rutaAoUcrt5Tm1JoHHWi24YabqEGXjPJI4tAyA6wZ7mzDi3GrZ+M7ebgWBqUkZE93GAx1STk7yCMIQA== + dependencies: + "@jest/types" "^27.2.4" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-regex-util@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" + integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve-dependencies@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.4.tgz#20c41cc02b66aa45169b282356ec73b133013089" + integrity sha512-i5s7Uh9B3Q6uwxLpMhNKlgBf6pcemvWaORxsW1zNF/YCY3jd5EftvnGBI+fxVwJ1CBxkVfxqCvm1lpZkbaoGmg== + dependencies: + "@jest/types" "^27.2.4" + jest-regex-util "^27.0.6" + jest-snapshot "^27.2.4" + +jest-resolve@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" + integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== + dependencies: + "@jest/types" "^26.6.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-resolve@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.2.4.tgz#d3b999f073ff84a8ae109ce99ff7f3223048701a" + integrity sha512-IsAO/3+3BZnKjI2I4f3835TBK/90dxR7Otgufn3mnrDFTByOSXclDi3G2XJsawGV4/18IMLARJ+V7Wm7t+J89Q== + dependencies: + "@jest/types" "^27.2.4" + chalk "^4.0.0" + escalade "^3.1.1" + graceful-fs "^4.2.4" + jest-haste-map "^27.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^27.2.4" + jest-validate "^27.2.4" + resolve "^1.20.0" + slash "^3.0.0" + +jest-runner@^26.6.0, jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runner@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.2.4.tgz#d816f4cb4af04f3cba703afcf5a35a335b77cad4" + integrity sha512-hIo5PPuNUyVDidZS8EetntuuJbQ+4IHWxmHgYZz9FIDbG2wcZjrP6b52uMDjAEQiHAn8yn8ynNe+TL8UuGFYKg== + dependencies: + "@jest/console" "^27.2.4" + "@jest/environment" "^27.2.4" + "@jest/test-result" "^27.2.4" + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-docblock "^27.0.6" + jest-environment-jsdom "^27.2.4" + jest-environment-node "^27.2.4" + jest-haste-map "^27.2.4" + jest-leak-detector "^27.2.4" + jest-message-util "^27.2.4" + jest-resolve "^27.2.4" + jest-runtime "^27.2.4" + jest-util "^27.2.4" + jest-worker "^27.2.4" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^26.6.0, jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-runtime@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.2.4.tgz#170044041e5d30625ab8d753516bbe503f213a5c" + integrity sha512-ICKzzYdjIi70P17MZsLLIgIQFCQmIjMFf+xYww3aUySiUA/QBPUTdUqo5B2eg4HOn9/KkUsV0z6GVgaqAPBJvg== + dependencies: + "@jest/console" "^27.2.4" + "@jest/environment" "^27.2.4" + "@jest/fake-timers" "^27.2.4" + "@jest/globals" "^27.2.4" + "@jest/source-map" "^27.0.6" + "@jest/test-result" "^27.2.4" + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-haste-map "^27.2.4" + jest-message-util "^27.2.4" + jest-mock "^27.2.4" + jest-regex-util "^27.0.6" + jest-resolve "^27.2.4" + jest-snapshot "^27.2.4" + jest-util "^27.2.4" + jest-validate "^27.2.4" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^16.2.0" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-serializer@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" + integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-snapshot@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.2.4.tgz#277b2269437e3ffcb91d95a73b24becf33c5a871" + integrity sha512-5DFxK31rYS8X8C6WXsFx8XxrxW3PGa6+9IrUcZdTLg1aEyXDGIeiBh4jbwvh655bg/9vTETbEj/njfZicHTZZw== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/parser" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.2.4" + graceful-fs "^4.2.4" + jest-diff "^27.2.4" + jest-get-type "^27.0.6" + jest-haste-map "^27.2.4" + jest-matcher-utils "^27.2.4" + jest-message-util "^27.2.4" + jest-resolve "^27.2.4" + jest-util "^27.2.4" + natural-compare "^1.4.0" + pretty-format "^27.2.4" + semver "^7.3.2" + +jest-util@^26.6.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-util@^27.0.0, jest-util@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.2.4.tgz#3d7ce081b2e7f4cfe0156452ac01f3cb456cc656" + integrity sha512-mW++4u+fSvAt3YBWm5IpbmRAceUqa2B++JlUZTiuEt2AmNYn0Yw5oay4cP17TGsMINRNPSGiJ2zNnX60g+VbFg== + dependencies: + "@jest/types" "^27.2.4" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^3.0.0" + picomatch "^2.2.3" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-validate@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.4.tgz#b66d462b2fb93d7e16a47d1aa8763d5600bf2cfa" + integrity sha512-VMtbxbkd7LHnIH7PChdDtrluCFRJ4b1YV2YJzNwwsASMWftq/HgqiqjvptBOWyWOtevgO3f14wPxkPcLlVBRog== + dependencies: + "@jest/types" "^27.2.4" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.0.6" + leven "^3.1.0" + pretty-format "^27.2.4" + +jest-watch-typeahead@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" + integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^26.0.0" + jest-watcher "^26.3.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + +jest-watcher@^26.3.0, jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-watcher@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.2.4.tgz#b1d5c39ab94f59f4f35f66cc96f7761a10e0cfc4" + integrity sha512-LXC/0+dKxhK7cfF7reflRYlzDIaQE+fL4ynhKhzg8IMILNMuI4xcjXXfUJady7OR4/TZeMg7X8eHx8uan9vqaQ== + dependencies: + "@jest/test-result" "^27.2.4" + "@jest/types" "^27.2.4" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.2.4" + string-length "^4.0.1" + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^26.5.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.4.tgz#881455df75e22e7726a53f43703ab74d6b36f82d" + integrity sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" + integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== + dependencies: + "@jest/core" "^26.6.0" + import-local "^3.0.2" + jest-cli "^26.6.0" + +jest@27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.2.4.tgz#70e27bef873138afc123aa4769f7124c50ad3efb" + integrity sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A== + dependencies: + "@jest/core" "^27.2.4" + import-local "^3.0.2" + jest-cli "^27.2.4" + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-yaml@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.0.1.tgz#76405fea5bce30fc8f405d48c6dca7f0a32c6afe" - dependencies: - argparse "~ 0.1.11" - esprima "~ 1.0.2" +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x, js-yaml@^3.5.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsdom@^16.4.0, jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -jshint@*: - version "2.9.5" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.5.tgz#1e7252915ce681b40827ee14248c46d34e9aa62c" - dependencies: - cli "~1.0.0" - console-browserify "1.1.x" - exit "0.1.x" - htmlparser2 "3.8.x" - lodash "3.7.x" - minimatch "~3.0.2" - shelljs "0.3.x" - strip-json-comments "1.0.x" +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.2.6.tgz#f6efc93c06a04de9aec53053df2559bb19e2038b" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" +json5@2.x, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + minimist "^1.2.5" -jstransform@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: - base62 "^1.1.0" - commoner "^0.10.1" - esprima-fb "^15001.1.0-dev-harmony-fb" - object-assign "^2.0.0" - source-map "^0.4.2" + minimist "^1.2.0" -jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" -karma-babel-preprocessor@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-5.2.1.tgz#e56c8c16fb2e6f07ccb4ea1abf78c3d1b176f060" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jss-plugin-camel-case@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.0.tgz#575fd849202d36713a6970796458e375754446c7" + integrity sha512-yxlXrXwcCdGw+H4BC187dEu/RFyW8joMcWfj8Rk9UPgWTKu2Xh7Sib4iW3xXjHe/t5phOHF1rBsHleHykWix7g== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.8.0" + +jss-plugin-default-unit@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.0.tgz#98db5962e62abbf43f1cc111e62cb70ffb09db59" + integrity sha512-9XJV546cY9zV9OvIE/v/dOaxSi4062VfYQQfwbplRExcsU2a79Yn+qDz/4ciw6P4LV1Naq90U+OffAGRHfNq/Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.0" + +jss-plugin-global@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.0.tgz#0c2b0c056087f5846d600f3332eeb7a1a8b9c9f2" + integrity sha512-H/8h/bHd4e7P0MpZ9zaUG8NQSB2ie9rWo/vcCP6bHVerbKLGzj+dsY22IY3+/FNRS8zDmUyqdZx3rD8k4nmH4w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.0" + +jss-plugin-nested@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.0.tgz#7ef9a815e9c9fbede41a8f52ce75cffb4c3b86d5" + integrity sha512-MhmINZkSxyFILcFBuDoZmP1+wj9fik/b9SsjoaggkGjdvMQCES21mj4K5ZnRGVm448gIXyi9j/eZjtDzhaHUYQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.0.tgz#2a83e8ca80d72828495bad57b485f7d55a33543b" + integrity sha512-VY+Wt5WX5GMsXDmd+Ts8+O16fpiCM81svbox++U3LDbJSM/g9FoMx3HPhwUiDfmgHL9jWdqEuvSl/JAk+mh6mQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.0" + +jss-plugin-rule-value-function@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.0.tgz#e011ed180789229e7ea8f75c222d34810bcab520" + integrity sha512-R8N8Ma6Oye1F9HroiUuHhVjpPsVq97uAh+rMI6XwKLqirIu2KFb5x33hPj+vNBMxSHc9jakhf5wG0BbQ7fSDOg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.0.tgz#024b6d77be50b68e5dfca2c75f68091d8b722d61" + integrity sha512-G1zD0J8dFwKZQ+GaZaay7A/Tg7lhDw0iEkJ/iFFA5UPuvZFpMprCMQttXcTBhLlhhWnyZ8YPn4yqp+amrhQekw== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.8.0" + +jss@10.8.0, jss@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.0.tgz#5063ee73aabd9f228ea3849df7962f0d2e213a42" + integrity sha512-6fAMLJrVQ8epM5ghghxWqCwRR0ZamP2cKbOAtzPudcCMSNdAqtvmzQvljUZYR8OXJIeb/IpZeOXA1sDXms4R1w== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - babel-core "^5.0.0" + array-includes "^3.1.3" + object.assign "^4.1.2" -karma-chai@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" +keycode@^2.1.8: + version "2.2.0" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" + integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= -karma-coverage@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-0.5.0.tgz#378ea0421afd8ac76e15d105df7b45a9d5741dc8" - dependencies: - dateformat "^1.0.6" - istanbul "^0.3.15" - minimatch "^2.0.8" - source-map "^0.4.2" +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== -karma-mocha-reporter@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-1.1.1.tgz#5be9ab16eb82763b30eb41d48800070975c56ab7" +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: - chalk "1.1.0" - karma ">=0.9" - -karma-mocha@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-0.2.0.tgz#198937c2c5f710d9586aa5dfd6ab4ce7a4218751" + is-buffer "^1.1.5" -karma-sinon-chai@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/karma-sinon-chai/-/karma-sinon-chai-1.0.0.tgz#ab0e653b17d8f914c841812a382f2523bf2b047d" +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: - chai "~3.0" - lodash "^2.4.1" - sinon "~1.15" - sinon-chai "~2.8" + is-buffer "^1.1.5" -karma-sinon@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/karma-sinon/-/karma-sinon-1.0.4.tgz#2ede83f294e2f639e767e01e228d467cade0d444" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -karma-sourcemap-loader@0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.5.tgz#d3bb1f901747f1db5e39e27687dbda3d989f6501" +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -karma-webpack@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-1.7.0.tgz#7e5a4fb2ab68b0cc1c7a4fbfa72bb76eeb18cb2a" - dependencies: - async "~0.9.0" - loader-utils "^0.2.5" - lodash "^3.8.0" - source-map "^0.1.41" - webpack-dev-middleware "^1.0.11" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -karma@0.13.9, karma@>=0.9: - version "0.13.9" - resolved "https://registry.yarnpkg.com/karma/-/karma-0.13.9.tgz#1f83fdc60a9dbc35d1766cef09b10f2a7e37eacc" - dependencies: - bluebird "^2.9.27" - body-parser "^1.12.4" - chokidar "^1.0.1" - colors "^1.1.0" - connect "^3.3.5" - core-js "^1.0.1" - di "^0.0.1" - dom-serialize "^2.2.0" - expand-braces "^0.1.1" - glob "^5.0.10" - graceful-fs "^4.1.2" - http-proxy "^1.11.1" - lodash "^3.8.0" - log4js "^0.6.25" - memoizee "^0.3.8" - mime "^1.3.4" - minimatch "^2.0.7" - optimist "^0.6.1" - rimraf "^2.3.3" - socket.io "~1.3.5" - source-map "^0.4.4" - useragent "^2.1.6" +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== -keycode@^2.1.8: - version "2.1.9" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= dependencies: - is-buffer "^1.1.5" + language-subtag-registry "~0.3.2" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== dependencies: - is-buffer "^1.1.5" + lodash "^4.17.5" + webpack-sources "^1.1.0" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" -lcid@^1.0.0: +lead@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= dependencies: - invert-kv "^1.0.0" + flush-write-stream "^1.0.2" -lcov-parse@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.6.tgz#819e5da8bf0791f9d3f39eea5ed1868187f11175" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -leven@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@~0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +linkify-it@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== dependencies: - prelude-ls "~1.1.0" - type-check "~0.3.1" + uc.micro "^1.0.1" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" -loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: - big.js "^3.1.3" + big.js "^5.2.2" emojis-list "^2.0.0" - json5 "^0.5.0" + json5 "^1.0.1" -lodash-es@^4.2.1: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" -lodash._createcompounder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz#5dd2cb55372d6e70e0e2392fb2304d6631091075" +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: - lodash.deburr "^3.0.0" - lodash.words "^3.0.0" + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" -lodash.assign@^4.0.0, lodash.assign@^4.0.4, lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" -lodash.camelcase@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz#932c8b87f8a4377897c67197533282f97aeac298" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - lodash._createcompounder "^3.0.0" + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.clonedeep@^4.3.2: +lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" - -lodash.deburr@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-3.2.0.tgz#6da8f54334a366a7cf4c4c76ef8d80aa1b365ed5" - dependencies: - lodash._root "^3.0.0" - -lodash.endswith@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" - -lodash.find@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.findindex@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.isfinite@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== lodash.ismap@^4.3.0: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.ismap/-/lodash.ismap-4.4.2.tgz#836bf06dee57fd3d2aa357bf6946e61d1e77e279" + integrity sha1-g2vwbe5X/T0qo1e/aUbmHR534nk= lodash.isnumber@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= lodash.isplainobject@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= lodash.isset@^4.3.0: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.isset/-/lodash.isset-4.4.2.tgz#d5eecc56b7a97ab588509e4795b3541b1cdb67bb" + integrity sha1-1e7MVreperWIUJ5HlbNUGxzbZ7s= lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" +lodash.merge@^4.6.0, lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.pickby@^4.0.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lodash@4.17.21, lodash@4.x, "lodash@>=3.5 <5", lodash@^4, lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log4js@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" + integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== + dependencies: + date-format "^2.0.0" + debug "^4.1.1" + flatted "^2.0.0" + rfdc "^1.1.4" + streamroller "^1.0.6" + +loglevel@1.7.1, loglevel@^1.4.0, loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -lodash.words@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-3.2.0.tgz#4e2a8649bc08745b17c695b1a3ce8fee596623b3" - dependencies: - lodash._root "^3.0.0" - -lodash@3.7.x: - version "3.7.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" - -lodash@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - -lodash@^3.10.0, lodash@^3.8.0, lodash@^3.9.3: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - -lodash@^4.17.3: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-driver@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.4.tgz#2d62d7faef45d8a71341961a04b0761eca99cfa3" +long-timeout@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" + integrity sha1-lyHXiLR+C8taJMLivuGg2lXatRQ= -log4js@^0.6.25: - version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - readable-stream "~1.0.2" - semver "~4.3.3" + js-tokens "^3.0.0 || ^4.0.0" -loglevel@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" -lolex@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.1.0.tgz#5dbbbc850395e7523c74b3586f7fbd2626d25b1b" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" -lolex@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: - js-tokens "^3.0.0" + sourcemap-codec "^1.4.4" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + pify "^4.0.1" + semver "^5.6.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -lru-cache@4.1.x, lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + tmpl "1.0.x" -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - dependencies: - es5-ext "~0.10.2" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +match-sorter@^6.0.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" + integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== + dependencies: + "@babel/runtime" "^7.12.5" + remove-accents "0.4.2" -material-ui@^0.17: - version "0.17.4" - resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.17.4.tgz#193999ecb49c3ec15ae0abb4e90fdf9a7bd343e0" +material-ui@0.20.2, material-ui@^0.20.0: + version "0.20.2" + resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.20.2.tgz#5fc9b4b62b691d3b16c89d8e54597a0412b52c7d" + integrity sha512-VeqgQkdvtK193w+FFvXDEwlVxI4rWk83eWbpYLeOIHDPWr3rbB9B075JRnJt/8IsI2X8q5Aia5W3+7m4KkleDg== dependencies: babel-runtime "^6.23.0" - inline-style-prefixer "^3.0.2" + inline-style-prefixer "^3.0.8" keycode "^2.1.8" lodash.merge "^4.6.0" lodash.throttle "^4.1.1" prop-types "^15.5.7" - react-addons-create-fragment "^15.4.0" - react-addons-transition-group "^15.4.0" - react-event-listener "^0.4.5" - recompose "^0.23.0" + react-event-listener "^0.6.2" + react-transition-group "^1.2.1" + recompose "^0.26.0" simple-assign "^0.1.0" warning "^3.0.0" -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +md5.js@1.3.5, md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memoize-weak@^1.0.2: +memoize-weak@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/memoize-weak/-/memoize-weak-1.0.2.tgz#d0015a4c7c6cff2263dbbb49db1dc206ebb94916" + integrity sha1-0AFaTHxs/yJj27tJ2x3CBuu5SRY= -memoizee@^0.3.8: - version "0.3.10" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-weak-map "~0.1.4" - event-emitter "~0.3.4" - lru-queue "0.1" - next-tick "~0.2.2" - timers-ext "0.1" - -memory-fs@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" - -memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" -memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -"mime-db@>= 1.30.0 < 2", mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: - mime-db "~1.30.0" + bn.js "^4.0.0" + brorand "^1.0.1" -mime-types@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +"mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + dependencies: + mime-db "1.49.0" -mime@^1.3.4, mime@^1.5.0: +mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" -mime@~1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" +mini-css-extract-plugin@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" + integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@2.x, minimatch@^2.0.3, minimatch@^2.0.7, minimatch@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: - brace-expansion "^1.0.0" + minipass "^3.0.0" -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: - lru-cache "2" - sigmund "~1.0.0" + minipass "^3.0.0" -minimist@0.0.8, minimist@~0.0.1: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" + integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== + dependencies: + yallist "^4.0.0" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: - minimist "0.0.8" + for-in "^1.0.2" + is-extendable "^1.0.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" -mocha@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.2.5.tgz#d3b72a4fe49ec9439353f1ac893dbc430d993140" - dependencies: - commander "2.3.0" - debug "2.0.0" - diff "1.4.0" - escape-string-regexp "1.0.2" - glob "3.2.3" - growl "1.8.1" - jade "0.26.3" - mkdirp "0.5.0" - supports-color "~1.2.0" - -moment@^2.19.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - -ms@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment-timezone@^0.5.31: + version "0.5.33" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" + integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== + dependencies: + moment ">= 2.9.0" + +moment@2.22.2: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= + +moment@2.29.1, "moment@>= 2.9.0", moment@^2.22.1, moment@^2.24.0, moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" -nan@^2.0.5, nan@^2.3.0, nan@^2.3.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== -nan@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" +nano-memoize@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/nano-memoize/-/nano-memoize-1.2.1.tgz#21091318021c81374a525349a8cd0ad712122077" + integrity sha512-ANfJ0QFhLzv9BZV8tHxwaDClqr+U8yY65hZA+slbgJrx+ePnHtlY92F2ZJInkkQWUUR71NzCEHBshKCHJnNyaQ== + +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + integrity sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8= + dependencies: + big-integer "^1.6.16" + +nanocolors@^0.2.12, nanocolors@^0.2.2, nanocolors@^0.2.8: + version "0.2.12" + resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.2.12.tgz#4d05932e70116078673ea4cc6699a1c56cc77777" + integrity sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug== + +nanoid@^3.1.25: + version "3.1.28" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.28.tgz#3c01bac14cb6c5680569014cc65a2f26424c6bd4" + integrity sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-url@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" + integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== + dependencies: + querystring "^0.2.0" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@1: +next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -next-tick@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: - lower-case "^1.1.1" + lower-case "^2.0.2" + tslib "^2.0.3" node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" -node-gyp@^3.3.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" +node-fetch@^2.6.1: + version "2.6.5" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" + integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - minimatch "^3.0.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "2" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-libs-browser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" + whatwg-url "^5.0.0" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gettext@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-gettext/-/node-gettext-2.1.0.tgz#94d63e9cc0bcabd1e67de0680a44c812721a9023" + integrity sha512-vsHImHl+Py0vB7M2UXcFEJ5NJ3950gcja45YclBFtYxYeZiqdfQdcu+G9s4L7jpRFSh/J/7VoS3upR4JM1nS+g== + dependencies: + lodash.get "^4.4.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.9.0" + browserify-zlib "^0.2.0" + buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" - crypto-browserify "3.3.0" + crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.0.5" + readable-stream "^2.3.3" stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node-sass@^3.7.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.13.1.tgz#7240fbbff2396304b4223527ed3020589c004fc2" - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.3.2" - node-gyp "^3.3.1" - npmlog "^4.0.0" - request "^2.61.0" - sass-graph "^2.1.1" - -node-uuid@~1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - -"nopt@2 || 3", nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" + util "^0.11.0" + vm-browserify "^1.0.1" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-releases@^1.1.61, node-releases@^1.1.76: + version "1.1.76" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e" + integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA== + +node-schedule@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-1.3.3.tgz#f8e01c5fb9597f09ecf9c4c25d6938e5e7a06f48" + integrity sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw== dependencies: - abbrev "1" - osenv "^0.1.4" + cron-parser "^2.18.0" + long-timeout "0.1.1" + sorted-array-functions "^1.3.0" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^1.4.0: +normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" query-string "^4.1.0" sort-keys "^1.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + path-key "^3.0.0" -nth-check@~1.0.1: +nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.3.0.tgz#cb540f93bb2b22a7d5941691a288d60e8ea9386e" - -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" -object-keys@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.1.tgz#55802e85842c26bbb5ebbc157abf3be302569ba8" +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" -object-keys@^1.0.12: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.0.4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + isobject "^3.0.0" -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= +object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" +object.entries@^1.1.0, object.entries@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +object.fromentries@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.hasown@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.0.0.tgz#bdbade33cfacfb25d7f26ae2b6cb870bf99905c2" + integrity sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +oblivious-set@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" + integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +papaparse@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.1.tgz#770b7a9124d821d4b2132132b7bd7dce7194b5b1" + integrity sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" -open@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" + node-modules-regexp "^1.0.0" -optimist@~0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: - wordwrap "~0.0.2" + find-up "^2.1.0" -optionator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: - deep-is "~0.1.2" - fast-levenshtein "~1.0.0" - levn "~0.2.5" - prelude-ls "~1.1.1" - type-check "~0.3.1" - wordwrap "~0.0.2" + find-up "^3.0.0" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" + find-up "^4.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" +pkg-up@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= dependencies: - url-parse "1.0.x" + find-up "^2.1.0" -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: - lcid "^1.0.0" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -osenv@0, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" -output-file-sync@^1.1.0, output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" + postcss "^7" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -papaparse@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.6.0.tgz#4e3b8d6bf9f7900da437912794ec292207526867" - -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: - no-case "^2.2.0" + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== dependencies: - error-ex "^1.2.0" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" -parsejson@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== dependencies: - better-assert "~1.0.0" + postcss "^7.0.14" + postcss-values-parser "^2.0.1" -parseqs@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.2.tgz#9dfe70b2cddac388bde4f35b1f240fa58adbe6c7" +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== dependencies: - better-assert "~1.0.0" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -parseuri@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.2.tgz#db41878f2d6964718be870b3140973d8093be156" +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== dependencies: - better-assert "~1.0.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -parseuri@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.4.tgz#806582a39887e1ea18dd5e2fe0e01902268e9350" +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== dependencies: - better-assert "~1.0.0" - -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" + postcss "^7.0.14" -pbkdf2-compat@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" -phantomjs-polyfill@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/phantomjs-polyfill/-/phantomjs-polyfill-0.0.1.tgz#5e61a5c5621a2656e5374f23909d871ce61c1dd2" +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== dependencies: - pinkie "^2.0.0" + postcss "^7.0.0" -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" -pkg-dir@^1.0.0: +postcss-double-position-gradients@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== dependencies: - find-up "^1.0.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" -pkg-up@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== dependencies: - find-up "^1.0.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +postcss-flexbugs-fixes@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" + postcss "^7.0.2" -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" + postcss "^7.0.2" -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" + postcss "^7.0.2" -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== dependencies: - postcss "^5.0.14" + postcss "^7.0.2" -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== dependencies: - postcss "^5.0.4" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: - postcss "^5.0.14" + postcss "^7.0.2" -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== dependencies: - postcss "^5.0.16" + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== dependencies: - postcss "^5.0.4" - uniqid "^4.0.0" + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" + postcss "^7.0.2" -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== dependencies: - postcss "^5.0.4" + postcss "^7.0.2" -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" vendors "^1.0.0" -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" + postcss "^7.0.5" -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" -postcss-modules-extract-imports@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== dependencies: - postcss "^6.0.1" + icss-utils "^4.0.0" + postcss "^7.0.6" -postcss-modules-local-by-default@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + postcss "^7.0.2" -postcss-modules-scope@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -postcss-modules-values@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== dependencies: - postcss "^5.0.5" + postcss "^7.0.2" -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" + postcss "^7.0.2" -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" + postcss "^7.0.2" -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" +postcss-safe-parser@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" + integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" + postcss "^8.1.0" -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== dependencies: - postcss "^5.0.4" + balanced-match "^1.0.0" + postcss "^7.0.2" -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" + balanced-match "^1.0.0" + postcss "^7.0.2" -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== dependencies: - flatten "^1.0.2" + dot-prop "^5.2.0" indexes-of "^1.0.1" uniq "^1.0.1" -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" + cssesc "^3.0.0" + util-deprecate "^1.0.2" -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== dependencies: - has "^1.0.1" - postcss "^5.0.4" + alphanum-sort "^1.0.0" + postcss "^7.0.0" uniqs "^2.0.0" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" -postcss@^6.0.1: - version "6.0.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.17.tgz#e259a051ca513f81e9afd0c21f7f82eda50c65c5" +postcss@7.0.36: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== dependencies: - chalk "^2.3.0" + chalk "^2.4.2" source-map "^0.6.1" - supports-color "^5.1.0" + supports-color "^6.1.0" -precommit-hook@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/precommit-hook/-/precommit-hook-3.0.0.tgz#6136c45185ff964371673f6b63e9e485549db1d7" +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.38.tgz#5365a9c5126643d977046ad239f60eadda2491d6" + integrity sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ== dependencies: - git-validate "^2.0.0" - jshint "*" + nanocolors "^0.2.2" + source-map "^0.6.1" + +postcss@^8.1.0: + version "8.3.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.8.tgz#9ebe2a127396b4b4570ae9f7770e7fb83db2bac1" + integrity sha512-GT5bTjjZnwDifajzczOC+r3FI3Cu+PgPvrsjhQdRqa2kTJ4968/X9CUce9xttIB0xOs5c6xf0TCWZo/y9lF6bA== + dependencies: + nanocolors "^0.2.2" + nanoid "^3.1.25" + source-map-js "^0.6.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: +prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +prettier@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: - renderkid "^2.0.1" - utila "~0.4" + lodash "^4.17.20" + renderkid "^2.0.4" -private@^0.1.6, private@^0.1.7, private@~0.1.5: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" +pretty-format@^26.6.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.2.4: + version "27.2.4" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.2.4.tgz#08ea39c5eab41b082852d7093059a091f6ddc748" + integrity sha512-NUjw22WJHldzxyps2YjLZkUj6q1HvjqFezkB9Y2cklN8NtVZN/kZEXGZdFw4uny3oENzV5EEMESrkI0YDUH8vg== + dependencies: + "@jest/types" "^27.2.4" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.0: +process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise@^7.0.3, promise@^7.1.1: +promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7: - version "15.6.0" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" +promise@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" + asap "~2.0.6" -prop-types@^15.5.8, prop-types@^15.6.1: - version "15.6.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" +prompts@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== dependencies: - loose-envify "^1.3.1" + kleur "^3.0.3" + sisteransi "^1.0.5" + +prompts@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" object-assign "^4.1.1" + react-is "^16.8.1" -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" - ipaddr.js "1.5.2" + forwarded "0.2.0" + ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +purify-ts-extra-codec@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/purify-ts-extra-codec/-/purify-ts-extra-codec-0.6.0.tgz#4d06756cbf4d9def5a44bb192f18178726400547" + integrity sha512-wEIIhBJ9+OfTsGEXPq2SA96NbdRPWNTtjbZB4HSy8VNlfF7cxeDrQ3UBpNGSXTI8AskY4IcUtCgX/V5SwJzKkw== + dependencies: + date-fns "^2.14.0" + warning "^4.0.3" + +purify-ts@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/purify-ts/-/purify-ts-1.0.0.tgz#5a9425ea7c0a17d428c5eec7bf8f8fc4f181ed7f" + integrity sha512-jqU2xu3K1luBzfw/t/7QHy4dqp0oiui7KMkBNRVqGk6BVf6stUo4agagKGlk436vQwmMQh0zJvxeAstXmlXvIw== + dependencies: + "@types/json-schema" "7.0.8" q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.5.1, qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-1.0.2.tgz#50a93e2b5af6691c31bcea5dae78ee6ea1903768" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -query-string@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638" +qs@6.10.1, qs@^6.9.0: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== dependencies: - strict-uri-encode "^1.0.0" + side-channel "^1.0.4" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= dependencies: object-assign "^4.1.0" strict-uri-encode "^1.0.0" @@ -5377,145 +11910,302 @@ query-string@^4.1.0: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -range-parser@^1.0.3, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" + performance-now "^2.1.0" -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + safe-buffer "^5.1.0" -react-addons-create-fragment@^15.4.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8" +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: - fbjs "^0.8.4" - loose-envify "^1.3.1" - object-assign "^4.1.0" + randombytes "^2.0.5" + safe-buffer "^5.1.0" -react-addons-transition-group@^15.4.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-addons-transition-group/-/react-addons-transition-group-15.6.2.tgz#8baebc2ae91ccdbf245fe29c9fd3d36f8b471923" +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== dependencies: - react-transition-group "^1.2.0" + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" -react-animate-height@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-2.0.4.tgz#34d60949e915ce445bf43e3046dc4b8435e21ed6" +react-animate-height@2.0.23: + version "2.0.23" + resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-2.0.23.tgz#2e14ac707b20ae67b87766ccfd581e693e0e7ec7" + integrity sha512-DucSC/1QuxWEFzR9IsHMzrf2nrcZ6qAmLIFoENa2kLK7h72XybcMA9o073z7aHccFzdMEW0/fhAdnQG7a4rDow== dependencies: classnames "^2.2.5" prop-types "^15.6.1" - optionalDependencies: - "@types/react" ">=16" -react-copy-to-clipboard@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz#8eae107bb400be73132ed3b6a7b4fb156090208e" +react-app-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" + integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== + dependencies: + core-js "^3.6.5" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + whatwg-fetch "^3.4.1" + +react-copy-to-clipboard@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#42ec519b03eb9413b118af92d1780c403a5f19bf" + integrity sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ== dependencies: copy-to-clipboard "^3" prop-types "^15.5.8" -react-dnd-html5-backend@^2.1.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-2.5.4.tgz#974ad083f67b12d56977a5b171f5ffeb29d78352" +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== + dependencies: + "@babel/code-frame" "7.10.4" + address "1.1.2" + browserslist "4.14.2" + chalk "2.4.2" + cross-spawn "7.0.3" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.1.0" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "4.1.6" + global-modules "2.0.0" + globby "11.0.1" + gzip-size "5.1.1" + immer "8.0.1" + is-root "2.1.0" + loader-utils "2.0.0" + open "^7.0.2" + pkg-up "3.1.0" + prompts "2.4.0" + react-error-overlay "^6.0.9" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: - lodash "^4.2.0" + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" -react-dnd@^2.1.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-2.5.4.tgz#0b6dc5e9d0dfc2909f4f4fe736e5534f3afd1bd9" +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-event-listener@^0.6.2: + version "0.6.6" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" + integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== dependencies: - disposables "^1.0.1" - dnd-core "^2.5.4" - hoist-non-react-statics "^2.1.0" - invariant "^2.1.0" - lodash "^4.2.0" - prop-types "^15.5.10" + "@babel/runtime" "^7.2.0" + prop-types "^15.6.0" + warning "^4.0.1" + +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-dom@15.4.2: - version "15.4.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d90695208f" +react-final-form@^6.5.3: + version "6.5.7" + resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.5.7.tgz#0c1098accf0f0011adee5a46076ed1b99ed1b1ea" + integrity sha512-o7tvJXB+McGiXOILqIC8lnOcX4aLhIBiF/Xi9Qet35b7XOS8R7KL8HLRKTfnZWQJm6MCE15v1U0SFive0NcxyA== dependencies: - fbjs "^0.8.1" - loose-envify "^1.1.0" - object-assign "^4.1.0" + "@babel/runtime" "^7.15.4" -react-dom@^0.14.0: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293" +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-event-listener@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.4.5.tgz#e3e895a0970cf14ee8f890113af68197abf3d0b1" +"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-linkify@1.0.0-alpha: + version "1.0.0-alpha" + resolved "https://registry.yarnpkg.com/react-linkify/-/react-linkify-1.0.0-alpha.tgz#b391c7b88e3443752fafe76a95ca4434e82e70d5" + integrity sha512-7gcIUvJkAXXttt1fmBK9cwn+1jTa4hbKLGCZ9J1U6EOkyb2/+LKL1Z28d9rtDLMnpvImlNlLPdTPooorl5cpmg== dependencies: - babel-runtime "^6.20.0" - fbjs "^0.8.4" - prop-types "^15.5.4" - warning "^3.0.0" + linkify-it "^2.0.3" + tlds "^1.199.0" -react-moment@^0.6.5: - version "0.6.9" - resolved "https://registry.yarnpkg.com/react-moment/-/react-moment-0.6.9.tgz#f13a0ccedaf65b5fb8b1467d9f91c5346d74c3e2" +react-moment@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/react-moment/-/react-moment-1.1.1.tgz#5fe9fb257039590c804e2b3aedfc3ceb0a6ffb16" + integrity sha512-WjwvxBSnmLMRcU33do0KixDB+9vP3e84eCse+rd+HNklAMNWyRgZTDEQlay/qK6lcXFPRuEIASJTpEt6pyK7Ww== -react-router@^2.5.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-2.8.1.tgz#73e9491f6ceb316d0f779829081863e378ee4ed7" +react-popper@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" + integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== dependencies: - history "^2.1.2" - hoist-non-react-statics "^1.2.0" - invariant "^2.2.1" - loose-envify "^1.2.0" - warning "^3.0.0" + react-fast-compare "^3.0.1" + warning "^4.0.2" -react-style-proptype@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.2.1.tgz#7cfeb9b87ec7ab9dcbde9715170ed10c11fb86aa" +react-query@^3.13.11: + version "3.24.5" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.24.5.tgz#d3128a86fa5830a9b70a550085c18df3d18bc470" + integrity sha512-1kWRBWOi9Nv2qbpu9OgycyWVd1K6lIdxF9FJy8lmhB224OsrT4kr6sKhF6u1gnE4KsbdtMdZU97e+64tKZtZmA== dependencies: - prop-types "^15.5.4" + "@babel/runtime" "^7.5.5" + broadcast-channel "^3.4.1" + match-sorter "^6.0.2" -react-tap-event-plugin@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz#316beb3bc6556e29ec869a7293e89c826a9074d2" +react-refresh@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-router-dom@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== dependencies: - fbjs "^0.8.6" + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" + integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== + dependencies: + "@babel/core" "7.12.3" + "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" + "@svgr/webpack" "5.5.0" + "@typescript-eslint/eslint-plugin" "^4.5.0" + "@typescript-eslint/parser" "^4.5.0" + babel-eslint "^10.1.0" + babel-jest "^26.6.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.7" + babel-preset-react-app "^10.0.0" + bfj "^7.0.2" + camelcase "^6.1.0" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "4.3.0" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^7.11.0" + eslint-config-react-app "^6.0.0" + eslint-plugin-flowtype "^5.2.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-jest "^24.1.0" + eslint-plugin-jsx-a11y "^6.3.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.2.0" + eslint-plugin-testing-library "^3.9.2" + eslint-webpack-plugin "^2.5.2" + file-loader "6.1.1" + fs-extra "^9.0.1" + html-webpack-plugin "4.5.0" + identity-obj-proxy "3.0.0" + jest "26.6.0" + jest-circus "26.6.0" + jest-resolve "26.6.0" + jest-watch-typeahead "0.6.1" + mini-css-extract-plugin "0.11.3" + optimize-css-assets-webpack-plugin "5.0.4" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.2.1" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "5.0.2" + prompts "2.4.0" + react-app-polyfill "^2.0.0" + react-dev-utils "^11.0.3" + react-refresh "^0.8.3" + resolve "1.18.1" + resolve-url-loader "^3.1.2" + sass-loader "^10.0.5" + semver "7.3.2" + style-loader "1.3.0" + terser-webpack-plugin "4.2.3" + ts-pnp "1.2.0" + url-loader "4.1.1" + webpack "4.44.2" + webpack-dev-server "3.11.1" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "5.1.4" + optionalDependencies: + fsevents "^2.1.3" -react-transition-group@^1.2.0: +react-transition-group@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" + integrity sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q== dependencies: chain-function "^1.0.0" dom-helpers "^3.2.0" @@ -5523,497 +12213,714 @@ react-transition-group@^1.2.0: prop-types "^15.5.6" warning "^3.0.0" -react@15.4.2: - version "15.4.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef" +react-transition-group@^4.0.0, react-transition-group@^4.4.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: - fbjs "^0.8.4" loose-envify "^1.1.0" - object-assign "^4.1.0" + object-assign "^4.1.1" + +react@^16.12.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" -react@^0.14.0: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: - envify "^3.0.0" - fbjs "^0.6.1" + find-up "^2.0.0" + read-pkg "^3.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: - load-json-file "^1.0.0" + load-json-file "^4.0.0" normalize-package-data "^2.3.2" - path-type "^1.0.0" + path-type "^3.0.0" -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" - string_decoder "~1.0.3" + string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== +"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.2: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -readline-sync@^1.4.1: - version "1.4.8" - resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.8.tgz#2e3b296fa64a35b2b011a754e46a235d46985de8" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" -recast@0.10.33, recast@^0.10.10: - version "0.10.33" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" - dependencies: - ast-types "0.8.12" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.11.17: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" + picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" +readline-sync@^1.4.1: + version "1.4.10" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" + integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== -recompose@^0.23.0: - version "0.23.5" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.23.5.tgz#72ac8261246bec378235d187467d02a721e8b1de" +recompose@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" + integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== dependencies: change-emitter "^0.1.2" fbjs "^0.8.1" - hoist-non-react-statics "^1.0.0" + hoist-non-react-statics "^2.3.1" symbol-observable "^1.0.4" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" + minimatch "3.0.4" -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - balanced-match "^0.4.2" + indent-string "^4.0.0" + strip-indent "^3.0.0" -redux@^3.7.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: - lodash "^4.2.1" - lodash-es "^4.2.1" - loose-envify "^1.1.0" - symbol-observable "^1.0.3" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + regenerate "^1.4.2" -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regenerator@0.8.40: - version "0.8.40" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" - dependencies: - commoner "~0.10.3" - defs "~1.1.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - recast "0.10.33" - through "~2.3.8" +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: - is-equal-shallow "^0.1.3" + "@babel/runtime" "^7.8.4" -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + extend-shallow "^3.0.2" + safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexpu@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: - esprima "^2.6.0" - recast "^0.10.10" - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + call-bind "^1.0.2" + define-properties "^1.1.3" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" -relateurl@0.2.x: +relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +remove-accents@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" + integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: - css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.5.2: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^1.1.0, repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request@2, request@^2.61.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@2.40.0: - version "2.40.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz#4dd670f696f1e6e842e66b4b5e839301ab9beb67" - dependencies: - forever-agent "~0.5.0" - json-stringify-safe "~5.0.0" - mime-types "~1.0.1" - node-uuid "~1.4.0" - qs "~1.0.0" - optionalDependencies: - aws-sign2 "~0.5.0" - form-data "~0.1.0" - hawk "1.1.1" - http-signature "~0.10.0" - oauth-sign "~0.3.0" - stringstream "~0.0.4" - tough-cookie ">=0.12.0" - tunnel-agent "~0.4.0" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@^3.1.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" + integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.36" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= -resolve-from@^1.0.0: +rework@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" -resolve@1.1.x, resolve@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -restore-cursor@^1.0.1: +rgb-regex@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rifm@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rifm/-/rifm-0.7.0.tgz#debe951a9c83549ca6b33e5919f716044c2230be" + integrity sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ== dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + "@babel/runtime" "^7.3.1" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - align-text "^0.1.1" + glob "^7.1.3" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: - glob "^7.0.5" + glob "^7.1.3" -ripemd160@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" +rollup-plugin-babel@^4.3.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== dependencies: - once "^1.3.0" + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rollup-plugin-terser@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== + dependencies: + "@babel/code-frame" "^7.5.5" + jest-worker "^24.9.0" + rollup-pluginutils "^2.8.2" + serialize-javascript "^4.0.0" + terser "^4.6.2" -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" -rxjs@^5.2.0: - version "5.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" +rollup@^1.31.1: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== dependencies: - symbol-observable "1.0.1" + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" -samsam@1.1.2, samsam@~1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" -sass-graph@^2.1.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs-compat@6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.6.3.tgz#141405fcee11f48718d428b99c8f01826f594e5c" + integrity sha512-y+wUqq7bS2dG+7rH2fNMoxsDiJ32RQzFxZQE/JdtpnmEZmwLQrb1tCiItyHxdXJHXjmHnnzFscn3b6PEmORGKw== + +rxjs@6.6.7: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" + tslib "^1.9.0" -sass-loader@^3.2.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-3.2.3.tgz#742e81fd8170a8771a979e18622501674a88e355" +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: - async "^1.4.0" - loader-utils "^0.2.5" - object-assign "^4.0.1" + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanctuary-show@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sanctuary-show/-/sanctuary-show-2.0.0.tgz#2326b4744f4b0f993f18ca56a29f68a50f514637" + integrity sha512-REj4ZiioUXnDLj6EpJ9HcYDIEGaEexmB9Fg5o6InZR9f0x5PfnnC21QeU9SZ9E7G8zXSZPNjy8VRUK4safbesw== + +sanctuary-type-identifiers@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sanctuary-type-identifiers/-/sanctuary-type-identifiers-3.0.0.tgz#51cb488d2ed9f194946a64ffe2b41dd49a348c0b" + integrity sha512-YFXYcG0Ura1dSPd/1xLYtE2XAWUEsBHhMTZvYBOvwT8MeFQwdUOCMm2DC+r94z6H93FVq0qxDac8/D7QpJj6Mg== -sax@~1.2.1: +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@^10.0.5: + version "10.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + integrity sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" +schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" -semver@~4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" -serve-index@^1.7.2: +serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6023,751 +12930,1333 @@ serve-index@^1.7.2: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.1" + parseurl "~1.3.3" + send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" -setprototypeof@1.1.0: +shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -sha.js@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== simple-assign@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/simple-assign/-/simple-assign-0.1.0.tgz#17fd3066a5f3d7738f50321bb0f14ca281cc4baa" + integrity sha1-F/0wZqXz13OPUDIbsPFMooHMS6o= -simple-fmt@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - -sinon-chai@2.8.0, sinon-chai@~2.8: - version "2.8.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.8.0.tgz#432a9bbfd51a6fc00798f4d2526a829c060687ac" - -sinon@^1.17.4: - version "1.17.7" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" - dependencies: - formatio "1.1.1" - lolex "1.3.2" - samsam "1.1.2" - util ">=0.10.3 <1" - -sinon@~1.15: - version "1.15.4" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.15.4.tgz#0315f174ce5b31792aea2e3a2afc5bb7804c7a6a" - dependencies: - formatio "1.1.1" - lolex "1.1.0" - samsam "1.1.2" - util ">=0.10.3 <1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -sntp@0.2.x: - version "0.2.4" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: - hoek "0.9.x" + is-arrayish "^0.3.1" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -socket.io-adapter@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.3.1.tgz#df81f970b4df6493902d93e519c7b72755c3a958" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - debug "1.0.2" - object-keys "1.0.1" - socket.io-parser "2.2.2" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -socket.io-client@1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.3.7.tgz#7ab7c069b8d50425eb265f031f84a97e6ebe719c" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.1.2" - debug "0.7.4" - engine.io-client "1.5.4" - has-binary "0.1.6" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.2" - socket.io-parser "2.2.4" - to-array "0.1.3" - -socket.io-parser@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.2.tgz#3d7af6b64497e956b7d9fe775f999716027f9417" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: - benchmark "1.0.0" - component-emitter "1.1.2" - debug "0.7.4" - isarray "0.0.1" - json3 "3.2.6" + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" -socket.io-parser@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.4.tgz#f9ce19bf1909608ceb15d97721e23bfdd1e7cf65" +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: - benchmark "1.0.0" - component-emitter "1.1.2" - debug "0.7.4" - isarray "0.0.1" - json3 "3.2.6" + kind-of "^3.2.0" -socket.io@~1.3.5: - version "1.3.7" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.3.7.tgz#93747a29bcab6266f0fbe19112cca5e1388cf7ad" +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: - debug "2.1.0" - engine.io "1.5.4" - has-binary-data "0.1.3" - socket.io-adapter "0.3.1" - socket.io-client "1.3.7" - socket.io-parser "2.2.4" + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" -sockjs-client@^1.0.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ== dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.1.8" + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" -sockjs@^0.3.15: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= dependencies: is-plain-obj "^1.0.0" -source-list-map@^0.1.4, source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" +sorted-array-functions@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" + integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== -source-map-support@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" +sortobject@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sortobject/-/sortobject-1.3.0.tgz#bc8ce57014c567bdbf78e89ae6c484e64d51e9dc" + integrity sha512-rr0RrgE3ZoWaREnHiidnywzXLaeqmxDKfB4Htdbzu4WBzsVeZEJrhz7AR4ZF+gzHgbog/lQoNXxCWHaXeLc1Dg== dependencies: - source-map "0.1.32" + editions "^2.2.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - amdefine ">=0.0.4" + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" -source-map@^0.1.40, source-map@^0.1.41, source-map@~0.1.40, source-map@~0.1.7: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: - amdefine ">=0.0.4" + atob "^2.1.2" + decode-uri-component "^0.2.0" -source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" +source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: - amdefine ">=0.0.4" + buffer-from "^1.0.0" + source-map "^0.6.0" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" + figgy-pudding "^3.5.1" -stable@~0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.2, stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" -stream-cache@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" -stream-http@^2.3.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.3.3" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +streamroller@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" + integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== + dependencies: + async "^2.6.2" + date-format "^2.0.0" + debug "^3.2.6" + fs-extra "^7.0.1" + lodash "^4.17.14" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: + emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string.fromcodepoint@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz#8d978333c0bc92538f50f383e4888f3e5619d653" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" + integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" -string_decoder@^1.1.1: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringmap@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" - -stringset@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" -stringstream@~0.0.4, stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +strip-ansi@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^3.0.0" + ansi-regex "^4.1.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -style-loader@^0.13.1: - version "0.13.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== dependencies: - loader-utils "^1.0.2" + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" -supports-color@1.3.x: - version "1.3.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.3.1.tgz#15758df09d8ff3b4acc307539fabe27095e1042d" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -supports-color@^2.0.0: +strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: - has-flag "^1.0.0" + min-indent "^1.0.0" -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== dependencies: - has-flag "^2.0.0" + loader-utils "^2.0.0" + schema-utils "^2.7.0" -supports-color@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" +styled-components@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.1.tgz#8a86dcd31bff7049c2ed408bae36fa23f03f071a" + integrity sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +styled-jsx@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-4.0.1.tgz#ae3f716eacc0792f7050389de88add6d5245b9e9" + integrity sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ== + dependencies: + "@babel/plugin-syntax-jsx" "7.14.5" + "@babel/types" "7.15.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: - has-flag "^2.0.0" + has-flag "^4.0.0" + supports-color "^7.0.0" -supports-color@~1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.1.tgz#12ee21507086cd98c1058d9ec0f4ac476b7af3b2" +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" -symbol-observable@^1.0.3, symbol-observable@^1.0.4: +symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.0.9: + version "6.7.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +tar@^6.0.2: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= -tapable@^0.1.8, tapable@~0.1.8: - version "0.1.10" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" +tempy@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.0.0, tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" -text-table@~0.2.0: +terser@^5.3.4: + version "5.9.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6, through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -time-stamp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -timers-browserify@^2.0.2: - version "2.0.6" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" +throttle-debounce@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" + integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== dependencies: - setimmediate "^1.0.4" + through2 "~2.0.0" + xtend "~4.0.0" -timers-ext@0.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.2.tgz#61cc47a76c1abd3195f14527f978d58ae94c5204" +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - es5-ext "~0.10.14" - next-tick "1" + readable-stream "~2.3.6" + xtend "~4.0.1" -tmp@0.0.x: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" +through2@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: - os-tmpdir "~1.0.2" + inherits "^2.0.4" + readable-stream "2 || 3" -to-array@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.3.tgz#d45dadc6363417f60f28474fea50ecddbb4f4991" +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tlds@^1.199.0: + version "1.222.0" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.222.0.tgz#b3cbf4f8dfe15af2b82d40361e7e552649e3aad2" + integrity sha512-jC8RCcx2Z0tfXLQGo2gdrzOCv5B7Shd2SRd9Yctl+cFuy9XZ+25T+ugOVhKUSrCYCKv4fjo93fAreDFhLVklAA== + +tmpl@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" -toggle-selection@^1.0.3: +toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= -toposort@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" - integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@>=0.12.0, tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== dependencies: - punycode "^1.4.1" + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-jest@27.0.5: + version "27.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.5.tgz#0b0604e2271167ec43c12a69770f0bb65ad1b750" + integrity sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-node@10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" + integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== + dependencies: + "@cspotcode/source-map-support" "0.6.1" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + +ts-pnp@1.2.0, ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +tsconfig-paths@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" -trim-right@^1.0.0, trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -try-resolve@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tryor@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" +tsutils@^3.17.1, tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - safe-buffer "^5.0.1" - -tunnel-agent@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + prelude-ls "^1.2.1" -type-check@~0.3.1, type-check@~0.3.2: +type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" - mime-types "~2.1.15" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -ua-parser-js@^0.7.9: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" +typescript@4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== -uglify-js@3.4.x: - version "3.4.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" - integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== - dependencies: - commander "~2.19.0" - source-map "~0.6.1" +ua-parser-js@^0.7.18: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== -uglify-js@~2.3: - version "2.3.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a" - dependencies: - async "~0.2.6" - optimist "~0.3.5" - source-map "~0.1.7" +uc.micro@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +uglify-js@^3.1.4: + version "3.14.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" + integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== -uglify-js@~2.7.3: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -underscore.string@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -underscore@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -unescape-js@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unescape-js/-/unescape-js-1.1.0.tgz#38f93ec9419a84b5fbcf5b0450accffed286c18a" +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: - string.fromcodepoint "^0.2.1" + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" - dependencies: - macaddress "^0.2.8" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unload@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -url-loader@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1" - dependencies: - loader-utils "^1.1.0" - mime "^2.0.3" - schema-utils "^1.0.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" +url-loader@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: - querystringify "0.0.x" - requires-port "1.0.x" + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" -url-parse@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" +url-parse@^1.4.3, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: - querystringify "~1.0.0" - requires-port "~1.0.0" + querystringify "^2.1.1" + requires-port "^1.0.0" url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -useragent@^2.1.6: - version "2.3.0" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" - dependencies: - lru-cache "4.1.x" - tmp "0.0.x" - -utf-8-validate@1.2.x: - version "1.2.2" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-1.2.2.tgz#8bb871a4741e085c70487ca7acdbd7d6d36029eb" - dependencies: - bindings "~1.2.1" - nan "~2.4.0" - -utf8@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@1.0.0: version "1.0.0" @@ -6777,13 +14266,31 @@ util.promisify@1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util@0.10.3, "util@>=0.10.3 <1", util@^0.10.3: +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -utila@^0.4.0, utila@~0.4: +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= @@ -6791,280 +14298,790 @@ utila@^0.4.0, utila@~0.4: utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== dependencies: - user-home "^1.1.1" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +v8-to-istanbul@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" +vinyl-fs@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" +vinyl@^2.0.0, vinyl@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== dependencies: - indexof "0.0.1" + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -warning@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-2.1.0.tgz#21220d9c63afc77a8c92111e011af705ce0c6901" +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - loose-envify "^1.0.0" + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" -watchpack@^0.2.1: - version "0.2.9" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: - async "^0.9.0" - chokidar "^1.0.0" graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" -webpack-core@~0.6.9: - version "0.6.9" - resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: - source-list-map "~0.1.7" - source-map "~0.4.1" + minimalistic-assert "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.10.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: - memory-fs "~0.4.1" - mime "^1.5.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - time-stamp "^2.0.0" - -webpack-dev-server@^1.14.1: - version "1.16.5" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz#0cbd5f2d2ac8d4e593aacd5c9702e7bbd5e59892" - dependencies: - compression "^1.5.2" - connect-history-api-fallback "^1.3.0" - express "^4.13.3" - http-proxy-middleware "~0.17.1" - open "0.0.5" - optimist "~0.6.1" - serve-index "^1.7.2" - sockjs "^0.3.15" - sockjs-client "^1.0.3" - stream-cache "~0.0.1" - strip-ansi "^3.0.0" - supports-color "^3.1.1" - webpack-dev-middleware "^1.10.2" - -webpack-visualizer-plugin@^0.1.5: - version "0.1.11" - resolved "https://registry.yarnpkg.com/webpack-visualizer-plugin/-/webpack-visualizer-plugin-0.1.11.tgz#b8770ad86b4f652612c68b1b782253faf9f8a34e" - dependencies: - d3 "^3.5.6" + memory-fs "^0.4.1" + mime "^2.4.4" mkdirp "^0.5.1" - react "^0.14.0" - react-dom "^0.14.0" - -webpack@^1.13.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.15.0.tgz#4ff31f53db03339e55164a9d468ee0324968fe98" - dependencies: - acorn "^3.0.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "~0.9.0" - interpret "^0.6.4" - loader-utils "^0.2.11" - memory-fs "~0.3.0" - mkdirp "~0.5.0" - node-libs-browser "^0.7.0" - optimist "~0.6.0" - supports-color "^3.1.0" - tapable "~0.1.8" - uglify-js "~2.7.3" - watchpack "^0.2.1" - webpack-core "~0.6.9" - -websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" + integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== dependencies: - http-parser-js ">=0.4.0" + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpack@^4.41.0: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" -whatwg-fetch@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" +whatwg-fetch@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -which@1, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: - isexe "^2.0.0" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" -which@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - string-width "^1.0.2" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" -wordwrap@0.0.x, wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~1.0.0: +wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +workbox-background-sync@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== + dependencies: + workbox-core "^5.1.4" + +workbox-broadcast-update@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== + dependencies: + workbox-core "^5.1.4" + +workbox-build@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== + dependencies: + "@babel/core" "^7.8.4" + "@babel/preset-env" "^7.8.4" + "@babel/runtime" "^7.8.4" + "@hapi/joi" "^15.1.0" + "@rollup/plugin-node-resolve" "^7.1.1" + "@rollup/plugin-replace" "^2.3.1" + "@surma/rollup-plugin-off-main-thread" "^1.1.1" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^8.1.0" + glob "^7.1.6" + lodash.template "^4.5.0" + pretty-bytes "^5.3.0" + rollup "^1.31.1" + rollup-plugin-babel "^4.3.3" + rollup-plugin-terser "^5.3.1" + source-map "^0.7.3" + source-map-url "^0.4.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + tempy "^0.3.0" + upath "^1.2.0" + workbox-background-sync "^5.1.4" + workbox-broadcast-update "^5.1.4" + workbox-cacheable-response "^5.1.4" + workbox-core "^5.1.4" + workbox-expiration "^5.1.4" + workbox-google-analytics "^5.1.4" + workbox-navigation-preload "^5.1.4" + workbox-precaching "^5.1.4" + workbox-range-requests "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + workbox-streams "^5.1.4" + workbox-sw "^5.1.4" + workbox-window "^5.1.4" + +workbox-cacheable-response@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== + dependencies: + workbox-core "^5.1.4" + +workbox-core@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== + +workbox-expiration@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== + dependencies: + workbox-core "^5.1.4" + +workbox-google-analytics@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== + dependencies: + workbox-background-sync "^5.1.4" + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + +workbox-navigation-preload@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== + dependencies: + workbox-core "^5.1.4" + +workbox-precaching@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== + dependencies: + workbox-core "^5.1.4" + +workbox-range-requests@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== + dependencies: + workbox-core "^5.1.4" + +workbox-routing@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== + dependencies: + workbox-core "^5.1.4" + +workbox-strategies@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-streams@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-sw@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== + +workbox-webpack-plugin@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== + dependencies: + "@babel/runtime" "^7.5.5" + fast-json-stable-stringify "^2.0.0" + source-map-url "^0.4.0" + upath "^1.1.2" + webpack-sources "^1.3.0" + workbox-build "^5.1.4" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" +workbox-window@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" + integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + workbox-core "^5.1.4" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - mkdirp "^0.5.1" + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -ws@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-0.8.0.tgz#ac60ebad312121d01e16cc3383d7ec67ad0f0f1f" +ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: - options ">=0.0.5" - ultron "1.0.x" - optionalDependencies: - bufferutil "1.2.x" - utf-8-validate "1.2.x" + async-limiter "~1.0.0" -"xmlhttprequest@https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz": - version "1.5.0" - resolved "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz#20cafa5caa55f6db6bfaee849d1eb60ee43a5fca" +ws@^7.4.6: + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - dependencies: - camelcase "^3.0.0" +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^14.0.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yargs@~3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" - dependencies: - camelcase "^1.2.1" - cliui "^2.1.0" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 523d59246a683df5426a9746d31aee34ca3c668d Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 30 Sep 2021 22:57:02 +0200 Subject: [PATCH 002/192] Move advanced filters to dialog --- .travis.yml | 41 -------- package.json | 1 - src/legacy/List/Filters.component.js | 148 ++++++++++++++------------- yarn.lock | 12 +-- 4 files changed, 77 insertions(+), 125 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3a97d81..0000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: node_js -node_js: - - 12.13.0 -dist: bionic -cache: - directories: - - "$HOME/.cache" -before_install: - - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - # Install python dependencies - - sudo apt-get update - - sudo apt-get install python3 python python3-setuptools docker.io docker-compose - # Install d2-docker - - git clone https://github.com/EyeSeeTea/d2-docker.git - - cd d2-docker/ - - sudo python3 setup.py install - - d2-docker --help - # Hack to not be prompted in the terminal - - sudo apt-get remove golang-docker-credential-helpers - # Start docker service - - sudo systemctl unmask docker.service - - sudo systemctl unmask docker.socket - - sudo systemctl start docker.service - # Login to docker - - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - # Start docker service - - d2-docker start eyeseetea/dhis2-data:2.30-sierra-leone -d --port 8080 -install: - - yarn install --frozen-lockfile - - yarn cy:verify - - yarn build -script: - - PORT=8081 REACT_APP_DHIS2_BASE_URL=http://localhost:8080 REACT_APP_CYPRESS=true yarn start & - - yarn wait-on http-get://localhost:8081 - - yarn wait-on http-get://localhost:8080 - - CYPRESS_EXTERNAL_API=http://localhost:8080 CYPRESS_ROOT_URL=http://localhost:8081 yarn cy:e2e:run --record --key $CYPRESS_KEY - - kill $(jobs -p) || true -addons: - apt: - packages: - - libgconf-2-4 diff --git a/package.json b/package.json index 5f144d6..5142941 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "purify-ts-extra-codec": "0.6.0", "qs": "6.10.1", "react": "17.0.2", - "react-animate-height": "2.0.23", "react-copy-to-clipboard": "5.0.4", "react-dom": "17.0.2", "react-moment": "1.1.1", diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 06b7efb..b78aae2 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -1,13 +1,12 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import Checkbox from "material-ui/Checkbox/Checkbox"; import IconButton from "material-ui/IconButton"; -import Paper from "material-ui/Paper/Paper"; import ClearIcon from "material-ui/svg-icons/content/clear"; import FilterListIcon from "material-ui/svg-icons/content/filter-list"; import memoize from "memoize-weak"; import PropTypes from "prop-types"; import React from "react"; -import AnimateHeight from "react-animate-height"; import MultipleFilter from "../components/MultipleFilter.component"; import OrgUnitsFilter from "../components/OrgUnitsFilter.component"; import listActions from "./list.actions"; @@ -101,8 +100,12 @@ export default class Filters extends React.Component { ); }; - toggleExtendedFilters = () => { - this.setState({ showExtendedFilters: !this.state.showExtendedFilters }); + openFilters = () => { + this.setState({ showExtendedFilters: true }); + }; + + closeFilters = () => { + this.setState({ showExtendedFilters: false }); }; searchListByName = searchObserver => { @@ -192,7 +195,7 @@ export default class Filters extends React.Component {
@@ -200,81 +203,80 @@ export default class Filters extends React.Component {
- - -
-
+ + + + + {isFiltering && ( + + + + )} +
+ +
+
+ +
- + - - {isFiltering && ( - - - - )}
- -
-
- -
- -
- -
+
+ +
+
+
-
-
- -
- -
- -
+
+
- - +
); }; diff --git a/yarn.lock b/yarn.lock index 4e54c08..fcd2d9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4790,7 +4790,7 @@ classnames@2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== -classnames@2.3.1, classnames@^2.2.5, classnames@^2.3.1: +classnames@2.3.1, classnames@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== @@ -11788,7 +11788,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -11969,14 +11969,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -react-animate-height@2.0.23: - version "2.0.23" - resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-2.0.23.tgz#2e14ac707b20ae67b87766ccfd581e693e0e7ec7" - integrity sha512-DucSC/1QuxWEFzR9IsHMzrf2nrcZ6qAmLIFoENa2kLK7h72XybcMA9o073z7aHccFzdMEW0/fhAdnQG7a4rDow== - dependencies: - classnames "^2.2.5" - prop-types "^15.6.1" - react-app-polyfill@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" From d7f54f7ed73e75017f76305439caf996d9039169 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 30 Sep 2021 23:17:08 +0200 Subject: [PATCH 003/192] Update org unit dialog --- .../OrgUnitDialog.component.js | 46 ++++--------------- src/legacy/components/OrgUnitForm.js | 4 +- 2 files changed, 10 insertions(+), 40 deletions(-) diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index c857778..ff90a84 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -1,8 +1,6 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; import _ from "lodash"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; import React from "react"; @@ -107,41 +105,15 @@ class OrgUnitDialog extends React.Component { render = () => { const { title, filteringByNameLabel, orgUnitsSelectedLabel } = this.props; - const styles = { - dialog: { - minWidth: 875, - maxWidth: "100%", - }, - cancelButton: { - marginRight: 16, - }, - }; - - const dialogActions = ( - - - , - - - ); return ( - {this._renderStrategyToggle()} @@ -154,7 +126,7 @@ class OrgUnitDialog extends React.Component { filteringByNameLabel={filteringByNameLabel} orgUnitsSelectedLabel={orgUnitsSelectedLabel} /> - + ); }; } diff --git a/src/legacy/components/OrgUnitForm.js b/src/legacy/components/OrgUnitForm.js index cfff026..f45d6c4 100644 --- a/src/legacy/components/OrgUnitForm.js +++ b/src/legacy/components/OrgUnitForm.js @@ -149,9 +149,7 @@ class OrgUnitForm extends React.Component { zIndex: 5, }, controls: { - position: "fixed", - top: 156, - right: 24, + float: "right", width: 575, zIndex: 1, background: "white", From 7f328b4e1d39a30f537fac5488f580fb314caa36 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 12 Oct 2021 14:52:37 +0200 Subject: [PATCH 004/192] added filtering, search and paging and made the advanced filtering work --- .env | 5 +- .jshintignore | 1 + .jshintrc | 10 ++ app-config.json | 27 ++++ config.js | 6 + src/data/repositories/UserD2ApiRepository.ts | 40 +++++- src/domain/entities/Settings.ts | 5 + src/domain/entities/UserList.ts | 3 + src/domain/repositories/ExcelRepository.ts | 13 ++ src/domain/repositories/SettingsRepository.ts | 9 ++ src/domain/repositories/UserRepository.ts | 18 ++- src/domain/usecases/ListUsersUseCase.ts | 6 +- src/index.tsx | 7 +- src/legacy/List/Filters.component.js | 128 +++++++++--------- src/legacy/List/List.component.js | 7 +- .../OrgUnitDialog.component.js | 2 +- .../FilteredMultiSelect.component.js | 10 +- src/types/d2-ui.d.ts | 51 +++++++ .../user-list-table/UserListTable.tsx | 24 +++- 19 files changed, 283 insertions(+), 89 deletions(-) create mode 100644 .jshintignore create mode 100644 .jshintrc create mode 100644 app-config.json create mode 100644 config.js create mode 100644 src/domain/entities/Settings.ts create mode 100644 src/domain/entities/UserList.ts create mode 100644 src/domain/repositories/ExcelRepository.ts create mode 100644 src/domain/repositories/SettingsRepository.ts diff --git a/.env b/.env index e99a73e..9ce475d 100644 --- a/.env +++ b/.env @@ -1,8 +1,9 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 +REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' CYPRESS_DHIS2_AUTH='admin:district' -CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" +CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/who-dev-234" CYPRESS_ROOT_URL=http://localhost:8081 diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.jshintignore @@ -0,0 +1 @@ +node_modules diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..997b3f7 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,10 @@ +{ + "node": true, + + "curly": true, + "latedef": true, + "quotmark": true, + "undef": true, + "unused": true, + "trailing": true +} diff --git a/app-config.json b/app-config.json new file mode 100644 index 0000000..951c24f --- /dev/null +++ b/app-config.json @@ -0,0 +1,27 @@ +{ + "appKey": "User-Extended-App", + "appearance": { + "header": { + "showTitle": true, + "styles": { + "background": "#276696" + } + }, + "showShareButton": true + }, + "feedback": { + "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], + "createIssue": true, + "sendToDhis2UserGroups": [], + "issues": { + "repository": "EyeSeeTea/user-extended-app-blessed", + "title": "[User feedback] {title}", + "body": "## dhis2\n\nUsername: {username}\n\n{body}" + }, + "snapshots": { + "repository": "EyeSeeTeaBotTest/snapshots", + "branch": "master" + }, + "feedbackOptions": {} + } +} diff --git a/config.js b/config.js new file mode 100644 index 0000000..5b0964b --- /dev/null +++ b/config.js @@ -0,0 +1,6 @@ +btoa = s => new Buffer(s).toString("base64"); + +Object.assign(exports, { + baseUrl: "https://dev.eyeseetea.com/who-dev-234", + authorization: "Basic " + btoa("fernandezl:Resistance2019!"), +}); diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 5a73489..cac360f 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -2,7 +2,7 @@ import { D2Api } from "@eyeseetea/d2-api/2.34"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; import { User } from "../../domain/entities/User"; -import { UserRepository } from "../../domain/repositories/UserRepository"; +import { UserRepository, ListOptions } from "../../domain/repositories/UserRepository"; import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; @@ -36,8 +36,42 @@ export class UserD2ApiRepository implements UserRepository { })); } - public list(): FutureData> { - return apiToFuture(this.api.models.users.get({ fields })).map(({ objects, pager }) => ({ + public list(options: ListOptions): FutureData> { + const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; + let filterObj; + if (filters !== undefined) { + filterObj = { + "dataViewOrganisationUnits.id": + filters["dataViewOrganisationUnits.id"] !== null + ? { in: filters["dataViewOrganisationUnits.id"][1] } + : undefined, + "organisationUnits.id": + filters["organisationUnits.id"] !== null ? { in: filters["organisationUnits.id"][1] } : undefined, + "userCredentials.disabled": + filters["userCredentials.disabled"] !== undefined + ? { eq: filters["userCredentials.disabled"][1] } + : undefined, + "userCredentials.userRoles.id": + filters["userCredentials.userRoles.id"] !== null + ? { in: filters["userCredentials.userRoles.id"][1] } + : undefined, + "userGroups.id": filters["userGroups.id"] !== null ? { in: filters["userGroups.id"][1] } : undefined, + }; + } + + return apiToFuture( + this.api.models.users.get({ + fields, + page, + pageSize, + paging: true, + filter: { + identifiable: search ? { token: search } : undefined, + ...filterObj, + }, + order: `${sorting.field}:${sorting.order}`, + }) + ).map(({ objects, pager }) => ({ pager, objects: objects.map(user => ({ id: user.id, diff --git a/src/domain/entities/Settings.ts b/src/domain/entities/Settings.ts new file mode 100644 index 0000000..6027184 --- /dev/null +++ b/src/domain/entities/Settings.ts @@ -0,0 +1,5 @@ +export interface Settings { + visibleTableColumns: string[]; + organisationUnitsField: organisationUnitsFieldSelect; +} +type organisationUnitsFieldSelect = "shortName" | "code"; diff --git a/src/domain/entities/UserList.ts b/src/domain/entities/UserList.ts new file mode 100644 index 0000000..81019d3 --- /dev/null +++ b/src/domain/entities/UserList.ts @@ -0,0 +1,3 @@ +export type ListOptions = { canManage?: boolean; query?: string; order?: string; page: number; pageSize: number }; +//[Operator, Value] +export type FiltersObject = Record; diff --git a/src/domain/repositories/ExcelRepository.ts b/src/domain/repositories/ExcelRepository.ts new file mode 100644 index 0000000..d38b1ab --- /dev/null +++ b/src/domain/repositories/ExcelRepository.ts @@ -0,0 +1,13 @@ +import { FutureData } from "../entities/Future"; +import { FiltersObject } from "../entities/UserList"; +import { User } from "../entities/User"; + +export interface ExcelRepository { + //not sure what type orgUnitsField would be or the return type? + exportToCsv(columns: string[], filterOptions: FiltersObject, { orgUnitsField }: any): string; + exportTemplateToCsv(): string; + //not sure what type { maxUsers, orgUnitsField } would be or the return type? + importFromCsv(file: File, { maxUsers, orgUnitsField }: any): User[]; + saveCsv(contents: string, name: string): FutureData; + exportEmptyTemplate(): string; +} diff --git a/src/domain/repositories/SettingsRepository.ts b/src/domain/repositories/SettingsRepository.ts new file mode 100644 index 0000000..c43e5ad --- /dev/null +++ b/src/domain/repositories/SettingsRepository.ts @@ -0,0 +1,9 @@ +import { FutureData } from "../entities/Future"; +import { Settings } from "../entities/Settings"; + +export interface SettingsRepository { + getByName(name: string): FutureData; + list(): FutureData; + update(fields: string[]): FutureData; + save(): FutureData; +} diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index a695d3f..9755790 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -2,8 +2,24 @@ import { FutureData } from "../entities/Future"; import { PaginatedResponse } from "../entities/PaginatedResponse"; import { User } from "../entities/User"; +export interface ListOptions { + page?: number; + pageSize?: number; + search?: string; + sorting?: { field: string; order: "asc" | "desc" }; + filters?: Record; +} + +export interface ListUsersFilters { + dataViewOrganisationUnits?: string[]; + organisationUnits?: string[]; + userCredentialsDisabled?: string; + userCredentials?: string[]; + userGroups?: string[]; +} + export interface UserRepository { getCurrent(): FutureData; - list(): FutureData>; + list(options: ListOptions): FutureData>; getById(id: string): FutureData; } diff --git a/src/domain/usecases/ListUsersUseCase.ts b/src/domain/usecases/ListUsersUseCase.ts index ecd5ed8..8b925a1 100644 --- a/src/domain/usecases/ListUsersUseCase.ts +++ b/src/domain/usecases/ListUsersUseCase.ts @@ -2,12 +2,12 @@ import { Pager } from "@eyeseetea/d2-ui-components"; import { UseCase } from "../../CompositionRoot"; import { FutureData } from "../entities/Future"; import { User } from "../entities/User"; -import { UserRepository } from "../repositories/UserRepository"; +import { UserRepository, ListOptions } from "../repositories/UserRepository"; export class ListUsersUseCase implements UseCase { constructor(private userRepository: UserRepository) {} - public execute(): FutureData<{ pager: Pager; objects: User[] }> { - return this.userRepository.list(); + public execute(options: ListOptions): FutureData<{ pager: Pager; objects: User[] }> { + return this.userRepository.list(options); } } diff --git a/src/index.tsx b/src/index.tsx index 8a921f2..d78c835 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -61,9 +61,10 @@ async function main() { try { const d2 = await init({ baseUrl: baseUrl + "/api", - headers: isDev && process.env.REACT_APP_DHIS2_AUTH - ? { Authorization: `Basic ${btoa(process.env.REACT_APP_DHIS2_AUTH)}` } - : undefined, + headers: + isDev && process.env.REACT_APP_DHIS2_AUTH + ? { Authorization: `Basic ${btoa(process.env.REACT_APP_DHIS2_AUTH)}` } + : undefined, }); const instance = new Instance({ url: baseUrl }); diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index b78aae2..52e3bcd 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -203,80 +203,84 @@ export default class Filters extends React.Component {
-
- - - - - {isFiltering && ( - - - - )} -
- -
-
- +
+
+ -
-
- + + {isFiltering && ( + + + + )}
-
-
-
- +
+
+ +
+ +
+ +
-
- +
+
+ +
+ +
+ +
-
+
+
); }; diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 652b586..91f5bfa 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -394,12 +394,15 @@ export class ListHybrid extends React.Component { })); const visibleColumns = _(tableColumns).keyBy("name").at(settings.get("visibleTableColumns")).compact().value(); - return (
- +
diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index ff90a84..faa6c1f 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -107,7 +107,7 @@ class OrgUnitDialog extends React.Component { return ( { const { options, selected, onChange } = this.props; const { filterText } = this.state; - return (
this.onFilterTextChange(e)} hintText={this.getTranslation("search")} + type="search" /> void; + onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; + onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + }; export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; + export function InputField(props: InputFieldProps): React.ReactElement; } diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 6f155b9..6b9da9e 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -163,17 +163,24 @@ export const UserListTable: React.FC = props => { const refreshRows = useCallback( ( - _search: string, - _paging: TablePagination, - _sorting: TableSorting + search: string, + { page, pageSize }: TablePagination, + sorting: TableSorting ): Promise<{ objects: User[]; pager: Pager }> => { - return compositionRoot.users.list().toPromise(); + return compositionRoot.users + .list({ + search, + page, + pageSize, + sorting, + filters: props.filters.filters, + }) + .toPromise(); }, - [compositionRoot] + [compositionRoot, props.filters] ); const tableProps = useObjectsTable(baseConfig, refreshRows); - return ( {dialogProps && } @@ -217,4 +224,9 @@ function isStateActionVisible(action: string) { type BaseTableProps = Pick, "loading">; export interface UserListTableProps extends BaseTableProps { openSettings: () => void; + filters: Record; } +/*interface Filters { + dataViewOrganisationUnits: any[]; + organisationUnits: any[]; +}*/ From 17832e1cbf1b72933912c2404b51337d033c0ee5 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 12 Oct 2021 15:09:17 +0200 Subject: [PATCH 005/192] clean up some code --- .env | 7 ++- config.js | 6 --- src/domain/repositories/UserRepository.ts | 8 --- .../FilteredMultiSelect.component.js | 8 +-- src/types/d2-ui.d.ts | 51 ------------------- .../user-list-table/UserListTable.tsx | 7 +-- 6 files changed, 9 insertions(+), 78 deletions(-) delete mode 100644 config.js diff --git a/.env b/.env index 9ce475d..aa81af9 100644 --- a/.env +++ b/.env @@ -1,9 +1,8 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 -REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play CYPRESS_DHIS2_AUTH='admin:district' -CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/who-dev-234" -CYPRESS_ROOT_URL=http://localhost:8081 +CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" +CYPRESS_ROOT_URL=http://localhost:8081 \ No newline at end of file diff --git a/config.js b/config.js deleted file mode 100644 index 5b0964b..0000000 --- a/config.js +++ /dev/null @@ -1,6 +0,0 @@ -btoa = s => new Buffer(s).toString("base64"); - -Object.assign(exports, { - baseUrl: "https://dev.eyeseetea.com/who-dev-234", - authorization: "Basic " + btoa("fernandezl:Resistance2019!"), -}); diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 9755790..5d7a416 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -10,14 +10,6 @@ export interface ListOptions { filters?: Record; } -export interface ListUsersFilters { - dataViewOrganisationUnits?: string[]; - organisationUnits?: string[]; - userCredentialsDisabled?: string; - userCredentials?: string[]; - userGroups?: string[]; -} - export interface UserRepository { getCurrent(): FutureData; list(options: ListOptions): FutureData>; diff --git a/src/legacy/components/FilteredMultiSelect.component.js b/src/legacy/components/FilteredMultiSelect.component.js index 7eae829..f61ec1e 100644 --- a/src/legacy/components/FilteredMultiSelect.component.js +++ b/src/legacy/components/FilteredMultiSelect.component.js @@ -22,8 +22,8 @@ class FilteredMultiSelectComponent extends React.Component { }, }; - onFilterTextChange({ value }) { - this.setState({ filterText: value }); + onFilterTextChange(event) { + this.setState({ filterText: event.target.value }); } render = () => { @@ -34,9 +34,9 @@ class FilteredMultiSelectComponent extends React.Component { this.onFilterTextChange(e)} - hintText={this.getTranslation("search")} + onChange={this.onFilterTextChange} type="search" + hintText={this.getTranslation("search")} /> void; - onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; - onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; - }; export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; - export function InputField(props: InputFieldProps): React.ReactElement; } diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 6b9da9e..8252aad 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -181,6 +181,7 @@ export const UserListTable: React.FC = props => { ); const tableProps = useObjectsTable(baseConfig, refreshRows); + return ( {dialogProps && } @@ -224,9 +225,5 @@ function isStateActionVisible(action: string) { type BaseTableProps = Pick, "loading">; export interface UserListTableProps extends BaseTableProps { openSettings: () => void; - filters: Record; + filters: Record; } -/*interface Filters { - dataViewOrganisationUnits: any[]; - organisationUnits: any[]; -}*/ From 575305c44d5450fd09dd35e6eacca274f95adc57 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 12 Oct 2021 15:14:12 +0200 Subject: [PATCH 006/192] remove some entities and repositories I made in the roadmap --- src/domain/entities/Settings.ts | 5 ----- src/domain/entities/UserList.ts | 3 --- src/domain/repositories/ExcelRepository.ts | 13 ------------- src/domain/repositories/SettingsRepository.ts | 9 --------- .../components/FilteredMultiSelect.component.js | 2 ++ 5 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 src/domain/entities/Settings.ts delete mode 100644 src/domain/entities/UserList.ts delete mode 100644 src/domain/repositories/ExcelRepository.ts delete mode 100644 src/domain/repositories/SettingsRepository.ts diff --git a/src/domain/entities/Settings.ts b/src/domain/entities/Settings.ts deleted file mode 100644 index 6027184..0000000 --- a/src/domain/entities/Settings.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Settings { - visibleTableColumns: string[]; - organisationUnitsField: organisationUnitsFieldSelect; -} -type organisationUnitsFieldSelect = "shortName" | "code"; diff --git a/src/domain/entities/UserList.ts b/src/domain/entities/UserList.ts deleted file mode 100644 index 81019d3..0000000 --- a/src/domain/entities/UserList.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type ListOptions = { canManage?: boolean; query?: string; order?: string; page: number; pageSize: number }; -//[Operator, Value] -export type FiltersObject = Record; diff --git a/src/domain/repositories/ExcelRepository.ts b/src/domain/repositories/ExcelRepository.ts deleted file mode 100644 index d38b1ab..0000000 --- a/src/domain/repositories/ExcelRepository.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { FutureData } from "../entities/Future"; -import { FiltersObject } from "../entities/UserList"; -import { User } from "../entities/User"; - -export interface ExcelRepository { - //not sure what type orgUnitsField would be or the return type? - exportToCsv(columns: string[], filterOptions: FiltersObject, { orgUnitsField }: any): string; - exportTemplateToCsv(): string; - //not sure what type { maxUsers, orgUnitsField } would be or the return type? - importFromCsv(file: File, { maxUsers, orgUnitsField }: any): User[]; - saveCsv(contents: string, name: string): FutureData; - exportEmptyTemplate(): string; -} diff --git a/src/domain/repositories/SettingsRepository.ts b/src/domain/repositories/SettingsRepository.ts deleted file mode 100644 index c43e5ad..0000000 --- a/src/domain/repositories/SettingsRepository.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FutureData } from "../entities/Future"; -import { Settings } from "../entities/Settings"; - -export interface SettingsRepository { - getByName(name: string): FutureData; - list(): FutureData; - update(fields: string[]): FutureData; - save(): FutureData; -} diff --git a/src/legacy/components/FilteredMultiSelect.component.js b/src/legacy/components/FilteredMultiSelect.component.js index f61ec1e..bc2b03a 100644 --- a/src/legacy/components/FilteredMultiSelect.component.js +++ b/src/legacy/components/FilteredMultiSelect.component.js @@ -1,6 +1,7 @@ import React from "react"; import PropTypes from "prop-types"; import TextField from "material-ui/TextField/TextField"; + import MultiSelect from "./MultiSelect.component"; class FilteredMultiSelectComponent extends React.Component { @@ -29,6 +30,7 @@ class FilteredMultiSelectComponent extends React.Component { render = () => { const { options, selected, onChange } = this.props; const { filterText } = this.state; + return (
Date: Tue, 12 Oct 2021 15:46:40 +0200 Subject: [PATCH 007/192] made filter object logic better written --- src/data/repositories/UserD2ApiRepository.ts | 30 +++++++------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index cac360f..bd70a26 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,3 +1,4 @@ +import _ from "lodash"; import { D2Api } from "@eyeseetea/d2-api/2.34"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -35,28 +36,18 @@ export class UserD2ApiRepository implements UserRepository { access: user.access, })); } - public list(options: ListOptions): FutureData> { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; - let filterObj; + let filterObj: FilterObject = {}; if (filters !== undefined) { - filterObj = { - "dataViewOrganisationUnits.id": - filters["dataViewOrganisationUnits.id"] !== null - ? { in: filters["dataViewOrganisationUnits.id"][1] } - : undefined, - "organisationUnits.id": - filters["organisationUnits.id"] !== null ? { in: filters["organisationUnits.id"][1] } : undefined, - "userCredentials.disabled": - filters["userCredentials.disabled"] !== undefined - ? { eq: filters["userCredentials.disabled"][1] } - : undefined, - "userCredentials.userRoles.id": - filters["userCredentials.userRoles.id"] !== null - ? { in: filters["userCredentials.userRoles.id"][1] } - : undefined, - "userGroups.id": filters["userGroups.id"] !== null ? { in: filters["userGroups.id"][1] } : undefined, - }; + filterObj = _.mapValues(filters, (items, key) => { + if(key === "userCredentials.disabled") { + return items !== undefined ? { eq: items[1] }: undefined; + } + else { + return items !== null ? { in: items[1] } : undefined; + } + }); } return apiToFuture( @@ -119,6 +110,7 @@ export class UserD2ApiRepository implements UserRepository { ); } } +type FilterObject = Record; const fields = { id: true, From e6ab11f1e55d958b116a4025b004ecbe83013aea Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 08:41:25 +0200 Subject: [PATCH 008/192] Remove JSHint config --- .env | 2 +- .jshintignore | 1 - .jshintrc | 10 ---------- src/data/repositories/UserD2ApiRepository.ts | 9 ++++----- 4 files changed, 5 insertions(+), 17 deletions(-) delete mode 100644 .jshintignore delete mode 100644 .jshintrc diff --git a/.env b/.env index aa81af9..e99a73e 100644 --- a/.env +++ b/.env @@ -5,4 +5,4 @@ REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play CYPRESS_DHIS2_AUTH='admin:district' CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" -CYPRESS_ROOT_URL=http://localhost:8081 \ No newline at end of file +CYPRESS_ROOT_URL=http://localhost:8081 diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index 3c3629e..0000000 --- a/.jshintignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 997b3f7..0000000 --- a/.jshintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "node": true, - - "curly": true, - "latedef": true, - "quotmark": true, - "undef": true, - "unused": true, - "trailing": true -} diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index bd70a26..f9f866e 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -41,10 +41,9 @@ export class UserD2ApiRepository implements UserRepository { let filterObj: FilterObject = {}; if (filters !== undefined) { filterObj = _.mapValues(filters, (items, key) => { - if(key === "userCredentials.disabled") { - return items !== undefined ? { eq: items[1] }: undefined; - } - else { + if (key === "userCredentials.disabled") { + return items !== undefined ? { eq: items[1] } : undefined; + } else { return items !== null ? { in: items[1] } : undefined; } }); @@ -110,7 +109,7 @@ export class UserD2ApiRepository implements UserRepository { ); } } -type FilterObject = Record; +type FilterObject = Record; const fields = { id: true, From d4e404fb4a7e8663c180133519e2ef027c854857 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 08:42:32 +0200 Subject: [PATCH 009/192] Remove app config --- app-config.json | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 app-config.json diff --git a/app-config.json b/app-config.json deleted file mode 100644 index 951c24f..0000000 --- a/app-config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appKey": "User-Extended-App", - "appearance": { - "header": { - "showTitle": true, - "styles": { - "background": "#276696" - } - }, - "showShareButton": true - }, - "feedback": { - "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], - "createIssue": true, - "sendToDhis2UserGroups": [], - "issues": { - "repository": "EyeSeeTea/user-extended-app-blessed", - "title": "[User feedback] {title}", - "body": "## dhis2\n\nUsername: {username}\n\n{body}" - }, - "snapshots": { - "repository": "EyeSeeTeaBotTest/snapshots", - "branch": "master" - }, - "feedbackOptions": {} - } -} From 316b7530a1062046428fbbeabdeb1e541ecf3707 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 08:58:15 +0200 Subject: [PATCH 010/192] Minor visual changes Signed-off-by: Alexis Rico --- src/data/repositories/UserD2ApiRepository.ts | 2 ++ src/legacy/List/Filters.component.js | 13 ++----------- src/legacy/List/List.component.js | 1 + .../components/user-list-table/UserListTable.tsx | 4 ++-- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index f9f866e..7ab571d 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -36,6 +36,7 @@ export class UserD2ApiRepository implements UserRepository { access: user.access, })); } + public list(options: ListOptions): FutureData> { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; let filterObj: FilterObject = {}; @@ -109,6 +110,7 @@ export class UserD2ApiRepository implements UserRepository { ); } } + type FilterObject = Record; const fields = { diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 52e3bcd..545dd67 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -2,7 +2,6 @@ import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import Checkbox from "material-ui/Checkbox/Checkbox"; import IconButton from "material-ui/IconButton"; -import ClearIcon from "material-ui/svg-icons/content/clear"; import FilterListIcon from "material-ui/svg-icons/content/filter-list"; import memoize from "memoize-weak"; import PropTypes from "prop-types"; @@ -210,6 +209,8 @@ export default class Filters extends React.Component { open={showExtendedFilters} onCancel={this.closeFilters} cancelText={this.getTranslation("close")} + infoActionText={this.getTranslation("clear_filters")} + onInfoAction={isFiltering ? this.clearFilters : undefined} >
@@ -226,16 +227,6 @@ export default class Filters extends React.Component { onCheck={this.setFilter("showOnlyActiveUsers", this.checkboxHandler)} checked={showOnlyActiveUsers} /> - - {isFiltering && ( - - - - )}
diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 91f5bfa..c3fc81f 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -394,6 +394,7 @@ export class ListHybrid extends React.Component { })); const visibleColumns = _(tableColumns).keyBy("name").at(settings.get("visibleTableColumns")).compact().value(); + return (
diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 8252aad..5b601ac 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -192,10 +192,10 @@ export const UserListTable: React.FC = props => { }; export const columns: TableColumn[] = [ + { name: "username", sortable: false, text: i18n.t("Username") }, { name: "firstName", sortable: true, text: i18n.t("First name") }, { name: "surname", sortable: true, text: i18n.t("Surname") }, - { name: "username", sortable: false, text: i18n.t("Username") }, - { name: "email", sortable: false, text: i18n.t("Email") }, + { name: "email", sortable: true, text: i18n.t("Email") }, { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, { name: "userRoles", sortable: false, text: i18n.t("Roles"), hidden: true }, From 700880ac1b43657b356455300a3660a1124ce656 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 09:17:19 +0200 Subject: [PATCH 011/192] Clean-up repository Signed-off-by: Alexis Rico --- i18n/en.pot | 10 +- i18n/es.po | 8 +- src/data/repositories/UserD2ApiRepository.ts | 106 ++++++------------ .../user-list-table/UserListTable.tsx | 9 +- 4 files changed, 50 insertions(+), 83 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 881d382..5f20085 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-09-30T20:45:16.406Z\n" -"PO-Revision-Date: 2021-09-30T20:45:16.406Z\n" +"POT-Creation-Date: 2021-10-13T07:08:28.546Z\n" +"PO-Revision-Date: 2021-10-13T07:08:28.546Z\n" msgid "Settings" msgstr "" @@ -56,13 +56,13 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "First name" +msgid "Username" msgstr "" -msgid "Surname" +msgid "First name" msgstr "" -msgid "Username" +msgid "Surname" msgstr "" msgid "Email" diff --git a/i18n/es.po b/i18n/es.po index 23a357b..83688b6 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-09-30T20:45:16.406Z\n" +"POT-Creation-Date: 2021-10-13T07:08:28.546Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -56,13 +56,13 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "First name" +msgid "Username" msgstr "" -msgid "Surname" +msgid "First name" msgstr "" -msgid "Username" +msgid "Surname" msgstr "" msgid "Email" diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 7ab571d..2fa61f3 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,9 +1,9 @@ +import { D2Api, D2UserSchema, SelectedPick } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; -import { D2Api } from "@eyeseetea/d2-api/2.34"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; import { User } from "../../domain/entities/User"; -import { UserRepository, ListOptions } from "../../domain/repositories/UserRepository"; +import { ListOptions, UserRepository } from "../../domain/repositories/UserRepository"; import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; @@ -18,37 +18,12 @@ export class UserD2ApiRepository implements UserRepository { @cache() public getCurrent(): FutureData { - return apiToFuture(this.api.currentUser.get({ fields })).map(user => ({ - id: user.id, - name: user.displayName, - firstName: user.firstName, - surname: user.surname, - email: user.email, - lastUpdated: new Date(user.lastUpdated), - created: new Date(user.created), - userGroups: user.userGroups, - username: user.userCredentials.username, - userRoles: user.userCredentials.userRoles, - lastLogin: new Date(user.userCredentials.lastLogin), - disabled: user.userCredentials.disabled, - organisationUnits: user.organisationUnits, - dataViewOrganisationUnits: user.dataViewOrganisationUnits, - access: user.access, - })); + return apiToFuture(this.api.currentUser.get({ fields })).map(user => this.mapUser(user)); } public list(options: ListOptions): FutureData> { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; - let filterObj: FilterObject = {}; - if (filters !== undefined) { - filterObj = _.mapValues(filters, (items, key) => { - if (key === "userCredentials.disabled") { - return items !== undefined ? { eq: items[1] } : undefined; - } else { - return items !== null ? { in: items[1] } : undefined; - } - }); - } + const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); return apiToFuture( this.api.models.users.get({ @@ -58,60 +33,45 @@ export class UserD2ApiRepository implements UserRepository { paging: true, filter: { identifiable: search ? { token: search } : undefined, - ...filterObj, + ...otherFilters, }, order: `${sorting.field}:${sorting.order}`, }) ).map(({ objects, pager }) => ({ pager, - objects: objects.map(user => ({ - id: user.id, - name: user.displayName, - firstName: user.firstName, - surname: user.surname, - email: user.email, - lastUpdated: new Date(user.lastUpdated), - created: new Date(user.created), - userGroups: user.userGroups, - username: user.userCredentials.username, - userRoles: user.userCredentials.userRoles, - lastLogin: new Date(user.userCredentials.lastLogin), - disabled: user.userCredentials.disabled, - organisationUnits: user.organisationUnits, - dataViewOrganisationUnits: user.dataViewOrganisationUnits, - access: user.access, - })), + objects: objects.map(user => this.mapUser(user)), })); } public getById(id: string): FutureData { - return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap( - ({ objects: [user] }) => { - if (!user) return Future.error(`User ${id} not found`); + return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap(({ objects }) => { + const [user] = objects; + if (!user) return Future.error(`User ${id} not found`); - return Future.success({ - id: user.id, - name: user.displayName, - firstName: user.firstName, - surname: user.surname, - email: user.email, - lastUpdated: new Date(user.lastUpdated), - created: new Date(user.created), - userGroups: user.userGroups, - username: user.userCredentials.username, - userRoles: user.userCredentials.userRoles, - lastLogin: new Date(user.userCredentials.lastLogin), - disabled: user.userCredentials.disabled, - organisationUnits: user.organisationUnits, - dataViewOrganisationUnits: user.dataViewOrganisationUnits, - access: user.access, - }); - } - ); + return Future.success(this.mapUser(user)); + }); } -} -type FilterObject = Record; + private mapUser(user: D2ApiUser): User { + return { + id: user.id, + name: user.displayName, + firstName: user.firstName, + surname: user.surname, + email: user.email, + lastUpdated: new Date(user.lastUpdated), + created: new Date(user.created), + userGroups: user.userGroups, + username: user.userCredentials.username, + userRoles: user.userCredentials.userRoles, + lastLogin: new Date(user.userCredentials.lastLogin), + disabled: user.userCredentials.disabled, + organisationUnits: user.organisationUnits, + dataViewOrganisationUnits: user.dataViewOrganisationUnits, + access: user.access, + }; + } +} const fields = { id: true, @@ -131,4 +91,6 @@ const fields = { organisationUnits: { id: true, name: true }, dataViewOrganisationUnits: { id: true, name: true }, access: true, -}; +} as const; + +type D2ApiUser = SelectedPick; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 5b601ac..72b686c 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -11,7 +11,7 @@ import { useObjectsTable, } from "@eyeseetea/d2-ui-components"; import { Icon } from "@material-ui/core"; -import { Tune } from "@material-ui/icons"; +import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; import React, { useCallback, useMemo } from "react"; @@ -203,7 +203,12 @@ export const columns: TableColumn[] = [ { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, { name: "lastLogin", sortable: false, text: i18n.t("Last login") }, - { name: "disabled", sortable: false, text: i18n.t("Disabled") }, + { + name: "disabled", + sortable: false, + text: i18n.t("Disabled"), + getValue: row => (row.disabled ? : undefined), + }, ]; function checkAccess(requiredKeys: string[]) { From ec386b801e9f7bf30421523652921ac4ff4a753a Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 13 Oct 2021 15:29:42 +0200 Subject: [PATCH 012/192] fix copy in user --- src/legacy/components/CopyInUserDialog.component.js | 4 ++-- .../CopyInUserBatchModelsMultiSelect.component.js | 9 +++++---- .../CopyInUserBatchModelsMultiSelect.model.js | 6 +++--- src/legacy/models/userHelpers.js | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/legacy/components/CopyInUserDialog.component.js b/src/legacy/components/CopyInUserDialog.component.js index a61e9f1..a01845d 100644 --- a/src/legacy/components/CopyInUserDialog.component.js +++ b/src/legacy/components/CopyInUserDialog.component.js @@ -25,7 +25,7 @@ function CopyInUserDialog(props, context) { return ( getTitle(getTranslation, users)} onSuccess={getTranslation("user_configuration_copied")} @@ -39,7 +39,7 @@ CopyInUserDialog.contextTypes = { }; CopyInUserDialog.propTypes = { - user: PropTypes.object.isRequired, + user: PropTypes.array.isRequired, onRequestClose: PropTypes.func.isRequired, }; diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index 2a49c67..92fc1c7 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -126,6 +126,7 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com updateStrategy, } = this.state; this.setState({ state: "loading" }); + const copyAccessElements = { userGroups: copyUserGroups, userRoles: copyUserRoles, @@ -262,10 +263,10 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com onToggle={(ev, newValue) => this.setState({ copyUserRoles: newValue })} /> this.setState({ copyOrgUnits: newValue })} + checked={this.state.copyOrgUnitsCapture === true} + onToggle={(ev, newValue) => this.setState({ copyOrgUnitsCapture: newValue })} />
@@ -276,7 +277,7 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com CopyInUserBatchModelsMultiSelectComponent.propTypes = { model: PropTypes.object.isRequired, - parents: PropTypes.arrayOf(PropTypes.object).isRequired, + parents: PropTypes.arrayOf(PropTypes.string).isRequired, onRequestClose: PropTypes.func.isRequired, }; diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js index 2aed9bc..46be46f 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js @@ -23,13 +23,13 @@ export default class CopyInUserBatchModelsMultiSelectModel { }; getParents(parents) { - const parentIds = _(parents) + /*const parentIds = _(parents) .map(obj => obj.id) .compact() - .value(); + .value();*/ const options = { paging: false, - filter: "id:in:[" + parentIds.join(",") + "]", + filter: "id:in:[" + parents.join(",") + "]", fields: this.parentFields || ":owner", }; return this.parentModel.list(options).then(collection => collection.toArray()); diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 0477ea2..085eedb 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -516,7 +516,7 @@ function getPayload(d2, parentUser, destUsers, fields, updateStrategy) { const newChildOrgUnits = addItems( childUser.organisationUnits, parentUser.organisationUnits, - fields.orgUnits, + fields.orgUnitCapture, updateStrategy ); From ec58ae909ac22e974bf2b8ccfb96c9ceedc6d402 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 13 Oct 2021 16:06:49 +0200 Subject: [PATCH 013/192] fixed any use in typescript, added a Filter type --- src/domain/repositories/UserRepository.ts | 4 +++- src/legacy/List/List.component.js | 2 +- src/webapp/components/user-list-table/UserListTable.tsx | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 5d7a416..08a87fc 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -7,8 +7,10 @@ export interface ListOptions { pageSize?: number; search?: string; sorting?: { field: string; order: "asc" | "desc" }; - filters?: Record; + filters?: Filters; } +export type Filters = undefined | Record; +type InEqIds = undefined | null | [string, string[]]; export interface UserRepository { getCurrent(): FutureData; diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index c3fc81f..3cfd628 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -402,7 +402,7 @@ export class ListHybrid extends React.Component { diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 72b686c..26e2986 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -25,6 +25,7 @@ import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.sto import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; +import { Filters } from "../../../domain/repositories/UserRepository"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); @@ -173,7 +174,7 @@ export const UserListTable: React.FC = props => { page, pageSize, sorting, - filters: props.filters.filters, + filters: props?.filters, }) .toPromise(); }, @@ -230,5 +231,5 @@ function isStateActionVisible(action: string) { type BaseTableProps = Pick, "loading">; export interface UserListTableProps extends BaseTableProps { openSettings: () => void; - filters: Record; + filters: Filters; } From ecacca97d85d25bca39ba23f2db07539ff063144 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 13 Oct 2021 16:31:28 +0200 Subject: [PATCH 014/192] removed parent comments --- .../CopyInUserBatchModelsMultiSelect.model.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js index 46be46f..6ad59fc 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js @@ -23,10 +23,6 @@ export default class CopyInUserBatchModelsMultiSelectModel { }; getParents(parents) { - /*const parentIds = _(parents) - .map(obj => obj.id) - .compact() - .value();*/ const options = { paging: false, filter: "id:in:[" + parents.join(",") + "]", From 49545e732f30ae15c0a38e3ca65905afa3433bac Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 16:51:49 +0200 Subject: [PATCH 015/192] Update types Signed-off-by: Alexis Rico --- src/domain/repositories/UserRepository.ts | 17 +++++++++-------- .../user-list-table/UserListTable.tsx | 9 ++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 08a87fc..4df5ffd 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -2,18 +2,19 @@ import { FutureData } from "../entities/Future"; import { PaginatedResponse } from "../entities/PaginatedResponse"; import { User } from "../entities/User"; +export interface UserRepository { + getCurrent(): FutureData; + list(options: ListOptions): FutureData>; + getById(id: string): FutureData; +} + export interface ListOptions { page?: number; pageSize?: number; search?: string; sorting?: { field: string; order: "asc" | "desc" }; - filters?: Filters; + filters?: ListFilters; } -export type Filters = undefined | Record; -type InEqIds = undefined | null | [string, string[]]; -export interface UserRepository { - getCurrent(): FutureData; - list(options: ListOptions): FutureData>; - getById(id: string): FutureData; -} +export type ListFilterType = "in" | "eq"; +export type ListFilters = Record; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 26e2986..3024794 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -8,7 +8,7 @@ import { TableConfig, TablePagination, TableSorting, - useObjectsTable, + useObjectsTable } from "@eyeseetea/d2-ui-components"; import { Icon } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; @@ -16,6 +16,7 @@ import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; import React, { useCallback, useMemo } from "react"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; +import { ListFilters } from "../../../domain/repositories/UserRepository"; import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; import copyInUserStore from "../../../legacy/List/copyInUser.store"; import deleteUserStore from "../../../legacy/List/deleteUser.store"; @@ -25,7 +26,6 @@ import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.sto import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; -import { Filters } from "../../../domain/repositories/UserRepository"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); @@ -228,8 +228,7 @@ function isStateActionVisible(action: string) { currentUserHasUpdateAccessOn(users) && _(users).some(user => user.disabled === requiredDisabledValue); } -type BaseTableProps = Pick, "loading">; -export interface UserListTableProps extends BaseTableProps { +export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; - filters: Filters; + filters: ListFilters; } From 34e2905fa97010dd0772db67f890dea13c4a8aeb Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 16:52:27 +0200 Subject: [PATCH 016/192] Prettify code Signed-off-by: Alexis Rico --- src/webapp/components/user-list-table/UserListTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 3024794..81c0818 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -8,7 +8,7 @@ import { TableConfig, TablePagination, TableSorting, - useObjectsTable + useObjectsTable, } from "@eyeseetea/d2-ui-components"; import { Icon } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; From 7b4e630d91964303162b2c667a800603a5bf701b Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 13 Oct 2021 17:45:05 +0200 Subject: [PATCH 017/192] added ConfirmationDialog to CopyInUser --- .env | 5 ++- src/legacy/List/List.component.js | 2 +- .../components/CopyInUserDialog.component.js | 2 +- ...yInUserBatchModelsMultiSelect.component.js | 43 +++++-------------- 4 files changed, 15 insertions(+), 37 deletions(-) diff --git a/.env b/.env index e99a73e..9ce475d 100644 --- a/.env +++ b/.env @@ -1,8 +1,9 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 +REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' CYPRESS_DHIS2_AUTH='admin:district' -CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" +CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/who-dev-234" CYPRESS_ROOT_URL=http://localhost:8081 diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 3cfd628..79ef2b5 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -471,7 +471,7 @@ export class ListHybrid extends React.Component { {copyUsers.open ? ( copyInUserStore.setState({ open: false })} + onCancel={() => copyInUserStore.setState({ open: false })} /> ) : null} diff --git a/src/legacy/components/CopyInUserDialog.component.js b/src/legacy/components/CopyInUserDialog.component.js index a01845d..6e54a96 100644 --- a/src/legacy/components/CopyInUserDialog.component.js +++ b/src/legacy/components/CopyInUserDialog.component.js @@ -26,7 +26,7 @@ function CopyInUserDialog(props, context) { getTitle(getTranslation, users)} onSuccess={getTranslation("user_configuration_copied")} onError={getTranslation("user_configuration_copied_error")} diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index 92fc1c7..beccb7a 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -1,8 +1,6 @@ import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import TextField from "material-ui/TextField/TextField"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; @@ -97,7 +95,7 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com close(snackMessage = null) { if (snackMessage) snackActions.show({ message: snackMessage }); - this.props.onRequestClose(); + this.props.onCancel(); } renderStrategyToggle = () => { @@ -177,28 +175,6 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com } }; - getDialogButtons = () => { - const isLoading = this.state.state === "loading"; - - return ( - - - , - - , - - ); - }; - //eslint-disable-next-line render = () => { const isLoading = this.state.state === "loading"; @@ -212,14 +188,15 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com .value(); return ( -
- + ); }; } From 98946c8c2886f35874f38692e0c994ffdb3ab101 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 13 Oct 2021 17:47:17 +0200 Subject: [PATCH 018/192] revert env accidentally --- .env | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.env b/.env index 9ce475d..e99a73e 100644 --- a/.env +++ b/.env @@ -1,9 +1,8 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 -REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play CYPRESS_DHIS2_AUTH='admin:district' -CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/who-dev-234" +CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" CYPRESS_ROOT_URL=http://localhost:8081 From fe512021f64deae7c6de4a8897c6791c9b71a491 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 18:05:14 +0200 Subject: [PATCH 019/192] Rename props --- src/legacy/components/CopyInUserDialog.component.js | 2 +- .../CopyInUserBatchModelsMultiSelect.component.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/legacy/components/CopyInUserDialog.component.js b/src/legacy/components/CopyInUserDialog.component.js index 6e54a96..3b9ab25 100644 --- a/src/legacy/components/CopyInUserDialog.component.js +++ b/src/legacy/components/CopyInUserDialog.component.js @@ -40,7 +40,7 @@ CopyInUserDialog.contextTypes = { CopyInUserDialog.propTypes = { user: PropTypes.array.isRequired, - onRequestClose: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, }; export default CopyInUserDialog; diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index beccb7a..531c55b 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -255,7 +255,7 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com CopyInUserBatchModelsMultiSelectComponent.propTypes = { model: PropTypes.object.isRequired, parents: PropTypes.arrayOf(PropTypes.string).isRequired, - onRequestClose: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, }; CopyInUserBatchModelsMultiSelectComponent.contextTypes = { From d36dba94c3dcdd89d45e719b9ac00b747bf08d85 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 13 Oct 2021 18:08:02 +0200 Subject: [PATCH 020/192] Update dialog --- .../CopyInUserBatchModelsMultiSelect.component.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index 531c55b..57921c3 100644 --- a/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -195,8 +195,8 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com open={true} onCancel={this.props.onCancel} cancelText={this.getTranslation("cancel")} - infoActionText={this.getTranslation("save")} - onInfoAction={!isLoading ? this.copy.bind(this) : undefined} + saveText={this.getTranslation("save")} + onSave={!isLoading ? this.copy.bind(this) : undefined} > Date: Fri, 15 Oct 2021 18:43:24 +0200 Subject: [PATCH 021/192] successfully fixed assign user roles and user groups actions --- src/legacy/components/UserRolesDialog.component.js | 1 - .../BatchModelsMultiSelect.component.js | 4 ++-- .../BatchModelsMultiSelect.model.js | 7 +------ 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/legacy/components/UserRolesDialog.component.js b/src/legacy/components/UserRolesDialog.component.js index 3199855..1a07b09 100644 --- a/src/legacy/components/UserRolesDialog.component.js +++ b/src/legacy/components/UserRolesDialog.component.js @@ -25,7 +25,6 @@ function getTitle(getTranslation, users) { function UserRolesDialog(props, context) { const { d2 } = context; const getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); - const modelOptions = { parentModel: d2.models.users, parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin, disabled]", diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js index 9e6268b..5576a3a 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js @@ -62,7 +62,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { componentDidMount = () => { const { parents, model } = this.props; return Promise.all([model.getAllChildren(), model.getParents(parents)]) - .then(([allChildren, parentsLoaded]) => + .then(([allChildren, parentsLoaded]) => this.setState({ state: "ready", parents: parentsLoaded, @@ -190,7 +190,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { BatchModelsMultiSelectComponent.propTypes = { model: PropTypes.object.isRequired, - parents: PropTypes.arrayOf(PropTypes.object).isRequired, + parents: PropTypes.arrayOf(PropTypes.string).isRequired, onRequestClose: PropTypes.func.isRequired, }; diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js index f92caf3..c2b58ea 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js @@ -21,13 +21,9 @@ export default class BatchModelsMultiSelectModel { }; getParents(parents) { - const parentIds = _(parents) - .map(obj => obj.id) - .compact() - .value(); const options = { paging: false, - filter: "id:in:[" + parentIds.join(",") + "]", + filter: "id:in:[" + parents.join(",") + "]", fields: this.parentFields || ":owner", }; return this.parentModel.list(options).then(collection => collection.toArray()); @@ -39,7 +35,6 @@ export default class BatchModelsMultiSelectModel { .at(...selectedIds) .compact() .value(); - const childrenForParents = this.getNewChildren(parents, selectedChildren, updateStrategy); const payload = this.getPayload(allChildren, _.zip(parents, childrenForParents)); const metadataUrl = "metadata?importStrategy=UPDATE&mergeMode=REPLACE"; From c368b4265f7730dbab18b0ee734b7819e326e0d7 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Fri, 15 Oct 2021 18:49:45 +0200 Subject: [PATCH 022/192] revert some spaces --- src/legacy/components/UserRolesDialog.component.js | 1 + .../BatchModelsMultiSelect.component.js | 2 +- .../batch-models-multi-select/BatchModelsMultiSelect.model.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/legacy/components/UserRolesDialog.component.js b/src/legacy/components/UserRolesDialog.component.js index 1a07b09..3199855 100644 --- a/src/legacy/components/UserRolesDialog.component.js +++ b/src/legacy/components/UserRolesDialog.component.js @@ -25,6 +25,7 @@ function getTitle(getTranslation, users) { function UserRolesDialog(props, context) { const { d2 } = context; const getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); + const modelOptions = { parentModel: d2.models.users, parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin, disabled]", diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js index 5576a3a..e604ffa 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js @@ -62,7 +62,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { componentDidMount = () => { const { parents, model } = this.props; return Promise.all([model.getAllChildren(), model.getParents(parents)]) - .then(([allChildren, parentsLoaded]) => + .then(([allChildren, parentsLoaded]) => this.setState({ state: "ready", parents: parentsLoaded, diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js index c2b58ea..5b63f51 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.model.js @@ -35,6 +35,7 @@ export default class BatchModelsMultiSelectModel { .at(...selectedIds) .compact() .value(); + const childrenForParents = this.getNewChildren(parents, selectedChildren, updateStrategy); const payload = this.getPayload(allChildren, _.zip(parents, childrenForParents)); const metadataUrl = "metadata?importStrategy=UPDATE&mergeMode=REPLACE"; From 2973787754e4e4db9c7bd50b63ac45160b9cd70c Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 18 Oct 2021 11:20:19 +0200 Subject: [PATCH 023/192] add confirmation dialog to BatchModelsMultiSelect.component.js --- src/legacy/List/List.component.js | 4 +- .../components/UserGroupsDialog.component.js | 2 +- .../components/UserRolesDialog.component.js | 2 +- .../BatchModelsMultiSelect.component.js | 37 ++++++------------- 4 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 79ef2b5..140dbe8 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -464,7 +464,7 @@ export class ListHybrid extends React.Component { {assignUserRoles.open ? ( userRolesAssignmentDialogStore.setState({ open: false })} + onCancel={() => userRolesAssignmentDialogStore.setState({ open: false })} /> ) : null} @@ -478,7 +478,7 @@ export class ListHybrid extends React.Component { {assignUserGroups.open ? ( userGroupsAssignmentDialogStore.setState({ open: false })} + onCancel={() => userGroupsAssignmentDialogStore.setState({ open: false })} /> ) : null} diff --git a/src/legacy/components/UserGroupsDialog.component.js b/src/legacy/components/UserGroupsDialog.component.js index 644ecd9..33dc194 100644 --- a/src/legacy/components/UserGroupsDialog.component.js +++ b/src/legacy/components/UserGroupsDialog.component.js @@ -58,7 +58,7 @@ function UserGroupsDialog(props, context) { getTitle(getTranslation, users)} diff --git a/src/legacy/components/UserRolesDialog.component.js b/src/legacy/components/UserRolesDialog.component.js index 3199855..0b11235 100644 --- a/src/legacy/components/UserRolesDialog.component.js +++ b/src/legacy/components/UserRolesDialog.component.js @@ -38,7 +38,7 @@ function UserRolesDialog(props, context) { getTitle(getTranslation, users)} onSuccess={getTranslation("user_roles_assigned")} onError={getTranslation("user_roles_assign_error")} diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js index e604ffa..c85791f 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js @@ -1,8 +1,6 @@ import LoadingMask from "d2-ui/lib/loading-mask/LoadingMask.component"; import _ from "lodash"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import TextField from "material-ui/TextField/TextField"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; @@ -75,7 +73,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { close(snackMessage = null) { if (snackMessage) snackActions.show({ message: snackMessage }); - this.props.onRequestClose(); + this.props.onCancel(); } renderStrategyToggle = () => { @@ -130,20 +128,6 @@ export default class BatchModelsMultiSelectComponent extends React.Component { this.setState({ filterText: event.target.value }); } - getDialogButtons = () => { - return ( - - - , - , - - ); - }; - //eslint-disable-next-line render = () => { const isLoading = this.state.state === "loading"; @@ -155,14 +139,15 @@ export default class BatchModelsMultiSelectComponent extends React.Component { .value(); return ( -
- +
); }; } @@ -191,7 +176,7 @@ export default class BatchModelsMultiSelectComponent extends React.Component { BatchModelsMultiSelectComponent.propTypes = { model: PropTypes.object.isRequired, parents: PropTypes.arrayOf(PropTypes.string).isRequired, - onRequestClose: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, }; BatchModelsMultiSelectComponent.contextTypes = { From eb1d669f8aab6ae57c6caeab1f5ea5b7bb93e3aa Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 18 Oct 2021 16:45:03 +0200 Subject: [PATCH 024/192] fixed the disable function --- public/old-i18n/i18n_module_ar.properties | 2 + public/old-i18n/i18n_module_en.properties | 2 + public/old-i18n/i18n_module_es.properties | 2 + public/old-i18n/i18n_module_fr.properties | 2 + src/legacy/List/List.component.js | 51 +++++++++++++++-------- 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index 62bdd1d..55b5efe 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -23,6 +23,8 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users +enable_title=Enable user(s)? +disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 65ee17e..ce0f120 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -23,6 +23,8 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users +enable_title=Enable user(s)? +disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index c7b6a38..5829394 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -23,6 +23,8 @@ deselect_all=Deseleccionar todo details=Detalles display_only_users_can_manage=Muestra solo usuarios que puedo administrar display_only_enabled_users=Muestra solo usuarios habilitados +enable_title=¿Habilitar usuario (s)? +disable_title=¿Deshabilitar usuario (s)? confirm_enable=Se van a habilitar los usuarios $$users$$ confirm_disable=Se van a deshabilitar los usuarios $$users$$ enable_successful=$$count$$ usuarios habilitados diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 9cba48b..782e7c3 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -23,6 +23,8 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users +enable_title=Enable user(s)? +disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 79ef2b5..869219c 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -19,7 +19,7 @@ import TableLayout from "../components/TableLayout.component"; import UserGroupsDialog from "../components/UserGroupsDialog.component"; import UserRolesDialog from "../components/UserRolesDialog.component"; import Settings from "../models/settings"; -import { saveUsers, updateUsers } from "../models/userHelpers"; +import { saveUsers, updateUsers, getExistingUsers } from "../models/userHelpers"; import snackActions from "../Snackbar/snack.actions"; import { getCompactTextForModels } from "../utils/i18n"; import copyInUserStore from "./copyInUser.store"; @@ -35,7 +35,7 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; - +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; const pageSize = 50; const initialSorting = ["name", "asc"]; @@ -130,6 +130,11 @@ export class ListHybrid extends React.Component { copyUsers: { open: false, }, + disableUsers: { + open: false, + users: [], + action: "", + }, }; } @@ -175,20 +180,12 @@ export class ListHybrid extends React.Component { this.setAssignState("replicateUser", replicateUser); }); - const enableStoreDisposable = enableStore.subscribe(({ users, action }) => { - const message = this.getTranslation(`confirm_${action}`, { - users: getCompactTextForModels(this.context.d2, users, { - i18nKey: "this_and_n_others", - field: "username", - limit: 1, - }), - }); - - snackActions.show({ - message, - action: "confirm", - onActionTouchTap: () => this.setUsersEnableState(users, action), + const enableStoreDisposable = enableStore.subscribe(async ({ users, action }) => { + const existingUsers = await getExistingUsers(this.context.d2, { + fields: ":owner", + filter: "id:in:[" + users.join(",") + "]", }); + this.setState({ disableUsers: { open: true, users: existingUsers, action } }); }); const deleteUserStoreDisposable = deleteUserStore.subscribe(() => this.filterList()); @@ -210,6 +207,8 @@ export class ListHybrid extends React.Component { }; setUsersEnableState = async (users, action) => { + this.setState({ disableUsers: { open: false, users: [], action: "" } }); + const newValue = action === "disable"; const response = await updateUsers(this.context.d2, users, user => { return user.userCredentials.disabled !== newValue ? set("userCredentials.disabled", newValue, user) : null; @@ -234,7 +233,6 @@ export class ListHybrid extends React.Component { () => !value.open && this.filterList({ page: this.state.pager.page }) ); }; - componentWillReceiveProps(newProps) { if (this.props.params.modelType !== newProps.params.modelType) { this.setState({ @@ -382,8 +380,8 @@ export class ListHybrid extends React.Component { if (!this.state.dataRows) return null; const { d2 } = this.context; - const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers } = this.state; - + const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers, disableUsers } = + this.state; const { importUsers } = this.state; const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; const { styles } = this; @@ -461,6 +459,23 @@ export class ListHybrid extends React.Component { /> ) : null} + {disableUsers.open ? ( + this.setUsersEnableState(disableUsers.users, disableUsers.action)} + onCancel={() => this.setState({ disableUsers: { open: false } })} + title={this.getTranslation(`${disableUsers.action}_title`)} + description={this.getTranslation(`confirm_${disableUsers.action}`, { + users: getCompactTextForModels(this.context.d2, disableUsers.users, { + i18nKey: "this_and_n_others", + field: "userCredentials.username", + limit: 1, + }), + })} + saveText={"Confirm"} + /> + ) : null} + {assignUserRoles.open ? ( Date: Mon, 18 Oct 2021 17:12:17 +0200 Subject: [PATCH 025/192] fix some spacing --- public/old-i18n/i18n_module_es.properties | 4 ++-- src/legacy/List/List.component.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 5829394..32c2a6d 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -23,8 +23,8 @@ deselect_all=Deseleccionar todo details=Detalles display_only_users_can_manage=Muestra solo usuarios que puedo administrar display_only_enabled_users=Muestra solo usuarios habilitados -enable_title=¿Habilitar usuario (s)? -disable_title=¿Deshabilitar usuario (s)? +enable_title=¿Habilitar usuario(s)? +disable_title=¿Deshabilitar usuario(s)? confirm_enable=Se van a habilitar los usuarios $$users$$ confirm_disable=Se van a deshabilitar los usuarios $$users$$ enable_successful=$$count$$ usuarios habilitados diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 36399b5..9231d8f 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -36,6 +36,7 @@ import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; + const pageSize = 50; const initialSorting = ["name", "asc"]; @@ -208,7 +209,6 @@ export class ListHybrid extends React.Component { setUsersEnableState = async (users, action) => { this.setState({ disableUsers: { open: false, users: [], action: "" } }); - const newValue = action === "disable"; const response = await updateUsers(this.context.d2, users, user => { return user.userCredentials.disabled !== newValue ? set("userCredentials.disabled", newValue, user) : null; @@ -233,6 +233,7 @@ export class ListHybrid extends React.Component { () => !value.open && this.filterList({ page: this.state.pager.page }) ); }; + componentWillReceiveProps(newProps) { if (this.props.params.modelType !== newProps.params.modelType) { this.setState({ From 5253bb2d5709c5d1f20b65e3857e81f87dae6d8d Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 18 Oct 2021 22:10:59 +0200 Subject: [PATCH 026/192] finished fixing remove users --- public/old-i18n/i18n_module_ar.properties | 1 + public/old-i18n/i18n_module_en.properties | 1 + public/old-i18n/i18n_module_es.properties | 1 + public/old-i18n/i18n_module_fr.properties | 1 + src/legacy/List/List.component.js | 43 ++++++++++++++++++- src/legacy/List/deleteUser.store.js | 32 +++++--------- .../user-list-table/UserListTable.tsx | 8 +++- 7 files changed, 62 insertions(+), 25 deletions(-) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index 62bdd1d..3dda8bd 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -127,6 +127,7 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm +remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 65ee17e..0f87bba 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -127,6 +127,7 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm +remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index c7b6a38..6335f7f 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -127,6 +127,7 @@ extended_filters=Filtros avanzados clear_filters=Quitar todos los filtros table_layout_at_least_one_column=Seleccione al menos una columna confirm=Confirmar +remove_users=¿Eliminar usuario(s)? confirm_delete_users=¿Está seguro de que quiere eliminar los usuarios seleccionados? ($$users$$) users_deleted=Usuarios eliminados con éxito: $$users$$ config_import_export=Importación/Exportación diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 9cba48b..f4e589d 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -127,6 +127,7 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm +remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 140dbe8..8b71882 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -35,6 +35,8 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import { getExistingUsers } from "../models/userHelpers"; const pageSize = 50; @@ -130,6 +132,10 @@ export class ListHybrid extends React.Component { copyUsers: { open: false, }, + removeUsers: { + open: false, + users: [], + }, }; } @@ -191,7 +197,16 @@ export class ListHybrid extends React.Component { }); }); - const deleteUserStoreDisposable = deleteUserStore.subscribe(() => this.filterList()); + const deleteUserStoreDisposable = deleteUserStore.subscribe(async ({ datasets }) => { + if (datasets !== undefined) { + const existingUsers = await getExistingUsers(this.context.d2, { + fields: ":owner", + filter: "id:in:[" + datasets.join(",") + "]", + }); + this.setState({ removeUsers: { open: true, users: existingUsers } }); + } + this.filterList(); + }); const userCopyUserDialogStoreDisposable = copyInUserStore.subscribe(copyUsers => { this.setAssignState("copyUsers", copyUsers); @@ -378,11 +393,19 @@ export class ListHybrid extends React.Component { this.setState({ filters }, this.filterList); }; + _removeUsersSaved = () => { + this.setState({ removeUsers: { open: false, users: [] } }); + deleteUserStore.delete(this.state.removeUsers.users); + }; + + _removeUsersCancel = () => this.setState({ removeUsers: { open: false } }); + render = () => { if (!this.state.dataRows) return null; const { d2 } = this.context; - const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers } = this.state; + const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers, removeUsers } = + this.state; const { importUsers } = this.state; const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; @@ -475,6 +498,22 @@ export class ListHybrid extends React.Component { /> ) : null} + {removeUsers.open ? ( + + ) : null} {assignUserGroups.open ? ( user.username), + users.map(user => user.userCredentials.username), 3, ", " ); - const performDelete = () => { - const payload = { users: users.map(user => ({ id: user.id })) }; - - return api - .post(`metadata?importStrategy=DELETE`, payload) - .then(response => { - snackActions.show({ message: t("users_deleted", { users: usersText }) }); - this.setState(response); - }) - .catch(response => { - snackActions.show({ message: response.message || "Error" }); - }); - }; - - snackActions.show({ - message: t("confirm_delete_users", { users: usersText }), - action: "confirm", - autoHideDuration: 0, - onActionTouchTap: performDelete, - }); + const payload = { users }; + return api + .post(`metadata?importStrategy=DELETE`, payload) + .then(response => { + snackActions.show({ message: t("users_deleted", { users: usersText }) }); + this.setState(response); + }) + .catch(response => { + snackActions.show({ message: response.message || "Error" }); + }); }, }); diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 81c0818..3f81f15 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -33,7 +33,11 @@ export const UserListTable: React.FC = props => { const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); - + /* + onClick: datasets => { + deleteUserStore.setState({ datasets }) + //deleteUserStore.delete(datasets)}, + */ const baseConfig = useMemo((): TableConfig => { return { columns, @@ -115,7 +119,7 @@ export const UserListTable: React.FC = props => { text: i18n.t("Remove"), icon: delete, multiple: true, - onClick: datasets => deleteUserStore.delete(datasets), + onClick: datasets => deleteUserStore.setState({ datasets }), isActive: checkAccess(["delete"]), }, { From 4940037393ab43882a1e78c99807bae2def685fb Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 18 Oct 2021 22:16:33 +0200 Subject: [PATCH 027/192] remove some commented code --- src/webapp/components/user-list-table/UserListTable.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 3f81f15..845a3bf 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -33,11 +33,7 @@ export const UserListTable: React.FC = props => { const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); - /* - onClick: datasets => { - deleteUserStore.setState({ datasets }) - //deleteUserStore.delete(datasets)}, - */ + const baseConfig = useMemo((): TableConfig => { return { columns, From 2e0dad7a80cc05dd0048dc36efa55abe6a9b737e Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 18 Oct 2021 22:18:52 +0200 Subject: [PATCH 028/192] made the onSave and onCancel functions separate and outside of render --- src/legacy/List/List.component.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 9231d8f..ceb89f1 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -377,6 +377,10 @@ export class ListHybrid extends React.Component { this.setState({ filters }, this.filterList); }; + _disableUsersSaved = () => this.setUsersEnableState(this.disableUsers.users, this.disableUsers.action); + + _disableUsersCancel = () => this.setState({ disableUsers: { open: false } }); + render = () => { if (!this.state.dataRows) return null; const { d2 } = this.context; @@ -463,8 +467,8 @@ export class ListHybrid extends React.Component { {disableUsers.open ? ( this.setUsersEnableState(disableUsers.users, disableUsers.action)} - onCancel={() => this.setState({ disableUsers: { open: false } })} + onSave={this._disableUsersSaved} + onCancel={this._disableUsersCancel} title={this.getTranslation(`${disableUsers.action}_title`)} description={this.getTranslation(`confirm_${disableUsers.action}`, { users: getCompactTextForModels(this.context.d2, disableUsers.users, { From c313754a51bceb0c1256b1cdc7c73631bd183623 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 19 Oct 2021 14:44:39 +0200 Subject: [PATCH 029/192] move new translation to i18next --- i18n/en.pot | 3 +++ i18n/es.po | 3 +++ public/old-i18n/i18n_module_ar.properties | 1 - public/old-i18n/i18n_module_en.properties | 1 - public/old-i18n/i18n_module_es.properties | 1 - public/old-i18n/i18n_module_fr.properties | 1 - src/legacy/List/List.component.js | 3 ++- 7 files changed, 8 insertions(+), 5 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 5f20085..897d3c7 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -20,6 +20,9 @@ msgstr "" msgid "Details" msgstr "" +msgid "Remove users" +msgstr "" + msgid "Copy in user" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 83688b6..a0aba0a 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -20,6 +20,9 @@ msgstr "Ayuda" msgid "Details" msgstr "" +msgid "Remove users" +msgstr "Eliminar usuarios" + msgid "Copy in user" msgstr "" diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index 3dda8bd..62bdd1d 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -127,7 +127,6 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm -remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 0f87bba..65ee17e 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -127,7 +127,6 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm -remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 6335f7f..c7b6a38 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -127,7 +127,6 @@ extended_filters=Filtros avanzados clear_filters=Quitar todos los filtros table_layout_at_least_one_column=Seleccione al menos una columna confirm=Confirmar -remove_users=¿Eliminar usuario(s)? confirm_delete_users=¿Está seguro de que quiere eliminar los usuarios seleccionados? ($$users$$) users_deleted=Usuarios eliminados con éxito: $$users$$ config_import_export=Importación/Exportación diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index f4e589d..9cba48b 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -127,7 +127,6 @@ extended_filters=Advanced filters clear_filters=Clear all filters table_layout_at_least_one_column=Select at least one column confirm=Confirm -remove_users=Remove user(s)? confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 8b71882..82e593b 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -37,6 +37,7 @@ import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import { getExistingUsers } from "../models/userHelpers"; +import i18n from "../../locales"; const pageSize = 50; @@ -503,7 +504,7 @@ export class ListHybrid extends React.Component { isOpen={removeUsers.open} onSave={this._removeUsersSaved} onCancel={this._removeUsersCancel} - title={this.getTranslation("remove_users")} + title={i18n.t("Remove users")} description={this.getTranslation("confirm_delete_users", { users: getCompactTextForModels(this.context.d2, this.state.removeUsers.users, { i18nKey: "this_and_n_others", From e86c7bb03e7b0b9c4ca11eacdf3a47e9c3a22bee Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 19 Oct 2021 19:20:53 +0200 Subject: [PATCH 030/192] fixed error and added new translations --- .env | 1 + i18n/en.pot | 6 ++++++ i18n/es.po | 6 ++++++ src/legacy/List/List.component.js | 8 ++++---- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.env b/.env index e99a73e..82781ca 100644 --- a/.env +++ b/.env @@ -2,6 +2,7 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play +REACT_APP_DHIS2_AUTH='admin:district' CYPRESS_DHIS2_AUTH='admin:district' CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" diff --git a/i18n/en.pot b/i18n/en.pot index 5f20085..cae523c 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -20,6 +20,12 @@ msgstr "" msgid "Details" msgstr "" +msgid "disable" +msgstr "Deshabilitar usuarios" + +msgid "enable" +msgstr "Habilitar usuarios" + msgid "Copy in user" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 83688b6..315799e 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -14,6 +14,12 @@ msgstr "" msgid "Back" msgstr "Volver" +msgid "disable" +msgstr "Disable users" + +msgid "enable" +msgstr "Enable users" + msgid "Help" msgstr "Ayuda" diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index ceb89f1..c82d756 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -36,6 +36,7 @@ import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import i18n from "../../locales"; const pageSize = 50; @@ -208,7 +209,6 @@ export class ListHybrid extends React.Component { }; setUsersEnableState = async (users, action) => { - this.setState({ disableUsers: { open: false, users: [], action: "" } }); const newValue = action === "disable"; const response = await updateUsers(this.context.d2, users, user => { return user.userCredentials.disabled !== newValue ? set("userCredentials.disabled", newValue, user) : null; @@ -225,6 +225,7 @@ export class ListHybrid extends React.Component { }); snackActions.show({ message }); } + this.setState({ disableUsers: { open: false, users: [], action: "" } }); }; setAssignState = (key, value) => { @@ -377,7 +378,7 @@ export class ListHybrid extends React.Component { this.setState({ filters }, this.filterList); }; - _disableUsersSaved = () => this.setUsersEnableState(this.disableUsers.users, this.disableUsers.action); + _disableUsersSaved = () => this.setUsersEnableState(this.state.disableUsers.users, this.state.disableUsers.action); _disableUsersCancel = () => this.setState({ disableUsers: { open: false } }); @@ -390,7 +391,6 @@ export class ListHybrid extends React.Component { const { importUsers } = this.state; const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; const { styles } = this; - const allColumns = tableColumns.map(c => ({ text: this.getTranslation(camelCaseToUnderscores(c.name)), value: c.name, @@ -469,7 +469,7 @@ export class ListHybrid extends React.Component { isOpen={disableUsers.open} onSave={this._disableUsersSaved} onCancel={this._disableUsersCancel} - title={this.getTranslation(`${disableUsers.action}_title`)} + title={i18n.t(disableUsers.action)} description={this.getTranslation(`confirm_${disableUsers.action}`, { users: getCompactTextForModels(this.context.d2, disableUsers.users, { i18nKey: "this_and_n_others", From 521a219f4476acfee5875f2ca2e0a689856972a3 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Tue, 19 Oct 2021 19:23:29 +0200 Subject: [PATCH 031/192] removed old translations --- i18n/en.pot | 10 ++-------- i18n/es.po | 14 +++++++------- public/old-i18n/i18n_module_ar.properties | 2 -- public/old-i18n/i18n_module_en.properties | 2 -- public/old-i18n/i18n_module_es.properties | 2 -- public/old-i18n/i18n_module_fr.properties | 2 -- 6 files changed, 9 insertions(+), 23 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index cae523c..aa7c7a8 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-13T07:08:28.546Z\n" -"PO-Revision-Date: 2021-10-13T07:08:28.546Z\n" +"POT-Creation-Date: 2021-10-19T17:21:13.411Z\n" +"PO-Revision-Date: 2021-10-19T17:21:13.411Z\n" msgid "Settings" msgstr "" @@ -20,12 +20,6 @@ msgstr "" msgid "Details" msgstr "" -msgid "disable" -msgstr "Deshabilitar usuarios" - -msgid "enable" -msgstr "Habilitar usuarios" - msgid "Copy in user" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 315799e..d19860d 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-13T07:08:28.546Z\n" +"POT-Creation-Date: 2021-10-19T17:21:13.411Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,12 +14,6 @@ msgstr "" msgid "Back" msgstr "Volver" -msgid "disable" -msgstr "Disable users" - -msgid "enable" -msgstr "Enable users" - msgid "Help" msgstr "Ayuda" @@ -98,6 +92,12 @@ msgstr "" msgid "Disabled" msgstr "" +#~ msgid "disable" +#~ msgstr "Disable users" + +#~ msgid "enable" +#~ msgstr "Enable users" + #~ msgid "Hello {{name}}" #~ msgstr "Hola {{name}}" diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index 55b5efe..62bdd1d 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -23,8 +23,6 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users -enable_title=Enable user(s)? -disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index ce0f120..65ee17e 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -23,8 +23,6 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users -enable_title=Enable user(s)? -disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 32c2a6d..c7b6a38 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -23,8 +23,6 @@ deselect_all=Deseleccionar todo details=Detalles display_only_users_can_manage=Muestra solo usuarios que puedo administrar display_only_enabled_users=Muestra solo usuarios habilitados -enable_title=¿Habilitar usuario(s)? -disable_title=¿Deshabilitar usuario(s)? confirm_enable=Se van a habilitar los usuarios $$users$$ confirm_disable=Se van a deshabilitar los usuarios $$users$$ enable_successful=$$count$$ usuarios habilitados diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 782e7c3..9cba48b 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -23,8 +23,6 @@ deselect_all=Deselect all details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users -enable_title=Enable user(s)? -disable_title=Disable user(s)? confirm_enable=Are you sure you want to enable $$users$$? confirm_disable=Are you sure you want to disable $$users$$? enable_successful=$$count$$ users enabled From f6864cddf7c8a6cce092051be6bd60687438ab00 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 19 Oct 2021 21:19:04 +0200 Subject: [PATCH 032/192] Update dep-check script Signed-off-by: Alexis Rico --- .githooks/dep-check | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.githooks/dep-check b/.githooks/dep-check index fcfd4ba..b72bcdc 100755 --- a/.githooks/dep-check +++ b/.githooks/dep-check @@ -1,6 +1,6 @@ #!/bin/sh -function changed { +changed () { git diff --name-only HEAD@{1} HEAD | grep "^$1" > /dev/null 2>&1 } From 097d426945a9939de4b47394a3bae10e6ab52d1f Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 19 Oct 2021 21:22:14 +0200 Subject: [PATCH 033/192] Fix translations Signed-off-by: Alexis Rico --- i18n/en.pot | 16 +++++++++++----- i18n/es.po | 18 +++++++++++------- src/legacy/List/List.component.js | 19 +++++++++++++------ .../user-list-table/UserListTable.tsx | 2 +- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index a69fc1c..67a1cc0 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,17 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-19T17:21:13.411Z\n" -"PO-Revision-Date: 2021-10-19T17:21:13.411Z\n" +"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" + +msgid "Enable users" +msgstr "" + +msgid "Disable users" +msgstr "" + +msgid "Remove users" +msgstr "" msgid "Settings" msgstr "" @@ -20,9 +29,6 @@ msgstr "" msgid "Details" msgstr "" -msgid "Remove users" -msgstr "" - msgid "Copy in user" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index ca5ccfd..eedd91d 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,13 +1,23 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-19T17:21:13.411Z\n" +"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "Enable users" +msgstr "" + +#, fuzzy +msgid "Disable users" +msgstr "Disable users" + +msgid "Remove users" +msgstr "Eliminar usuarios" + msgid "Settings" msgstr "" @@ -20,9 +30,6 @@ msgstr "Ayuda" msgid "Details" msgstr "" -msgid "Remove users" -msgstr "Eliminar usuarios" - msgid "Copy in user" msgstr "" @@ -95,9 +102,6 @@ msgstr "" msgid "Disabled" msgstr "" -#~ msgid "disable" -#~ msgstr "Disable users" - #~ msgid "enable" #~ msgstr "Enable users" diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 1eb2523..26677e2 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -1,3 +1,4 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; import isIterable from "d2-utilizr/lib/isIterable"; import _ from "lodash"; @@ -8,6 +9,7 @@ import MenuItem from "material-ui/MenuItem"; import ViewColumnIcon from "material-ui/svg-icons/action/view-column"; import PropTypes from "prop-types"; import React from "react"; +import i18n from "../../locales"; import { UserListTable } from "../../webapp/components/user-list-table/UserListTable"; import CopyInUserDialog from "../components/CopyInUserDialog.component"; import ImportExport from "../components/ImportExport.component"; @@ -19,7 +21,7 @@ import TableLayout from "../components/TableLayout.component"; import UserGroupsDialog from "../components/UserGroupsDialog.component"; import UserRolesDialog from "../components/UserRolesDialog.component"; import Settings from "../models/settings"; -import { saveUsers, updateUsers, getExistingUsers } from "../models/userHelpers"; +import { getExistingUsers, saveUsers, updateUsers } from "../models/userHelpers"; import snackActions from "../Snackbar/snack.actions"; import { getCompactTextForModels } from "../utils/i18n"; import copyInUserStore from "./copyInUser.store"; @@ -35,8 +37,6 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; -import i18n from "../../locales"; const pageSize = 50; @@ -406,8 +406,15 @@ export class ListHybrid extends React.Component { if (!this.state.dataRows) return null; const { d2 } = this.context; - const { assignUserRoles, assignUserGroups, replicateUser, listFilterOptions, copyUsers, removeUsers } = - this.state; + const { + assignUserRoles, + assignUserGroups, + replicateUser, + listFilterOptions, + copyUsers, + removeUsers, + disableUsers, + } = this.state; const { importUsers } = this.state; const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; @@ -490,7 +497,7 @@ export class ListHybrid extends React.Component { isOpen={disableUsers.open} onSave={this._disableUsersSaved} onCancel={this._disableUsersCancel} - title={i18n.t(disableUsers.action)} + title={disableUsers.action === "enable" ? i18n.t("Enable users") : i18n.t("Disable users")} description={this.getTranslation(`confirm_${disableUsers.action}`, { users: getCompactTextForModels(this.context.d2, disableUsers.users, { i18nKey: "this_and_n_others", diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 845a3bf..547d029 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -33,7 +33,7 @@ export const UserListTable: React.FC = props => { const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); - + const baseConfig = useMemo((): TableConfig => { return { columns, From 4e1cd7084c5956ff3fa39eedb4155a8f9c0f43fe Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 19 Oct 2021 21:23:02 +0200 Subject: [PATCH 034/192] Remove old translations Signed-off-by: Alexis Rico --- i18n/es.po | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/i18n/es.po b/i18n/es.po index eedd91d..c2b97e5 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -11,10 +11,6 @@ msgstr "" msgid "Enable users" msgstr "" -#, fuzzy -msgid "Disable users" -msgstr "Disable users" - msgid "Remove users" msgstr "Eliminar usuarios" @@ -101,15 +97,3 @@ msgstr "" msgid "Disabled" msgstr "" - -#~ msgid "enable" -#~ msgstr "Enable users" - -#~ msgid "Hello {{name}}" -#~ msgstr "Hola {{name}}" - -#~ msgid "Add" -#~ msgstr "Añadir" - -#~ msgid "List" -#~ msgstr "Listar" From cb8504016cc31ac94b05f446f3ea594bcb727b64 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Thu, 21 Oct 2021 16:20:54 +0200 Subject: [PATCH 035/192] did as much as I could for replicate user in template but i got a HTTP500 for the API call --- .env | 4 +- i18n/en.pot | 3 ++ i18n/es.po | 3 ++ src/legacy/List/List.component.js | 2 +- src/legacy/components/InfoDialog.js | 42 +++++------------- .../ReplicateUserFromTemplate.component.js | 44 +++++-------------- src/legacy/models/user.js | 8 +--- src/legacy/models/userHelpers.js | 1 + 8 files changed, 36 insertions(+), 71 deletions(-) diff --git a/.env b/.env index 82781ca..ba6edae 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play -REACT_APP_DHIS2_AUTH='admin:district' +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 +REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' CYPRESS_DHIS2_AUTH='admin:district' CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" diff --git a/i18n/en.pot b/i18n/en.pot index 67a1cc0..69bcc43 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -14,6 +14,9 @@ msgstr "" msgid "Disable users" msgstr "" +msgid "Replicate error" +msgstr "" + msgid "Remove users" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index c2b97e5..76a3265 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -20,6 +20,9 @@ msgstr "" msgid "Back" msgstr "Volver" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Help" msgstr "Ayuda" diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 26677e2..9fc46b2 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -319,7 +319,7 @@ export class ListHybrid extends React.Component { if (ReplicateComponent) { return ( diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index 0df8f15..06914fa 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -1,17 +1,9 @@ +import React from "react"; import _ from "lodash"; -import { merge } from "lodash/fp"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import PropTypes from "prop-types"; -import React from "react"; -import { CopyToClipboard } from "react-copy-to-clipboard"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; const styles = { - dialog: { - width: "100%", - height: "100%", - }, contents: { fontSize: "0.7em", }, @@ -21,7 +13,7 @@ function prettyJson(obj) { return obj ? JSON.stringify(obj, null, 2) : null; } -const InfoDialog = ({ t, title, style, onClose, response }) => { +const InfoDialog = ({ t, title, onClose, response }) => { const details = _([ t("metadata_error_description"), response.error || "Unknown error", @@ -31,28 +23,19 @@ const InfoDialog = ({ t, title, style, onClose, response }) => { .compact() .join("\n\n"); - const actions = ( - - - - - , - , - - ); - return ( - {navigator.clipboard.writeText(details)}} + saveText={t("copy_to_clipboard")} + cancelText={t("close")} >
{details}
-
+
); }; @@ -65,7 +48,6 @@ InfoDialog.propTypes = { response: PropTypes.object, }).isRequired, onClose: PropTypes.func.isRequired, - style: PropTypes.any, }; export default InfoDialog; diff --git a/src/legacy/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js index df627e3..a3ef913 100644 --- a/src/legacy/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -1,10 +1,7 @@ import React from "react"; import PropTypes from "prop-types"; import _ from "lodash"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; import TextField from "material-ui/TextField/TextField"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; import Validators from "d2-ui/lib/forms/Validators"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; @@ -16,16 +13,8 @@ import { getFromTemplate } from "../utils/template"; import snackActions from "../Snackbar/snack.actions"; import InfoDialog from "./InfoDialog"; import LoadingMask from "../loading-mask/LoadingMask.component"; - -const styles = { - dialog: { - minWidth: 600, - maxWidth: 800, - }, - cancelButton: { - marginRight: 16, - }, -}; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import i18n from "../../locales"; class ReplicateUserFromTemplate extends React.Component { maxUsers = 100; @@ -81,7 +70,6 @@ class ReplicateUserFromTemplate extends React.Component { const n = Math.min(parseInt(usersToCreate) || 1, this.maxUsers); return getFromTemplate(template, n); } - getValidators = () => { return { isRequired: { @@ -138,7 +126,6 @@ class ReplicateUserFromTemplate extends React.Component { const { onRequestClose } = this.props; const { userToReplicate, usersToCreate, username, password } = this.state; const response = await userToReplicate.replicateFromTemplate(usersToCreate, username, password); - if (response.success) { const message = this.getTranslation("replicate_successful", { user: userToReplicate.displayName, @@ -159,14 +146,6 @@ class ReplicateUserFromTemplate extends React.Component { }); const t = this.getTranslation; - const actions = ( - - - , - , - - ); - const fields = [ this.getTextField("usersToCreate", "number", usersToCreate, { validators: [this.validators.isRequired, this.validators.withinInterval(1, this.maxUsers)], @@ -181,21 +160,22 @@ class ReplicateUserFromTemplate extends React.Component { ]; return ( - {!userToReplicate ? : null} {infoDialog ? ( @@ -208,7 +188,7 @@ class ReplicateUserFromTemplate extends React.Component { validateOnRender={validate} validateFullFormOnChanges={true} /> - +
); }; } diff --git a/src/legacy/models/user.js b/src/legacy/models/user.js index 34d229f..d13032d 100644 --- a/src/legacy/models/user.js +++ b/src/legacy/models/user.js @@ -1,7 +1,7 @@ import { pick, merge, unzip, times } from "lodash/fp"; import { generateUid } from "d2/lib/uid"; import { getFromTemplate } from "../utils/template"; -import { parseResponse } from "./userHelpers"; +import { postMetadata, parseResponse } from "./userHelpers"; class User { constructor(d2, attributes) { @@ -74,11 +74,7 @@ class User { users: userGroup.users.concat(newUsers.map(newUser => ({ id: newUser.id }))), })); const payload = { users: newUsers, userGroups: userGroupsWithNewUsers }; - - return this.api - .post("metadata?importStrategy=CREATE_AND_UPDATE&mergeMode=REPLACE", payload) - .then(res => parseResponse(res, payload)) - .catch(error => ({ success: false, error })); + return postMetadata(this.api, payload); } static async getById(d2, userId) { diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 085eedb..05b7c35 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -541,4 +541,5 @@ export { parseResponse, getExistingUsers, getPayload, + postMetadata }; From db93a4c06f76dd36cd547f16f47dd0a1f6bb5dc5 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Thu, 21 Oct 2021 16:40:59 +0200 Subject: [PATCH 036/192] remove react-copy-to-clipboard from packages --- package.json | 1 - yarn.lock | 22 +--------------------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/package.json b/package.json index 5142941..007ceb2 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "purify-ts-extra-codec": "0.6.0", "qs": "6.10.1", "react": "17.0.2", - "react-copy-to-clipboard": "5.0.4", "react-dom": "17.0.2", "react-moment": "1.1.1", "react-router-dom": "5.3.0", diff --git a/yarn.lock b/yarn.lock index fcd2d9d..437f425 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5116,13 +5116,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-to-clipboard@^3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.6.2: version "3.18.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.1.tgz#01942a0877caf9c6e5007c027183cf0bdae6a191" @@ -11788,7 +11781,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -11981,14 +11974,6 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" -react-copy-to-clipboard@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#42ec519b03eb9413b118af92d1780c403a5f19bf" - integrity sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ== - dependencies: - copy-to-clipboard "^3" - prop-types "^15.5.8" - react-dev-utils@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" @@ -13876,11 +13861,6 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" From bbc64f8844a09a555955f169110b070ff66e23d2 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Thu, 21 Oct 2021 19:24:52 +0200 Subject: [PATCH 037/192] did all the updates I could but there is something wrong with how FormBuilder is working with tis updated code in terms of the HTML tags --- src/legacy/List/List.component.js | 2 +- .../components/ImportTable.component.js | 42 ++++++++++-------- src/legacy/components/InfoDialog.js | 44 ++++++------------- 3 files changed, 38 insertions(+), 50 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 26677e2..9fc46b2 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -319,7 +319,7 @@ export class ListHybrid extends React.Component { if (ReplicateComponent) { return ( diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index f80b661..07838ea 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -10,7 +10,12 @@ import FlatButton from "material-ui/FlatButton/FlatButton"; import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn } from "material-ui/Table"; +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@material-ui/core"; +/*import TableBody from 'material-ui/Table/TableBody'; +import TableCell from 'material-ui/Table/TableCell'; +import TableContainer from 'material-ui/Table/TableContainer'; +import TableHead from 'material-ui/Table/TableHead'; +import TableRow from 'material-ui/Table/TableRow';*/ import TextField from "material-ui/TextField/TextField"; import Toggle from "material-ui/Toggle/Toggle"; import memoize from "memoize-weak"; @@ -457,7 +462,7 @@ class ImportTable extends React.Component { validators, }; } else { - const extraProps = { changeEvent: "onBlur" }; + const extraProps = { changeevent: "onBlur" }; return this.getTextField(field, value, { component: TextField, validators, @@ -518,16 +523,16 @@ class ImportTable extends React.Component { const chipText = (index + 1).toString() + (existingUser ? "-E" : ""); return ( - - + + {chipText} - + {children} - + delete - + ); }; @@ -546,9 +551,9 @@ class ImportTable extends React.Component { }; renderTableRowColumn = ({ children }) => { - return {children}; + return {children}; }; - + renderTable = () => { const { d2 } = this.context; const { users } = this.state; @@ -558,27 +563,27 @@ class ImportTable extends React.Component { const getColumnName = header => (_(d2.i18n.translations).has(header) ? this.t(header) : header); return ( -
+ - + - # + # {headers.map(header => ( - + {getColumnName(header)} - + ))} - + - + - {_.map(users.valueSeq().toJS(), user => ( + {_.map(users.valueSeq().toJS(), user => ( ))} +
-
+ ); }; diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index 0df8f15..c266ded 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -1,17 +1,9 @@ +import React from "react"; import _ from "lodash"; -import { merge } from "lodash/fp"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import PropTypes from "prop-types"; -import React from "react"; -import { CopyToClipboard } from "react-copy-to-clipboard"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; const styles = { - dialog: { - width: "100%", - height: "100%", - }, contents: { fontSize: "0.7em", }, @@ -21,7 +13,7 @@ function prettyJson(obj) { return obj ? JSON.stringify(obj, null, 2) : null; } -const InfoDialog = ({ t, title, style, onClose, response }) => { +const InfoDialog = ({ t, title, onClose, response }) => { const details = _([ t("metadata_error_description"), response.error || "Unknown error", @@ -31,28 +23,19 @@ const InfoDialog = ({ t, title, style, onClose, response }) => { .compact() .join("\n\n"); - const actions = ( - - - - - , - , - - ); - return ( - {navigator.clipboard.writeText(details)}} + saveText={t("copy_to_clipboard")} + cancelText={t("close")} >
{details}
-
+
); }; @@ -65,7 +48,6 @@ InfoDialog.propTypes = { response: PropTypes.object, }).isRequired, onClose: PropTypes.func.isRequired, - style: PropTypes.any, }; -export default InfoDialog; +export default InfoDialog; \ No newline at end of file From 8fef709e12e07c335d5e92a0cff0d28a72454506 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Fri, 22 Oct 2021 09:39:31 +0200 Subject: [PATCH 038/192] fixed the details box in ObjectsTable and removed the legacy component --- i18n/es.po | 2 +- public/old-i18n/i18n_module_ar.properties | 1 - public/old-i18n/i18n_module_en.properties | 1 - public/old-i18n/i18n_module_fr.properties | 1 - src/legacy/List/DetailsBox.component.js | 116 ------------------ .../List/DetailsBoxWithScroll.component.js | 40 ------ src/legacy/List/List.component.js | 29 +---- src/legacy/List/details.store.js | 3 - src/legacy/List/list.actions.js | 6 - src/legacy/components/InfoDialog.js | 44 ++----- .../user-list-table/UserListTable.tsx | 16 ++- 11 files changed, 29 insertions(+), 230 deletions(-) delete mode 100644 src/legacy/List/DetailsBox.component.js delete mode 100644 src/legacy/List/DetailsBoxWithScroll.component.js delete mode 100644 src/legacy/List/details.store.js diff --git a/i18n/es.po b/i18n/es.po index c2b97e5..4106227 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -24,7 +24,7 @@ msgid "Help" msgstr "Ayuda" msgid "Details" -msgstr "" +msgstr "Detalles" msgid "Copy in user" msgstr "" diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index 62bdd1d..a25d59d 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -20,7 +20,6 @@ created=Created data_view_organisation_units=OU Output deselect=Deselect deselect_all=Deselect all -details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users confirm_enable=Are you sure you want to enable $$users$$? diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 65ee17e..13c36db 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -20,7 +20,6 @@ created=Created data_view_organisation_units=OU Output deselect=Deselect deselect_all=Deselect all -details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users confirm_enable=Are you sure you want to enable $$users$$? diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 9cba48b..ac8f184 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -20,7 +20,6 @@ created=Created data_view_organisation_units=OU Output deselect=Deselect deselect_all=Deselect all -details=Show details display_only_users_can_manage=Display only users I can manage display_only_enabled_users=Display only active users confirm_enable=Are you sure you want to enable $$users$$? diff --git a/src/legacy/List/DetailsBox.component.js b/src/legacy/List/DetailsBox.component.js deleted file mode 100644 index e51cbf7..0000000 --- a/src/legacy/List/DetailsBox.component.js +++ /dev/null @@ -1,116 +0,0 @@ -import classes from "classnames"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import _ from "lodash"; -import FontIcon from "material-ui/FontIcon/FontIcon"; -import PropTypes from "prop-types"; -import React from "react"; -import Moment from "react-moment"; - -export default class DetailsBox extends React.Component { - static propTypes = { - fields: PropTypes.array, - showDetailBox: PropTypes.bool, - source: PropTypes.object, - onClose: PropTypes.func, - }; - - static contextTypes = { - d2: PropTypes.object.isRequired, - }; - - getTranslation(...args) { - return this.context.d2.i18n.getTranslation(...args); - } - - static defaultProps = { - fields: [ - "name", - "username", - "shortName", - "code", - "displayDescription", - "created", - "lastUpdated", - "lastLogin", - "id", - "href", - "userRoles", - "userGroups", - "organisationUnits", - "dataViewOrganisationUnits", - ], - showDetailBox: false, - onClose: () => {}, - }; - - getDetailBoxContent = () => { - if (!this.props.source) { - return
Loading details...
; - } - - return this.props.fields - .filter(fieldName => this.props.source[fieldName]) - .map(fieldName => { - const valueToRender = this.getValueToRender(fieldName, this.props.source[fieldName]); - - return ( -
-
- {this.getTranslation(camelCaseToUnderscores(fieldName))} -
-
{valueToRender}
-
- ); - }); - }; - - getValueToRender(fieldName, value) { - switch (fieldName) { - case "created": - case "lastUpdated": - case "lastLogin": - return {value}; - case "href": - return ( - - {value} - - ); - case "userRoles": - case "userGroups": - case "organisationUnits": - case "dataViewOrganisationUnits": { - const objs = _(value.toArray ? value.toArray() : value) - .sortBy("displayName") - .value(); - const contents = _(objs).isEmpty() ? ( -
- {this.getTranslation("no_value")} -
- ) : ( - objs.map(obj =>
{obj.displayName}
) - ); - return
{contents}
; - } - default: - return value; - } - } - - render = () => { - const classList = classes("details-box"); - - if (this.props.showDetailBox === false) { - return null; - } - - return ( -
- - close - -
{this.getDetailBoxContent()}
-
- ); - }; -} diff --git a/src/legacy/List/DetailsBoxWithScroll.component.js b/src/legacy/List/DetailsBoxWithScroll.component.js deleted file mode 100644 index 022b021..0000000 --- a/src/legacy/List/DetailsBoxWithScroll.component.js +++ /dev/null @@ -1,40 +0,0 @@ -import React from "react"; -import Paper from "material-ui/Paper/Paper"; -import { Observable } from "rx"; - -import DetailsBox from "./DetailsBox.component"; - -export default class DetailsBoxWithScroll extends React.Component { - componentDidMount = () => { - this.disposable = Observable.fromEvent(global, "scroll") - .debounce(200) - .map(() => document.querySelector("body").scrollTop) - .subscribe(() => this.forceUpdate()); - }; - - componentWillUnmount = () => { - this.disposable && this.disposable.dispose(); - }; - - render = () => { - return ( -
- - - -
- ); - }; -} diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 26677e2..c9f3d65 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -26,8 +26,6 @@ import snackActions from "../Snackbar/snack.actions"; import { getCompactTextForModels } from "../utils/i18n"; import copyInUserStore from "./copyInUser.store"; import deleteUserStore from "./deleteUser.store"; -import detailsStore from "./details.store"; -import DetailsBoxWithScroll from "./DetailsBoxWithScroll.component"; import enableStore from "./enable.store"; import Filters from "./Filters.component"; import listActions from "./list.actions"; @@ -61,17 +59,6 @@ export class ListHybrid extends React.Component { flexDirection: "column", flex: 2, }, - - detailsBoxWrap: { - flex: 1, - marginLeft: "1rem", - marginRight: "1rem", - marginBottom: "1rem", - opacity: 1, - flexGrow: 0, - minWidth: "350px", - }, - listDetailsWrap: { flex: 1, display: "flex", @@ -102,7 +89,6 @@ export class ListHybrid extends React.Component { total: 0, }, isLoading: true, - detailsObject: null, sorting: initialSorting, settingsVisible: false, layoutSettingsVisible: false, @@ -164,10 +150,6 @@ export class ListHybrid extends React.Component { this.registerDisposable(sourceStoreDisposable); }); - const detailsStoreDisposable = detailsStore.subscribe(detailsObject => { - this.setState({ detailsObject }); - }); - const orgUnitAssignmentStoreDisposable = orgUnitDialogStore.subscribe(orgunitassignmentState => { this.setAssignState("orgunitassignment", orgunitassignmentState); }); @@ -209,7 +191,6 @@ export class ListHybrid extends React.Component { this.setAssignState("copyUsers", copyUsers); }); - this.registerDisposable(detailsStoreDisposable); this.registerDisposable(orgUnitAssignmentStoreDisposable); this.registerDisposable(userRolesAssignmentDialogStoreDisposable); this.registerDisposable(userGroupsAssignmentDialogStoreDisposable); @@ -243,7 +224,7 @@ export class ListHybrid extends React.Component { setAssignState = (key, value) => { this.setState( - { [key]: value, detailsObject: null }, + { [key]: value }, () => !value.open && this.filterList({ page: this.state.pager.page }) ); }; @@ -451,14 +432,6 @@ export class ListHybrid extends React.Component { {this.state.dataRows.length || this.state.isLoading ? null :
No results found
}
- - {this.state.detailsObject ? ( - - ) : null}
{this.state.orgunitassignment.open && this.state.orgunitassignment.field === "organisationUnits" ? ( diff --git a/src/legacy/List/details.store.js b/src/legacy/List/details.store.js deleted file mode 100644 index 2203dce..0000000 --- a/src/legacy/List/details.store.js +++ /dev/null @@ -1,3 +0,0 @@ -import Store from "d2-ui/lib/store/Store"; - -export default Store.create(); diff --git a/src/legacy/List/list.actions.js b/src/legacy/List/list.actions.js index b8e786d..f48aac2 100644 --- a/src/legacy/List/list.actions.js +++ b/src/legacy/List/list.actions.js @@ -1,6 +1,5 @@ import Action from "d2-ui/lib/action/Action"; import listStore from "./list.store"; -import detailsStore from "./details.store"; import { Observable } from "rx"; const listActions = Action.createActionsFromNames([ @@ -11,7 +10,6 @@ const listActions = Action.createActionsFromNames([ "loadUserGroups", "getNextPage", "getPreviousPage", - "hideDetailsBox", ]); listActions.setListSource.subscribe(action => { @@ -31,10 +29,6 @@ listActions.getPreviousPage.subscribe(() => { listStore.getPreviousPage(); }); -listActions.hideDetailsBox.subscribe(() => { - detailsStore.setState(null); -}); - listActions.loadUserRoles.subscribe(() => { listStore.getRoles(); }); diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index 0df8f15..c266ded 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -1,17 +1,9 @@ +import React from "react"; import _ from "lodash"; -import { merge } from "lodash/fp"; -import Dialog from "material-ui/Dialog/Dialog"; -import FlatButton from "material-ui/FlatButton/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import PropTypes from "prop-types"; -import React from "react"; -import { CopyToClipboard } from "react-copy-to-clipboard"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; const styles = { - dialog: { - width: "100%", - height: "100%", - }, contents: { fontSize: "0.7em", }, @@ -21,7 +13,7 @@ function prettyJson(obj) { return obj ? JSON.stringify(obj, null, 2) : null; } -const InfoDialog = ({ t, title, style, onClose, response }) => { +const InfoDialog = ({ t, title, onClose, response }) => { const details = _([ t("metadata_error_description"), response.error || "Unknown error", @@ -31,28 +23,19 @@ const InfoDialog = ({ t, title, style, onClose, response }) => { .compact() .join("\n\n"); - const actions = ( - - - - - , - , - - ); - return ( - {navigator.clipboard.writeText(details)}} + saveText={t("copy_to_clipboard")} + cancelText={t("close")} >
{details}
-
+ ); }; @@ -65,7 +48,6 @@ InfoDialog.propTypes = { response: PropTypes.object, }).isRequired, onClose: PropTypes.func.isRequired, - style: PropTypes.any, }; -export default InfoDialog; +export default InfoDialog; \ No newline at end of file diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 547d029..7a697f2 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -24,12 +24,12 @@ import enableStore from "../../../legacy/List/enable.store"; import replicateUserStore from "../../../legacy/List/replicateUser.store"; import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.store"; import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; + import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); - const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); @@ -37,7 +37,19 @@ export const UserListTable: React.FC = props => { const baseConfig = useMemo((): TableConfig => { return { columns, - details: [], + details: [ + { name: "name", text: i18n.t("Name") }, + { name: "username", text: i18n.t("Username") }, + { name: "created", text: i18n.t("Created") }, + { name: "lastUpdated", text: i18n.t("Last updated") }, + { name: "lastLogin", text: i18n.t("Last login") }, + { name: "id", text: i18n.t("ID") }, + { name: "email", text: i18n.t("Email") }, + { name: "userRoles", text: i18n.t("Roles") }, + { name: "userGroups", text: i18n.t("Groups") }, + { name: "organisationUnits", text: i18n.t("OU Capture") }, + { name: "dataViewOrganisationUnits", text: i18n.t("OU Output") }, + ], actions: [ { name: "details", From e03fcca720a21bd2091fadcf8f38814c8b795fa1 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Fri, 22 Oct 2021 10:14:23 +0200 Subject: [PATCH 039/192] updating some spacing stuff --- .env | 4 ++-- src/legacy/components/InfoDialog.js | 4 +++- src/legacy/components/ReplicateUserFromTemplate.component.js | 2 ++ src/legacy/models/user.js | 2 +- src/legacy/models/userHelpers.js | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.env b/.env index ba6edae..82781ca 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 -REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play +REACT_APP_DHIS2_AUTH='admin:district' CYPRESS_DHIS2_AUTH='admin:district' CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index 06914fa..5dc4370 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -30,7 +30,9 @@ const InfoDialog = ({ t, title, onClose, response }) => { maxWidth={"sm"} fullWidth={true} onCancel={onClose} - onSave={() => {navigator.clipboard.writeText(details)}} + onSave={() => { + navigator.clipboard.writeText(details); + }} saveText={t("copy_to_clipboard")} cancelText={t("close")} > diff --git a/src/legacy/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js index a3ef913..bc5e2a5 100644 --- a/src/legacy/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -70,6 +70,7 @@ class ReplicateUserFromTemplate extends React.Component { const n = Math.min(parseInt(usersToCreate) || 1, this.maxUsers); return getFromTemplate(template, n); } + getValidators = () => { return { isRequired: { @@ -126,6 +127,7 @@ class ReplicateUserFromTemplate extends React.Component { const { onRequestClose } = this.props; const { userToReplicate, usersToCreate, username, password } = this.state; const response = await userToReplicate.replicateFromTemplate(usersToCreate, username, password); + if (response.success) { const message = this.getTranslation("replicate_successful", { user: userToReplicate.displayName, diff --git a/src/legacy/models/user.js b/src/legacy/models/user.js index d13032d..1cca920 100644 --- a/src/legacy/models/user.js +++ b/src/legacy/models/user.js @@ -1,7 +1,7 @@ import { pick, merge, unzip, times } from "lodash/fp"; import { generateUid } from "d2/lib/uid"; import { getFromTemplate } from "../utils/template"; -import { postMetadata, parseResponse } from "./userHelpers"; +import { postMetadata } from "./userHelpers"; class User { constructor(d2, attributes) { diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 05b7c35..413dcdb 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -541,5 +541,5 @@ export { parseResponse, getExistingUsers, getPayload, - postMetadata + postMetadata, }; From 503780b63fb76dced2619ed273f6c8f542471335 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 25 Oct 2021 19:07:09 +0200 Subject: [PATCH 040/192] created teh UserBulkEditPage and resolving dependencies --- src/types/d2-ui.d.ts | 51 ++++ src/webapp/hooks/useGoBack.ts | 14 ++ src/webapp/pages/Router.tsx | 5 + .../pages/user-bulk-edit/UserBulkEditPage.tsx | 233 ++++++++++++++++++ 4 files changed, 303 insertions(+) create mode 100644 src/webapp/hooks/useGoBack.ts create mode 100644 src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index c80113f..76c0570 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -1,3 +1,54 @@ declare module "@dhis2/ui" { + export type ButtonProps = { + children?: ReactNode; + className?: string; + dataTest?: string; + destructive?: any; + disabled?: boolean; + icon?: JSX.Element; + initialFocus?: boolean; + large?: any; + name?: string; + primary?: any; + secondary?: any; + small?: any; + tabIndex?: string; + toggled?: boolean; + type?: "submit" | "reset" | "button"; + value?: string; + onBlur?: (data: { value?: string; name?: string }, event: FocusEvent) => void; + onClick?: (data: { value?: string; name?: string }, event: MouseEvent) => void; + onFocus?: (data: { value?: string; name?: string }, event: FocusEvent) => void; + }; + + export type ButtonStripProps = { + children: React.ReactNode; + className?: string; + dataTest?: string; + end?: boolean; + middle?: boolean; + }; + + export type NoticeBoxProps = { + children?: React.ReactNode; + className?: string; + dataTest?: string; + error?: boolean; + title?: string; + warning?: boolean; + }; + + export type CenteredContentProps = { + children?: React.ReactNode; + dataTest?: string; + className?: string; + position?: "top" | "bottom" | "middle"; + }; + export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; + export function Button(props: ButtonProps): React.ReactElement; + export function ButtonStrip(props: ButtonStripProps): React.ReactElement; + export function NoticeBox(props: NoticeBoxProps): React.ReactElement; + export function CenteredContent(props: CenteredContentProps): React.ReactElement; + } diff --git a/src/webapp/hooks/useGoBack.ts b/src/webapp/hooks/useGoBack.ts new file mode 100644 index 0000000..3008c27 --- /dev/null +++ b/src/webapp/hooks/useGoBack.ts @@ -0,0 +1,14 @@ +import { useCallback } from "react"; +import { useHistory } from "react-router-dom"; + +export const useGoBack = (defaultRoute = "/") => { + const history = useHistory(); + + return useCallback( + (force = false) => { + if (force || history.length <= 2) history.push(defaultRoute); + else history.goBack(); + }, + [history, defaultRoute] + ); +}; diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 568f066..6d05871 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -2,6 +2,7 @@ import React from "react"; import { HashRouter, Route, Switch } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; +import { UserBulkEditPage, ActionType } from "./user-bulk-edit/UserBulkEditPage"; export const Router: React.FC = React.memo(() => { return ( @@ -15,6 +16,10 @@ export const Router: React.FC = React.memo(() => { )} /> + } + /> ); diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx new file mode 100644 index 0000000..98f3933 --- /dev/null +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -0,0 +1,233 @@ +import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; +import { useLoading } from "@eyeseetea/d2-ui-components"; +import { Paper } from "@material-ui/core"; +import { Delete, ViewColumn } from "@material-ui/icons"; +import _ from "lodash"; +import { IconButton } from "material-ui"; +import React, { useCallback, useState } from "react"; +import { Form, useForm } from "react-final-form"; +import { Redirect, useLocation } from "react-router"; +import AutoSizer from "react-virtualized-auto-sizer"; +import { VariableSizeGrid as Grid } from "react-window"; +import styled from "styled-components"; +import { MetadataResponse } from "../../../domain/entities/Metadata"; +import { Predictor } from "../../../domain/entities/Predictor"; +import i18n from "../../../locales"; +import { ColumnSelectorDialog } from "../../components/column-selector-dialog/ColumnSelectorDialog"; +import { ImportSummary } from "../../components/import-summary/ImportSummary"; +import { PageHeader } from "../../components/page-header/PageHeader"; +import { RenderPredictorImportField } from "../../components/predictor-form/PredictorForm"; +import { predictorFormFields, getPredictorFieldName } from "../../components/predictor-form/utils"; +import { useAppContext } from "../../contexts/app-context"; +import { useGoBack } from "../../hooks/useGoBack"; + +const rowHeight = (index: number) => (index === 0 ? 30 : 70); +const columnWidth = (index: number) => (index === 0 ? 50 : 250); + +export interface PredictorBulkEditPageProps { + type: ActionType; +} + +export type ActionType = "import" | "bulk-edit"; + +export const UserBulkEditPage: React.FC = ({ type }) => { + const { compositionRoot } = useAppContext(); + const goBack = useGoBack(); + const loading = useLoading(); + + const location = useLocation<{ predictors: Predictor[] }>(); + const [predictors] = React.useState(location.state?.predictors ?? []); + const [summary, setSummary] = useState(); + const [columns, setColumns] = useState(basePredictorColumns); + const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); + + const goHome = useCallback(() => goBack(true), [goBack]); + + const onSubmit = useCallback( + async ({ predictors }: { predictors: Predictor[] }) => { + loading.show(true, i18n.t("Saving predictors")); + const { data = [], error } = await compositionRoot.predictors.save(predictors).runAsync(); + if (error) return error ?? i18n.t("Network error"); + loading.reset(); + + if (_.some(data, foo => foo.status === "ERROR")) { + setSummary(data); + } else { + goHome(); + } + }, + [compositionRoot, goHome, loading] + ); + + if (predictors.length === 0) return ; + + const title = type === "import" ? i18n.t("Import predictors") : i18n.t("Edit predictors"); + const closeSummary = () => setSummary(undefined); + + return ( + + + setColumnSelectorOpen(true)} + style={{ float: "right" }} + > + + + + + {summary ? : null} + + {columnSelectorOpen && ( + setColumnSelectorOpen(false)} + /> + )} + + + + autocomplete="off" + onSubmit={onSubmit} + initialValues={{ predictors }} + render={({ handleSubmit, values, submitError }) => ( + + + + {({ height, width }) => ( + + {Row} + + )} + + + + {submitError && ( + + {submitError} + + )} + + + + + + + + )} + /> + + + ); +}; + +const basePredictorColumns = [ + "id", + "name", + "scheduling.sequence", + "scheduling.variable", + "output", + "generator.expression", +]; + +const MaxHeight = styled.div` + height: 95%; +`; + +const ButtonsRow = styled(ButtonStrip)` + padding: 20px; + + button:focus::after { + border-color: transparent !important; + } +`; + +const Row: React.FC = ({ style, ...props }) => ( +
+ +
+); + +interface RowItemProps { + data: { columns: string[] }; + columnIndex: number; + rowIndex: number; +} + +const RowItem: React.FC = ({ data, columnIndex, rowIndex }) => { + const form = useForm<{ predictors: Predictor[] }>(); + + const headerRow = rowIndex === 0; + const deleteRow = columnIndex === 0; + const row = rowIndex - 1; + const field = data.columns[columnIndex - 1]; + + const removeRow = useCallback(() => { + const original = form.getState().values.predictors; + const predictors = [...original.slice(0, row), ...original.slice(row + 1)]; + form.change("predictors", predictors); + }, [form, row]); + + if (deleteRow) { + return headerRow ? null : ( + + + + + + ); + } + + if (!field) return null; + + if (headerRow) { + return ( + + {getPredictorFieldName(field)} + + ); + } + + return ( + + + + ); +}; + +const Wrapper = styled.div` + margin: 20px; +`; + +const StyledForm = styled.form` + height: 71vh; +`; + +const Container = styled(Paper)` + margin: 20px; + padding: 40px; +`; + +const Item = styled.div` + margin: 4px 0; + padding: 10px; +`; + +const Title = styled.b``; From 358162fc3b7d5ebba2cd1a08e13ba57e4785c13e Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 4 Nov 2021 08:21:29 +0100 Subject: [PATCH 041/192] Update ImportTable.component.js --- src/legacy/components/ImportTable.component.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index 07838ea..37f52e1 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -11,11 +11,6 @@ import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@material-ui/core"; -/*import TableBody from 'material-ui/Table/TableBody'; -import TableCell from 'material-ui/Table/TableCell'; -import TableContainer from 'material-ui/Table/TableContainer'; -import TableHead from 'material-ui/Table/TableHead'; -import TableRow from 'material-ui/Table/TableRow';*/ import TextField from "material-ui/TextField/TextField"; import Toggle from "material-ui/Toggle/Toggle"; import memoize from "memoize-weak"; From 31880ef53d10d9cba663f2de68c614de57abace8 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 5 Nov 2021 09:27:31 +0100 Subject: [PATCH 042/192] Fix layout changes for import table Signed-off-by: Alexis Rico --- i18n/es.po | 3 + src/legacy/components/AsyncValidatorRunner.js | 100 ++++ .../components/FormBuilder.component.js | 506 ++++++++++++++++++ .../components/ImportTable.component.js | 13 +- src/legacy/components/InfoDialog.js | 6 +- 5 files changed, 619 insertions(+), 9 deletions(-) create mode 100644 src/legacy/components/AsyncValidatorRunner.js create mode 100644 src/legacy/components/FormBuilder.component.js diff --git a/i18n/es.po b/i18n/es.po index c2b97e5..d7cd976 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -11,6 +11,9 @@ msgstr "" msgid "Enable users" msgstr "" +msgid "Disable users" +msgstr "" + msgid "Remove users" msgstr "Eliminar usuarios" diff --git a/src/legacy/components/AsyncValidatorRunner.js b/src/legacy/components/AsyncValidatorRunner.js new file mode 100644 index 0000000..37587b4 --- /dev/null +++ b/src/legacy/components/AsyncValidatorRunner.js @@ -0,0 +1,100 @@ +import { Observable, Subject } from "rxjs"; + +/** + * Run `validatorFunctions` in parallel and returns a resolved `Promise` with the validation status. + * @param {function:Promise[]} validatorFunctions Array of validator functions that return a Promise. + * @param {*} value The value that should be checked by the given validators + * @returns {Promise.} Resolves promise with `{ isValid: true }` when validators passed + * or with `{ isValid: false, message: ''`} when one of the validators failed. The `message` property + * contains the value that the failed validator function rejected with. + */ +function runValidatorFunctions(validatorFunctions, value) { + return ( + Promise.all(validatorFunctions.map(validator => validator.call(null, value))) + // All validators passed + .then(() => ({ isValid: true })) + // When one of the validators failed a failure status with error message are emitted + .catch(errorMessage => ({ isValid: false, message: errorMessage })) + ); +} + +/** + * + */ +export default class AsyncValidatorRunner { + /** + * + * @param {Rx.Scheduler} [scheduler] Optional scheduler to be used for the Rx methods that can accept one. + */ + constructor(scheduler) { + // Rx.Scheduler to be used to run the operations on + this.scheduler = scheduler; + + // Rx.Subject that will serve as the validator pipeline + // The Runner passes the fields and values and emits + // success + this.validatorPipeline = new Subject(); + + // The amount of time to be used for debouncing the field values + this.debounceTimeInMs = 400; + } + + /** + * Run the `asyncValidators` passed for the field with `fieldName`. `fieldName` is only + * used to pass through to the result so `listenToValidatorsFor` can identify which field + * the result belong to. + * + * @param {string} fieldName The name of the field + * @param {Array} asyncValidators An array of functions that each return a Promise thar resolves on valid + * and rejects on failure. + * @param {*} value The value that should be checked for validity. + * + * @returns {AsyncValidatorObject} Returns itself for chaining purposes + */ + run(fieldName, asyncValidators = [], value) { + this.validatorPipeline.next({ fieldName, asyncValidators, value }); + + return this; + } + + /** + * Returns an Rx.Observable that can be subscribed to to be updated of validation results for the field + * with `fieldName`. This function when subscribing runs the validators that are passed for the given field when + * `run` was called. This allows for only running the validators that are at the time the validation request was + * issued were applicable to the field. + * + * @param {string} fieldName The name of the field to filter statuses for. + * @returns {Rx.Observable} Observable that represents validation results for the given `fieldName`. + */ + listenToValidatorsFor(fieldName) { + return ( + this.validatorPipeline + // Filter the values by fieldName to make sure we only deal with the values for the requested field + .filter(field => field.fieldName === fieldName) + // Only process the latest value within the specified time window + .debounceTime(this.debounceTimeInMs, this.scheduler) + // .do((v) => console.log(v.value)) + .map(field => { + return Observable.fromPromise(runValidatorFunctions(field.asyncValidators, field.value)).map( + status => { + return Object.assign(status, { fieldName: field.fieldName, value: field.value }); + } + ); + }) + // Flatten all observables in the correct order they should be processed + .concatAll() + ); + // .do((v) => console.log(v)); + } + + /** + * Creates an instance of the AsyncValidatorRunner class + * + * @param {Rx.Scheduler} scheduler A scheduler to be used while running the pipeline operations + * @returns {AsyncValidatorRunner} The instantiated runner + * @static + */ + static create(scheduler) { + return new AsyncValidatorRunner(scheduler); + } +} diff --git a/src/legacy/components/FormBuilder.component.js b/src/legacy/components/FormBuilder.component.js new file mode 100644 index 0000000..41fffcd --- /dev/null +++ b/src/legacy/components/FormBuilder.component.js @@ -0,0 +1,506 @@ +import { isObject } from "lodash"; +import CircularProgress from "material-ui/CircularProgress"; +import PropTypes from "prop-types"; +import React from "react"; +import AsyncValidatorRunner from "./AsyncValidatorRunner"; + +const noop = () => {}; + +class FormBuilder extends React.Component { + constructor(props) { + super(props); + + this.state = this.initState(props); + this.asyncValidators = this.createAsyncValidators(props); + this.asyncValidationRunner = props.asyncValidationRunner || new AsyncValidatorRunner(); + + this.getFieldProp = this.getFieldProp.bind(this); + this.getStateClone = this.getStateClone.bind(this); + } + + /** + * Run sync validation when props.validateOnRender is enabled. + * + * @param props + */ + runValidation(props) { + const stateClone = this.getStateClone(); + const isValid = props.fields.reduce((accIsValid, field) => { + const fieldName = field.name; + + // Cancel async validators in progress (if any) + if (this.asyncValidators[fieldName]) { + this.cancelAsyncValidators(fieldName); + this.setState(this.updateFieldState(stateClone, fieldName, { validating: false })); + } + + // Run synchronous validators + const validatorResult = this.validateField(stateClone, fieldName, field.value); + return accIsValid && validatorResult === true; + }, true); + + stateClone.form.valid = isValid; + stateClone.form.validating = false; + props.onUpdateFormStatus(stateClone.form); + this.setState(stateClone); + return true; + } + + /** + * Called by React when the component receives new props, but not on the initial render. + * + * State is calculated based on the incoming props, in such a way that existing form fields + * are updated as necessary, but not overridden. See the initState function for details. + * + * @param props + */ + componentWillReceiveProps(props) { + if (props.validateOnRender) { + this.validateProps(props); + } + } + + componentDidMount() { + if (this.props.validateOnInitialRender) { + this.validateProps(this.props); + } + } + + validateProps(props) { + this.asyncValidators = this.createAsyncValidators(props); + + const clonedState = this.getStateClone(); + + props.fields + // Only check fields that are set on the component state + .filter(field => this.state && this.state.fields && this.state.fields[field.name]) + // Filter out fields where the values changed + .filter(field => props.validateFullFormOnChanges || field.value !== this.state.fields[field.name].value) + // Change field value and run validators for the field + .forEach(field => { + clonedState.fields[field.name].value = field.value; + this.validateField(clonedState, field.name, field.value); + }); + + this.props.onUpdateFormStatus(clonedState.form); + this.setState(clonedState); + } + + /** + * Custom state deep copy function + * + * @returns {{form: {pristine: (boolean), valid: (boolean), validating: (boolean)}, fields: *}} + */ + getStateClone() { + return { + form: { + pristine: this.state.form.pristine, + valid: this.state.form.valid, + validating: this.state.form.validating, + }, + fields: Object.keys(this.state.fields).reduce((p, c) => { + p[c] = { + pristine: this.state.fields[c].pristine, + validating: this.state.fields[c].validating, + valid: this.state.fields[c].valid, + value: this.state.fields[c].value, + error: this.state.fields[c].error, + }; + return p; + }, {}), + }; + } + + /** + * Render the form fields. + * + * @returns {*} An array containing markup for each form field + */ + renderFields() { + const styles = { + field: { + position: "relative", + }, + progress: this.props.validatingProgressStyle, + validatingErrorStyle: { + color: "orange", + }, + }; + + return this.props.fields.map(field => { + const { errorTextProp, changeEvent, ...props } = field.props || {}; + const fieldState = this.state.fields[field.name] || {}; + + const changeHandler = this.handleFieldChange.bind(this, field.name); + + const onBlurChangeHandler = + changeEvent === "onBlur" + ? e => { + const stateClone = this.updateFieldState(this.getStateClone(), field.name, { + value: e.target.value, + }); + this.validateField(stateClone, field.name, e.target.value); + this.setState(stateClone); + } + : undefined; + + const errorText = + fieldState && fieldState.validating + ? field.validatingLabelText || this.props.validatingLabelText + : errorTextProp; + + const FieldWrapperComponent = this.props.fieldWrapper || "div"; + + return ( + + {fieldState.validating ? ( + + ) : undefined} + + + ); + }); + } + + /** + * Render the component + * + * @returns {XML} + */ + render() { + const { id, mainWrapper } = this.props; + const MainWrapperComponent = mainWrapper || "div"; + return ( + + {this.renderFields()} + + ); + } + + /** + * Calculates initial state based on the provided props and the existing state, if any. + * + * @param props + * @returns {{form: {pristine: (boolean), valid: (boolean), validating: (boolean)}, fields: *}} + */ + initState(props) { + const state = { + fields: props.fields.reduce((fields, field) => { + const currentFieldState = this.state && this.state.fields && this.state.fields[field.name]; + return Object.assign(fields, { + [field.name]: { + value: + currentFieldState !== undefined && !currentFieldState.pristine + ? currentFieldState.value + : field.value, + pristine: currentFieldState !== undefined ? currentFieldState.value === field.value : true, + validating: currentFieldState !== undefined ? currentFieldState.validating : false, + valid: currentFieldState !== undefined ? currentFieldState.valid : true, + error: currentFieldState && currentFieldState.error, + }, + }); + }, {}), + }; + state.form = { + pristine: Object.keys(state.fields).reduce((p, c) => p && state.fields[c].pristine, true), + validating: Object.keys(state.fields).reduce((p, c) => p || state.fields[c].validating, false), + valid: Object.keys(state.fields).reduce((p, c) => p && state.fields[c].valid, true), + }; + return state; + } + + /** + * Create an object with a property for each field that has async validators, which is later used + * to store Rx.Observable's for any currently running async validators + * + * @param props + * @returns {*} + */ + createAsyncValidators(props) { + return props.fields + .filter(field => Array.isArray(field.asyncValidators) && field.asyncValidators.length) + .reduce((p, currentField) => { + p[currentField.name] = (this.asyncValidators && this.asyncValidators[currentField.name]) || undefined; + return p; + }, {}); + } + + /** + * Cancel the currently running async validators for the specified field name, if any. + * + * @param fieldName + */ + cancelAsyncValidators(fieldName) { + if (this.asyncValidators[fieldName]) { + this.asyncValidators[fieldName].dispose(); + this.asyncValidators[fieldName] = undefined; + } + } + + /** + * Utility method to mutate the provided state object in place + * + * @param state A state object + * @param fieldName A valid field name + * @param fieldState Mutations to apply to the specified field name + * @returns {*} A reference to the mutated state object for chaining + */ + updateFieldState(state, fieldName, fieldState) { + const fieldProp = this.getFieldProp(fieldName); + state.fields[fieldName] = { + pristine: + fieldState.pristine !== undefined + ? !!fieldState.pristine + : state.fields[fieldName].value === fieldProp.value, + validating: + fieldState.validating !== undefined ? !!fieldState.validating : state.fields[fieldName].validating, + valid: fieldState.valid !== undefined ? !!fieldState.valid : state.fields[fieldName].valid, + error: fieldState.error, + value: fieldState.value !== undefined ? fieldState.value : state.fields[fieldName].value, + }; + + // Form state is a composite of field states + const fieldNames = Object.keys(state.fields); + state.form = { + pristine: fieldNames.reduce((p, current) => { + return p && state.fields[current].pristine; + }, true), + validating: fieldNames.reduce((p, current) => { + return p || state.fields[current].validating; + }, false), + valid: fieldNames.reduce((p, current) => { + return p && state.fields[current].valid; + }, true), + }; + + return state; + } + + /** + * Field value change event + * + * This is called whenever the value of the specified field has changed. This will be the onChange event handler, unless + * the changeEvent prop for this field is set to 'onBlur'. + * + * The change event is processed as follows: + * + * - If the value hasn't actually changed, processing stops + * - The field status is set to [not pristine] + * - Any currently running async validators are cancelled + * + * - All synchronous validators are called in the order specified + * - If a validator fails: + * - The field status is set to invalid + * - The field error message is set to the error message for the validator that failed + * - Processing stops + * + * - If all synchronous validators pass: + * - The field status is set to [valid] + * - If there are NO async validators for the field: + * - The onUpdateField callback is called, and processing is finished + * + * - If there ARE async validators for the field: + * - All async validators are started immediately + * - The field status is set to [valid, validating] + * - The validators keep running asynchronously, but the handleFieldChange function terminates + * + * - The async validators keep running in the background until ONE of them fail, or ALL of them succeed: + * - The first async validator to fail causes all processing to stop: + * - The field status is set to [invalid, not validating] + * - The field error message is set to the value that the validator rejected with + * - If all async validators complete successfully: + * - The field status is set to [valid, not validating] + * - The onUpdateField callback is called + * + * @param fieldName The name of the field that changed. + * @param event An event object. Only `event.target.value` is used. + */ + handleFieldChange(fieldName, event) { + const newValue = event.target.value; + + const field = this.getFieldProp(fieldName); + + // If the field has changeEvent=onBlur the change handler is triggered whenever the field loses focus. + // So if the value didn't actually change, abort the change handler here. + if (field.props && field.props.changeEvent === "onBlur" && newValue === field.value) { + return; + } + + // Using custom clone function to maximize speed, albeit more error prone + const stateClone = this.getStateClone(); + + // Update value, and set pristine to false + this.setState(this.updateFieldState(stateClone, fieldName, { pristine: false, value: newValue }), () => { + if (!isObject(newValue) && newValue === (field.value ? field.value : "")) { + this.props.onUpdateField(fieldName, newValue); + return; + } + + // Cancel async validators in progress (if any) + if (this.asyncValidators[fieldName]) { + this.cancelAsyncValidators(fieldName); + this.setState(this.updateFieldState(stateClone, fieldName, { validating: false })); + } + + // Run synchronous validators + const validatorResult = this.validateField(stateClone, fieldName, newValue); + + // Async validators - only run if sync validators pass + if (validatorResult === true) { + this.runAsyncValidators(field, stateClone, fieldName, newValue); + } else { + // Sync validators failed set field status to false + this.setState( + this.updateFieldState(stateClone, fieldName, { valid: false, error: validatorResult }), + () => { + // Also emit when the validator result is false + this.props.onUpdateFormStatus(this.state.form); + this.props.onUpdateField(fieldName, newValue); + } + ); + } + }); + } + + runAsyncValidators(field, stateClone, fieldName, newValue) { + if ((field.asyncValidators || []).length > 0) { + // Set field and form state to 'validating' + this.setState(this.updateFieldState(stateClone, fieldName, { validating: true }), () => { + this.props.onUpdateFormStatus(this.state.form); + this.props.onUpdateField(fieldName, newValue); + + // TODO: Subscription to validation results could be done once in `componentDidMount` and be + // disposed in the `componentWillUnmount` method. This way we don't have to create the + // subscription every time the field is changed. + this.asyncValidators[fieldName] = this.asyncValidationRunner + .listenToValidatorsFor(fieldName) + .subscribe(status => { + this.setState( + this.updateFieldState(this.getStateClone(), status.fieldName, { + validating: false, + valid: status.isValid, + error: status.message, + }), + () => { + this.cancelAsyncValidators(status.fieldName); + this.props.onUpdateFormStatus(this.state.form); + } + ); + }); + + this.asyncValidationRunner.run(fieldName, field.asyncValidators, newValue); + }); + } else { + this.setState(this.updateFieldState(stateClone, fieldName, { valid: true }), () => { + this.props.onUpdateFormStatus(this.state.form); + this.props.onUpdateField(fieldName, newValue); + }); + } + } + + /** + * Run all synchronous validators (if any) for the field and value, and update the state clone depending on the + * outcome + * + * @param stateClone A clone of the current state + * @param fieldName The name of the field to validate + * @param newValue The value to validate + * @returns {true|String} The error message from the first validator that fails, or true if they all pass + */ + validateField(stateClone, fieldName, newValue) { + const field = this.getFieldProp(fieldName); + + const validatorResult = (field.validators || []).reduce((pass, currentValidator) => { + if (pass !== true) { + return pass; + } else { + const validatorResult = currentValidator.validator(newValue, this.props.id); + return validatorResult === true ? true : currentValidator.message || validatorResult; + } + }, true); + + this.updateFieldState(stateClone, fieldName, { + valid: validatorResult === true, + error: validatorResult === true ? undefined : validatorResult, + }); + + return validatorResult; + } + + /** + * Retreive the field that has the specified field name + * + * @param fieldName + * @returns {} + */ + getFieldProp(fieldName) { + return this.props.fields.filter(f => f.name === fieldName)[0]; + } +} + +/** + * Component prop types + * @type {{fields: (Object|isRequired), validatingLabelText: *, validatingProgressStyle: *, onUpdateField: (Function|isRequired)}} + */ +FormBuilder.propTypes = { + id: PropTypes.any, + fields: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string.isRequired, + value: PropTypes.any, + component: PropTypes.func.isRequired, + props: PropTypes.shape({ + changeEvent: PropTypes.oneOf(["onChange", "onBlur"]), + }), + validators: PropTypes.arrayOf( + PropTypes.shape({ + validator: PropTypes.func.isRequired, + message: PropTypes.string, + }) + ), + asyncValidators: PropTypes.arrayOf(PropTypes.func.isRequired), + validatingLabelText: PropTypes.string, + }) + ).isRequired, + validatingLabelText: PropTypes.string, + validatingProgressStyle: PropTypes.object, + onUpdateField: PropTypes.func.isRequired, + onUpdateFormStatus: PropTypes.func, + style: PropTypes.object, + fieldWrapStyle: PropTypes.object, + fieldWrapper: PropTypes.func, + mainWrapper: PropTypes.func, + validateOnRender: PropTypes.bool, + validateOnInitialRender: PropTypes.bool, + validateFullFormOnChanges: PropTypes.bool, +}; + +/** + * Default values for optional props + * @type {{validatingLabelText: string, validatingProgressStyle: {position: string, right: number, top: number}}} + */ +FormBuilder.defaultProps = { + id: null, + validatingLabelText: "Validating...", + validatingProgressStyle: { + position: "absolute", + right: -12, + top: 16, + }, + onUpdateFormStatus: noop, + validateOnRender: false, + validateOnInitialRender: false, + validateFullFormOnChanges: false, +}; + +export default FormBuilder; diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index 37f52e1..6820a93 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -1,4 +1,4 @@ -import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; +import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@material-ui/core"; import Validators from "d2-ui/lib/forms/Validators"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; import { generateUid } from "d2/lib/uid"; @@ -10,7 +10,6 @@ import FlatButton from "material-ui/FlatButton/FlatButton"; import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@material-ui/core"; import TextField from "material-ui/TextField/TextField"; import Toggle from "material-ui/Toggle/Toggle"; import memoize from "memoize-weak"; @@ -21,6 +20,7 @@ import { fieldImportSuffix, getExistingUsers } from "../models/userHelpers"; import { getModelValuesByField, getOrgUnitsRoots } from "../utils/dhis2Helpers"; import { getCompactTextForModels } from "../utils/i18n"; import { toBuilderValidator, validatePassword, validateUsername } from "../utils/validators"; +import FormBuilder from "./FormBuilder.component"; import InfoDialog from "./InfoDialog"; import ModalLoadingMask from "./ModalLoadingMask.component"; import MultipleSelector from "./MultipleSelector.component"; @@ -43,7 +43,7 @@ const styles = { overflow: "visible", }, addRowButton: { - marginTop: 20, + margin: 20, textAlign: "center", }, dialogIcons: { @@ -518,7 +518,7 @@ class ImportTable extends React.Component { const chipText = (index + 1).toString() + (existingUser ? "-E" : ""); return ( - + {chipText} @@ -548,7 +548,7 @@ class ImportTable extends React.Component { renderTableRowColumn = ({ children }) => { return {children}; }; - + renderTable = () => { const { d2 } = this.context; const { users } = this.state; @@ -578,7 +578,7 @@ class ImportTable extends React.Component { - {_.map(users.valueSeq().toJS(), user => ( + {_.map(users.valueSeq().toJS(), user => ( ))} - diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index c266ded..5dc4370 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -30,7 +30,9 @@ const InfoDialog = ({ t, title, onClose, response }) => { maxWidth={"sm"} fullWidth={true} onCancel={onClose} - onSave={() => {navigator.clipboard.writeText(details)}} + onSave={() => { + navigator.clipboard.writeText(details); + }} saveText={t("copy_to_clipboard")} cancelText={t("close")} > @@ -50,4 +52,4 @@ InfoDialog.propTypes = { onClose: PropTypes.func.isRequired, }; -export default InfoDialog; \ No newline at end of file +export default InfoDialog; From e463d65ff709dea69896e10318f500025d16815a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 5 Nov 2021 23:08:32 +1300 Subject: [PATCH 043/192] fix Edit user url has undefined as the user id --- src/legacy/List/context.actions.js | 3 ++- src/webapp/components/user-list-table/UserListTable.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/legacy/List/context.actions.js b/src/legacy/List/context.actions.js index 65cc6da..4ad9115 100644 --- a/src/legacy/List/context.actions.js +++ b/src/legacy/List/context.actions.js @@ -31,8 +31,9 @@ function lexicographicalCompare(xs, ys) { return _(xs).zipWith(ys, compare).find() || 0; } -export async function goToUserEditPage(user) { +export async function goToUserEditPage(userId) { const d2 = await getD2(); + const user = (await d2.models.users.list({ filter: `id:in:[${userId}]` })).toArray().pop(); const baseUrl = d2.system.systemInfo.contextPath; const { major, minor } = d2.system.version; // DHIS2 >= 2.30 uses a new React user-app diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 7a697f2..8d1eb85 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -103,7 +103,7 @@ export const UserListTable: React.FC = props => { text: i18n.t("Edit"), icon: edit, multiple: false, - onClick: user => goToUserEditPage(user), + onClick: ([userId]) => goToUserEditPage(userId), isActive: checkAccess(["update"]), }, { From ec151b7b41df51042c3b7684302f5e8b98e94f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Sat, 6 Nov 2021 00:53:31 +1300 Subject: [PATCH 044/192] fix Add api url in the details box --- src/data/repositories/UserD2ApiRepository.ts | 1 + src/domain/entities/User.ts | 1 + src/webapp/components/user-list-table/UserListTable.tsx | 2 ++ 3 files changed, 4 insertions(+) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 2fa61f3..b5cf0a0 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -63,6 +63,7 @@ export class UserD2ApiRepository implements UserRepository { created: new Date(user.created), userGroups: user.userGroups, username: user.userCredentials.username, + apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, userRoles: user.userCredentials.userRoles, lastLogin: new Date(user.userCredentials.lastLogin), disabled: user.userCredentials.disabled, diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 6edcace..949c35b 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -10,6 +10,7 @@ export interface User { email: string; lastUpdated: Date; created: Date; + apiUrl: string; userRoles: UserRole[]; userGroups: NamedRef[]; organisationUnits: NamedRef[]; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 8d1eb85..df45377 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -44,6 +44,7 @@ export const UserListTable: React.FC = props => { { name: "lastUpdated", text: i18n.t("Last updated") }, { name: "lastLogin", text: i18n.t("Last login") }, { name: "id", text: i18n.t("ID") }, + { name: "apiUrl", text: i18n.t("Api URL") }, { name: "email", text: i18n.t("Email") }, { name: "userRoles", text: i18n.t("Roles") }, { name: "userGroups", text: i18n.t("Groups") }, @@ -211,6 +212,7 @@ export const columns: TableColumn[] = [ { name: "email", sortable: true, text: i18n.t("Email") }, { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, + { name: "apiUrl", sortable: false, text: i18n.t("Api URL"), hidden: true }, { name: "userRoles", sortable: false, text: i18n.t("Roles"), hidden: true }, { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, From 049cb772bd4ac0b3be21893f38e4eed984fd8ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Sun, 7 Nov 2021 20:46:22 +1300 Subject: [PATCH 045/192] added 500 and 1000 options in paging --- src/webapp/components/user-list-table/UserListTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index df45377..50d5ef5 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -168,7 +168,7 @@ export const UserListTable: React.FC = props => { }, }, paginationOptions: { - pageSizeOptions: [10, 25, 50, 100], + pageSizeOptions: [10, 25, 50, 100, 500, 1000], pageSizeInitialValue: 25, }, searchBoxLabel: i18n.t("Search by name"), From 21517533cb812d9435561de85763e00231d7b78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Sun, 7 Nov 2021 21:48:00 +1300 Subject: [PATCH 046/192] show N/A when lastLogin date is undefined --- src/data/repositories/UserD2ApiRepository.ts | 4 +++- src/domain/entities/User.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index b5cf0a0..d1dd668 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -53,6 +53,8 @@ export class UserD2ApiRepository implements UserRepository { } private mapUser(user: D2ApiUser): User { + const lastLogin = user.userCredentials.lastLogin; + return { id: user.id, name: user.displayName, @@ -65,7 +67,7 @@ export class UserD2ApiRepository implements UserRepository { username: user.userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, userRoles: user.userCredentials.userRoles, - lastLogin: new Date(user.userCredentials.lastLogin), + lastLogin: lastLogin === undefined ? "N/A" : new Date(lastLogin), disabled: user.userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 949c35b..00012d5 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -15,7 +15,7 @@ export interface User { userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date; + lastLogin: Date | string; disabled: boolean; access: AccessPermissions; } From 5ac53c484a9b94f224ef03fa3ea85a0a4198009c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Tue, 9 Nov 2021 02:28:22 +1300 Subject: [PATCH 047/192] fixed Replicate from template number change --- .../components/ReplicateUserFromTemplate.component.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/legacy/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js index bc5e2a5..b9611cc 100644 --- a/src/legacy/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -27,12 +27,12 @@ class ReplicateUserFromTemplate extends React.Component { this.validators = this.getValidators(); this.state = { - isValid: false, + isValid: true, usersToCreate: 1, username: "", password: "", existingUsernames: null, - validate: false, + validate: true, infoDialog: null, }; } @@ -57,7 +57,8 @@ class ReplicateUserFromTemplate extends React.Component { }; onUpdateFormStatus = formStatus => { - const isValid = !formStatus.asyncValidating && formStatus.valid; + const asyncValidating = "asyncValidating" in formStatus && formStatus.asyncValidating; + const isValid = !asyncValidating && formStatus.valid; this.setState({ isValid, validate: false }); }; @@ -170,7 +171,7 @@ class ReplicateUserFromTemplate extends React.Component { onSave={this.onSave} saveText={t("replicate")} onCancel={onRequestClose} - disableSave={isValid} + disableSave={!isValid} > {!userToReplicate ? : null} From ccc4be4ab7201aa1588bb667ae397ec8d8ed3a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 11 Nov 2021 21:42:42 +1300 Subject: [PATCH 048/192] pass api to the components --- src/webapp/pages/Router.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 568f066..ea0a258 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -2,8 +2,11 @@ import React from "react"; import { HashRouter, Route, Switch } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; +import { useAppContext } from "../contexts/app-context"; export const Router: React.FC = React.memo(() => { + const { api } = useAppContext(); + return ( @@ -11,7 +14,7 @@ export const Router: React.FC = React.memo(() => { path="/" render={() => ( - + )} /> From 1bbf336f7ca41057431a18b8cf821805c19cbc03 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 11:16:53 +0100 Subject: [PATCH 049/192] Add open id column Signed-off-by: Alexis Rico --- src/data/repositories/UserD2ApiRepository.ts | 2 ++ src/domain/entities/User.ts | 1 + src/legacy/models/userHelpers.js | 1 + src/webapp/components/user-list-table/UserListTable.tsx | 1 + 4 files changed, 5 insertions(+) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 2fa61f3..4b111a0 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -69,6 +69,7 @@ export class UserD2ApiRepository implements UserRepository { organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, access: user.access, + openId: user.userCredentials.openId ?? "", }; } } @@ -87,6 +88,7 @@ const fields = { userRoles: { id: true, name: true, authorities: true }, lastLogin: true, disabled: true, + openId: true, }, organisationUnits: { id: true, name: true }, dataViewOrganisationUnits: { id: true, name: true }, diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 6edcace..ae75993 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -17,6 +17,7 @@ export interface User { lastLogin: Date; disabled: boolean; access: AccessPermissions; + openId: string; } export interface UserRole extends NamedRef { diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 413dcdb..92acf24 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -159,6 +159,7 @@ function getPlainUser(user, { orgUnitsField }) { organisationUnits: namesFromCollection(user.organisationUnits, orgUnitsField), dataViewOrganisationUnits: namesFromCollection(user.dataViewOrganisationUnits, orgUnitsField), disabled: userCredentials.disabled, + openId: userCredentials.openId, }; } diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 7a697f2..edcd8d2 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -222,6 +222,7 @@ export const columns: TableColumn[] = [ text: i18n.t("Disabled"), getValue: row => (row.disabled ? : undefined), }, + { name: "openId", sortable: false, text: i18n.t("Open ID"), hidden: true }, ]; function checkAccess(requiredKeys: string[]) { From 5ad0d10fbdcc89d2fc2417ef465878536acf638e Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 11:23:18 +0100 Subject: [PATCH 050/192] Use query field to search Signed-off-by: Alexis Rico --- i18n/en.pot | 65 ++++++++++++------- i18n/es.po | 65 ++++++++++++------- src/data/repositories/UserD2ApiRepository.ts | 6 +- src/legacy/List/List.component.js | 5 +- src/legacy/components/InfoDialog.js | 2 +- .../user-list-table/UserListTable.tsx | 4 +- 6 files changed, 86 insertions(+), 61 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 69bcc43..5cb4590 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" -"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T10:23:15.686Z\n" +"PO-Revision-Date: 2021-11-11T10:23:15.686Z\n" msgid "Enable users" msgstr "" @@ -14,10 +14,10 @@ msgstr "" msgid "Disable users" msgstr "" -msgid "Replicate error" +msgid "Remove users" msgstr "" -msgid "Remove users" +msgid "Replicate error" msgstr "" msgid "Settings" @@ -29,6 +29,39 @@ msgstr "" msgid "Help" msgstr "" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "" @@ -65,10 +98,7 @@ msgstr "" msgid "Replicate user from table" msgstr "" -msgid "Search by name" -msgstr "" - -msgid "Username" +msgid "Search by name or username..." msgstr "" msgid "First name" @@ -77,29 +107,14 @@ msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" +msgid "Disabled" msgstr "" -msgid "Disabled" +msgid "Open ID" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 4ea7746..9b9d468 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T10:23:15.686Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,18 +17,51 @@ msgstr "" msgid "Remove users" msgstr "Eliminar usuarios" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Settings" msgstr "" msgid "Back" msgstr "Volver" -msgid "Replicate error" -msgstr "Replicar error" - msgid "Help" msgstr "Ayuda" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "Detalles" @@ -65,10 +98,7 @@ msgstr "" msgid "Replicate user from table" msgstr "" -msgid "Search by name" -msgstr "" - -msgid "Username" +msgid "Search by name or username..." msgstr "" msgid "First name" @@ -77,29 +107,14 @@ msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" +msgid "Disabled" msgstr "" -msgid "Disabled" +msgid "Open ID" msgstr "" diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 4b111a0..fe24479 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -31,10 +31,8 @@ export class UserD2ApiRepository implements UserRepository { page, pageSize, paging: true, - filter: { - identifiable: search ? { token: search } : undefined, - ...otherFilters, - }, + query: search, + filter: otherFilters, order: `${sorting.field}:${sorting.order}`, }) ).map(({ objects, pager }) => ({ diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 9a4cfd9..d78721c 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -223,10 +223,7 @@ export class ListHybrid extends React.Component { }; setAssignState = (key, value) => { - this.setState( - { [key]: value }, - () => !value.open && this.filterList({ page: this.state.pager.page }) - ); + this.setState({ [key]: value }, () => !value.open && this.filterList({ page: this.state.pager.page })); }; componentWillReceiveProps(newProps) { diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index d4fed66..5dc4370 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -52,4 +52,4 @@ InfoDialog.propTypes = { onClose: PropTypes.func.isRequired, }; -export default InfoDialog; \ No newline at end of file +export default InfoDialog; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index edcd8d2..b88fec5 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -49,7 +49,7 @@ export const UserListTable: React.FC = props => { { name: "userGroups", text: i18n.t("Groups") }, { name: "organisationUnits", text: i18n.t("OU Capture") }, { name: "dataViewOrganisationUnits", text: i18n.t("OU Output") }, - ], + ], actions: [ { name: "details", @@ -170,7 +170,7 @@ export const UserListTable: React.FC = props => { pageSizeOptions: [10, 25, 50, 100], pageSizeInitialValue: 25, }, - searchBoxLabel: i18n.t("Search by name"), + searchBoxLabel: i18n.t("Search by name or username..."), }; }, [props, enableReplicate]); From 5623b4ec601f5921b55681dff8bc2cd15c133859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 11 Nov 2021 23:53:46 +1300 Subject: [PATCH 051/192] propagate api prop --- src/legacy/List/List.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 9a4cfd9..fc6123b 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -416,7 +416,7 @@ export class ListHybrid extends React.Component { openSettings={this._openSettings} filters={this.state.filters?.filters} > - +
Date: Thu, 11 Nov 2021 23:55:22 +1300 Subject: [PATCH 052/192] added new component OrgUnitsSelectorFilter, first version --- src/legacy/List/Filters.component.js | 4 +- .../components/OrgUnitsSelectorFilter.js | 134 ++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/legacy/components/OrgUnitsSelectorFilter.js diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 545dd67..f417583 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -8,6 +8,7 @@ import PropTypes from "prop-types"; import React from "react"; import MultipleFilter from "../components/MultipleFilter.component"; import OrgUnitsFilter from "../components/OrgUnitsFilter.component"; +import OrgUnitsSelectorFilter from "../components/OrgUnitsSelectorFilter"; import listActions from "./list.actions"; import listStore from "./list.store"; @@ -253,7 +254,8 @@ export default class Filters extends React.Component {
- this.setState({ roots })); + } + + componentWillReceiveProps(newProps) { + if (newProps.selected !== this.props.selected) this.fieldValue = this.getCompactFieldValue(newProps.selected); + } + + openDialog() { + this.setState({ dialogOpen: true, selected: this.props.selected }); + } + + closeDialog() { + this.setState({ dialogOpen: false }); + } + + onChange(selected) { + this.setState({ selected }); + } + + applyAndClose() { + this.props.onChange(this.state.selected); + this.closeDialog(); + } + + getCompactFieldValue(selected, { limit = 3 } = {}) { + const names = selected.map(ou => ou.displayName); + + if (names.length <= limit) { + return names.join(", "); + } else { + return this.getTranslation("this_and_n_others_compact", { + this: _(names).take(limit).join(", "), + n: names.length - limit, + }); + } + } + + render() { + const { title, styles } = this.props; + const { dialogOpen } = this.state; + const t = this.getTranslation.bind(this); + + return ( +
+ + + + + +
+ ); + } +} + +OrgUnitsSelectorFilter.propTypes = { + title: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + selected: PropTypes.arrayOf(PropTypes.object).isRequired, + styles: PropTypes.object, + api: PropTypes.object, +}; + +OrgUnitsSelectorFilter.contextTypes = { + d2: PropTypes.any, +}; + +export default OrgUnitsSelectorFilter; From ff6bb82d36b27cb29bc2fc33ce9aa590e5f7d985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 11 Nov 2021 23:56:59 +1300 Subject: [PATCH 053/192] i18n and lint fixes --- i18n/en.pot | 65 ++++++++++++------- i18n/es.po | 65 ++++++++++++------- src/legacy/List/List.component.js | 5 +- src/legacy/components/InfoDialog.js | 2 +- .../user-list-table/UserListTable.tsx | 2 +- 5 files changed, 83 insertions(+), 56 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 69bcc43..e7ab562 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" -"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T10:56:17.684Z\n" +"PO-Revision-Date: 2021-11-11T10:56:17.684Z\n" msgid "Enable users" msgstr "" @@ -14,10 +14,10 @@ msgstr "" msgid "Disable users" msgstr "" -msgid "Replicate error" +msgid "Remove users" msgstr "" -msgid "Remove users" +msgid "Replicate error" msgstr "" msgid "Settings" @@ -29,6 +29,42 @@ msgstr "" msgid "Help" msgstr "" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Api URL" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "" @@ -68,38 +104,17 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" -msgstr "" - msgid "Disabled" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 4ea7746..31c709a 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T10:56:17.684Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,18 +17,54 @@ msgstr "" msgid "Remove users" msgstr "Eliminar usuarios" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Settings" msgstr "" msgid "Back" msgstr "Volver" -msgid "Replicate error" -msgstr "Replicar error" - msgid "Help" msgstr "Ayuda" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Api URL" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "Detalles" @@ -68,38 +104,17 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" -msgstr "" - msgid "Disabled" msgstr "" diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index fc6123b..10a8169 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -223,10 +223,7 @@ export class ListHybrid extends React.Component { }; setAssignState = (key, value) => { - this.setState( - { [key]: value }, - () => !value.open && this.filterList({ page: this.state.pager.page }) - ); + this.setState({ [key]: value }, () => !value.open && this.filterList({ page: this.state.pager.page })); }; componentWillReceiveProps(newProps) { diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index d4fed66..5dc4370 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -52,4 +52,4 @@ InfoDialog.propTypes = { onClose: PropTypes.func.isRequired, }; -export default InfoDialog; \ No newline at end of file +export default InfoDialog; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 50d5ef5..e9d58e2 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -50,7 +50,7 @@ export const UserListTable: React.FC = props => { { name: "userGroups", text: i18n.t("Groups") }, { name: "organisationUnits", text: i18n.t("OU Capture") }, { name: "dataViewOrganisationUnits", text: i18n.t("OU Output") }, - ], + ], actions: [ { name: "details", From cc036f397e6c0bdf60b8fa43ed89ccc4a23b65b7 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Thu, 11 Nov 2021 12:43:58 +0100 Subject: [PATCH 054/192] created the user bulk page, having issues with the router, I can see the form though --- package.json | 8 +- src/data/repositories/UserD2ApiRepository.ts | 2 +- src/legacy/List/List.component.js | 19 +- src/types/d2-ui.d.ts | 268 +++++++++++++++++- src/utils/uid.ts | 2 +- .../ColumnSelectorDialog.tsx | 73 +++++ .../components/form/fields/FormField.tsx | 15 + .../components/form/fields/NumberInputFF.tsx | 17 ++ .../components/form/fields/PreviewInputFF.tsx | 60 ++++ .../components/form/fields/TransferFF.tsx | 63 ++++ .../import-summary/ImportSummary.tsx | 201 +++++++++++++ src/webapp/components/user-form/UserForm.tsx | 115 ++++++++ .../user-form/components/OrgUnitLevelsFF.tsx | 31 ++ .../user-form/components/OutputFF.tsx | 115 ++++++++ src/webapp/components/user-form/utils.ts | 103 +++++++ .../user-list-table/UserListTable.tsx | 46 ++- src/webapp/hooks/useFuture.ts | 53 ++++ src/webapp/pages/Router.tsx | 24 +- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 162 ++++++----- yarn.lock | 175 +++++++++++- 20 files changed, 1472 insertions(+), 80 deletions(-) create mode 100644 src/webapp/components/column-selector-dialog/ColumnSelectorDialog.tsx create mode 100644 src/webapp/components/form/fields/FormField.tsx create mode 100644 src/webapp/components/form/fields/NumberInputFF.tsx create mode 100644 src/webapp/components/form/fields/PreviewInputFF.tsx create mode 100644 src/webapp/components/form/fields/TransferFF.tsx create mode 100644 src/webapp/components/import-summary/ImportSummary.tsx create mode 100644 src/webapp/components/user-form/UserForm.tsx create mode 100644 src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx create mode 100644 src/webapp/components/user-form/components/OutputFF.tsx create mode 100644 src/webapp/components/user-form/utils.ts create mode 100644 src/webapp/hooks/useFuture.ts diff --git a/package.json b/package.json index 007ceb2..65f9017 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "@eyeseetea/d2-ui-components": "2.6.7", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", "axios": "0.21.4", "classnames": "2.3.1", "d2": "27.0.0-8", @@ -42,13 +44,17 @@ "qs": "6.10.1", "react": "17.0.2", "react-dom": "17.0.2", + "react-json-view": "^1.21.3", "react-moment": "1.1.1", "react-router-dom": "5.3.0", "react-scripts": "4.0.3", + "react-virtualized-auto-sizer": "^1.0.6", + "react-window": "^1.8.6", "rx": "4.1.0", "rxjs": "6.6.7", "styled-components": "5.3.1", - "styled-jsx": "4.0.1" + "styled-jsx": "4.0.1", + "use-deep-compare-effect": "^1.8.1" }, "devDependencies": { "@babel/core": "7.15.5", diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 2fa61f3..db729a4 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -24,7 +24,7 @@ export class UserD2ApiRepository implements UserRepository { public list(options: ListOptions): FutureData> { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); - + console.log(otherFilters) return apiToFuture( this.api.models.users.get({ fields, diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 9a4cfd9..3d38c82 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -35,7 +35,7 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; - +import { UserBulkEditPage } from "../../webapp/pages/user-bulk-edit/UserBulkEditPage"; const pageSize = 50; const initialSorting = ["name", "asc"]; @@ -91,6 +91,11 @@ export class ListHybrid extends React.Component { isLoading: true, sorting: initialSorting, settingsVisible: false, + bulkEdit: { + open: false, + users: [] + }, + bulkEditVisible: false, layoutSettingsVisible: false, sharing: { model: null, @@ -324,6 +329,14 @@ export class ListHybrid extends React.Component { this.setState({ settingsVisible: true }); }; + _openBulkEdit = (users) => { + this.setState({ bulkEdit: {open: true, users }}); + }; + + _closeBulkEdit = () => { + this.setState({ bulkEdit: {open: false, users: [] }}); + }; + _closeSettings = newSettings => { this.setState({ settingsVisible: false, @@ -395,6 +408,7 @@ export class ListHybrid extends React.Component { copyUsers, removeUsers, disableUsers, + bulkEdit } = this.state; const { importUsers } = this.state; @@ -414,6 +428,7 @@ export class ListHybrid extends React.Component { @@ -531,6 +546,8 @@ export class ListHybrid extends React.Component { {settingsVisible && } + {bulkEdit.open && } + {replicateUser.open ? this.getReplicateDialog(replicateUser) : null} {!importUsers.open ? null : ( diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 76c0570..4cda31e 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -1,4 +1,31 @@ declare module "@dhis2/ui" { + interface FieldState { + active?: boolean; + blur: () => void; + change: (value: FieldValue | undefined) => void; + data?: any; + dirty?: boolean; + dirtySinceLastSubmit?: boolean; + error?: any; + focus: () => void; + initial?: FieldValue; + invalid?: boolean; + length?: number; + modified?: boolean; + modifiedSinceLastSubmit?: boolean; + name: string; + pristine?: boolean; + submitError?: any; + submitFailed?: boolean; + submitSucceeded?: boolean; + submitting?: boolean; + touched?: boolean; + valid?: boolean; + validating?: boolean; + value?: FieldValue; + visited?: boolean; + } + export type ButtonProps = { children?: ReactNode; className?: string; @@ -44,11 +71,250 @@ declare module "@dhis2/ui" { className?: string; position?: "top" | "bottom" | "middle"; }; - + + export type TransferOption = { + label: string; + value: string; + disabled?: boolean; + }; + export type TransferProps = { + options: TransferOption[]; + onChange: (params: { selected: string[] }) => void; + addAllText?: string; + addIndividualText?: string; + className?: string; + dataTest?: string; + disabled?: boolean; + enableOrderChange?: boolean; + filterCallback?: (...args: any[]) => any; + filterCallbackPicked?: (...args: any[]) => any; + filterLabel?: string; + filterLabelPicked?: string; + filterPlaceholder?: string; + filterPlaceholderPicked?: string; + filterable?: boolean; + filterablePicked?: boolean; + height?: string; + hideFilterInput?: boolean; + hideFilterInputPicked?: boolean; + initialSearchTerm?: string; + initialSearchTermPicked?: string; + leftFooter?: React.ReactNode; + leftHeader?: React.ReactNode; + loading?: boolean; + loadingPicked?: boolean; + maxSelections?: any; + optionsWidth?: string; + removeAllText?: string; + removeIndividualText?: string; + renderOption?: (...args: any[]) => any; + rightFooter?: React.ReactNode; + rightHeader?: React.ReactNode; + searchTerm?: string; + searchTermPicked?: string; + selected?: string[]; + selectedEmptyComponent?: React.ReactNode; + selectedWidth?: string; + sourceEmptyPlaceholder?: React.ReactNode; + onEndReached?: (...args: any[]) => any; + onEndReachedPicked?: (...args: any[]) => any; + onFilterChange?: (...args: any[]) => any; + onFilterChangePicked?: (...args: any[]) => any; + }; + + export type InputFieldProps = { + className?: string; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + error?: boolean; + helpText?: string; + initialFocus?: boolean; + inputWidth?: string; + label?: string; + loading?: boolean; + max?: string; + min?: string; + name?: string; + placeholder?: string; + readOnly?: boolean; + required?: boolean; + step?: string; + tabIndex?: string; + type?: + | "button" + | "checkbox" + | "color" + | "date" + | "datetime-local" + | "email" + | "file" + | "hidden" + | "image" + | "month" + | "number" + | "password" + | "radio" + | "range" + | "reset" + | "search" + | "submit" + | "tel" + | "text" + | "time" + | "url" + | "week"; + valid?: boolean; + validationText?: string; + value?: string; + warning?: boolean; + onBlur?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; + onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + }; + + export type SingleSelectFieldProps = { + className?: string; + clearText?: string | ((...args: any[]) => any); + clearable?: boolean; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + empty?: React.ReactNode | ((...args: any[]) => any); + error?: any; + filterPlaceholder?: React.ReactNode | ((...args: any[]) => any); + filterable?: boolean; + helpText?: string; + initialFocus?: boolean; + inputMaxHeight?: string; + inputWidth?: string; + label?: string; + loading?: boolean; + loadingText?: string | ((...args: any[]) => any); + maxHeight?: string; + noMatchText?: string | ((...args: any[]) => any); + placeholder?: string; + prefix?: string; + required?: boolean; + selected?: string; + tabIndex?: string; + valid?: any; + validationText?: string; + warning?: any; + children?: React.ReactNode; + onBlur?: (...args: any[]) => any; + onChange?: (value: { selected: string }, event: MouseEvent) => void; + onFocus?: (...args: any[]) => any; + }; + + export type SingleSelectOptionProps = { + label: string; + value: string; + active?: boolean; + className?: string; + dataTest?: string; + disabled?: boolean; + onClick?: (...args: any[]) => any; + }; + + export type InputFieldProps = { + className?: string; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + error?: boolean; + helpText?: string; + initialFocus?: boolean; + inputWidth?: string; + label?: string; + loading?: boolean; + max?: string; + min?: string; + name?: string; + placeholder?: string; + readOnly?: boolean; + required?: boolean; + step?: string; + tabIndex?: string; + type?: + | "button" + | "checkbox" + | "color" + | "date" + | "datetime-local" + | "email" + | "file" + | "hidden" + | "image" + | "month" + | "number" + | "password" + | "radio" + | "range" + | "reset" + | "search" + | "submit" + | "tel" + | "text" + | "time" + | "url" + | "week"; + valid?: boolean; + validationText?: string; + value?: string; + warning?: boolean; + onBlur?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; + onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + }; + + export type InputFieldFFProps = InputFieldProps & { + input: FinalFormInput; + meta: FinalFormMeta; + error?: boolean; + loading?: boolean; + showLoadingStatus?: boolean; + showValidStatus?: boolean; + valid?: boolean; + validationText?: string; + }; + + export type SingleSelectFieldFFProps = SingleSelectFieldProps & { + input: FinalFormInput; + meta: FinalFormMeta; + options: { + label?: string; + value?: string; + }[]; + error?: boolean; + loading?: boolean; + showLoadingStatus?: boolean; + showValidStatus?: boolean; + valid?: boolean; + validationText?: string; + }; + export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; export function Button(props: ButtonProps): React.ReactElement; export function ButtonStrip(props: ButtonStripProps): React.ReactElement; export function NoticeBox(props: NoticeBoxProps): React.ReactElement; export function CenteredContent(props: CenteredContentProps): React.ReactElement; + export function Transfer(props: TransferProps): React.ReactElement; + export function InputField(props: InputFieldProps): React.ReactElement; + export function SingleSelectField(props: SingleSelectFieldProps): React.ReactElement; + export function SingleSelectOption(props: SingleSelectOptionProps): React.ReactElement; + export function composeValidators( + ...validators: ((value: unknown) => string | undefined)[] + ): (value: unknown) => string | undefined; + export function hasValue(value: unknown): string | undefined; + export function createMinNumber(min: number): (value: unknown) => string | undefined; + export function createPattern(pattern: RegExp, message?: string): (value: unknown) => string | undefined; + export function createMaxCharacterLength(bound: number): (value: unknown) => string | undefined; + export function createMinCharacterLength(bound: number): (value: unknown) => string | undefined; + export function InputFieldFF(props: InputFieldFFProps): React.ReactElement; + export function integer(value: unknown): string | undefined; + export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; + + } diff --git a/src/utils/uid.ts b/src/utils/uid.ts index 8030e0e..2e0e7e0 100644 --- a/src/utils/uid.ts +++ b/src/utils/uid.ts @@ -46,7 +46,7 @@ export function generateUid(): string { return randomChars; } -const fullUidRegex = /^[a-zA-Z]{1}[a-zA-Z0-9]{10}$/; +export const fullUidRegex = /^[a-zA-Z]{1}[a-zA-Z0-9]{10}$/; const uidRegex = /[a-zA-Z]{1}[a-zA-Z0-9]{10}/g; export function isValidUid(code: string | undefined | null): boolean { diff --git a/src/webapp/components/column-selector-dialog/ColumnSelectorDialog.tsx b/src/webapp/components/column-selector-dialog/ColumnSelectorDialog.tsx new file mode 100644 index 0000000..6f86a65 --- /dev/null +++ b/src/webapp/components/column-selector-dialog/ColumnSelectorDialog.tsx @@ -0,0 +1,73 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import { Checkbox, DialogContent } from "@material-ui/core"; +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 i18n from "../../../locales"; + +export interface ColumnSelectorDialogProps { + columns: string[]; + visibleColumns: string[]; + getName: (key: string) => string; + onChange: (visibleColumns: string[]) => void; + onCancel: () => void; +} + +export function ColumnSelectorDialog(props: ColumnSelectorDialogProps) { + const { columns, visibleColumns, onChange, onCancel, getName } = props; + + const toggleElement = (name: string) => { + const newSelection = !visibleColumns.includes(name) + ? [...visibleColumns, name] + : visibleColumns.filter(item => item !== name); + onChange(newSelection); + }; + + return ( + + + + + + {i18n.t("Column")} + + + + {columns.map(name => { + const text = getName(name); + const checked = visibleColumns.includes(name); + const disabled = visibleColumns.length <= 1 && checked; + + return ( + + !disabled && toggleElement(name)} + > + + {text} + + + ); + })} + +
+
+
+ ); +} diff --git a/src/webapp/components/form/fields/FormField.tsx b/src/webapp/components/form/fields/FormField.tsx new file mode 100644 index 0000000..81afa9c --- /dev/null +++ b/src/webapp/components/form/fields/FormField.tsx @@ -0,0 +1,15 @@ +import { ComponentProps, ComponentType } from "react"; +import { Field, UseFieldConfig } from "react-final-form"; + +export type FormFieldProps> = UseFieldConfig & + Omit, "input" | "meta"> & { + name: string; + component: T; + value?: FieldValue; + initialValue?: FieldValue; + defaultValue?: FieldValue; + }; + +export const FormField = >(props: FormFieldProps) => { + return {...props} />; +}; diff --git a/src/webapp/components/form/fields/NumberInputFF.tsx b/src/webapp/components/form/fields/NumberInputFF.tsx new file mode 100644 index 0000000..63e93cc --- /dev/null +++ b/src/webapp/components/form/fields/NumberInputFF.tsx @@ -0,0 +1,17 @@ +import { InputField, InputFieldProps } from "@dhis2/ui"; +import { FieldRenderProps } from "react-final-form"; + +export const NumberInputFF: React.FC, "input"> & InputFieldProps> = ({ + input, + ...props +}) => { + return ( + input.onChange(parseInt(value ?? "0"))} + type="number" + /> + ); +}; diff --git a/src/webapp/components/form/fields/PreviewInputFF.tsx b/src/webapp/components/form/fields/PreviewInputFF.tsx new file mode 100644 index 0000000..f621bd5 --- /dev/null +++ b/src/webapp/components/form/fields/PreviewInputFF.tsx @@ -0,0 +1,60 @@ +import { InputField } from "@dhis2/ui"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import i18n from "@eyeseetea/d2-ui-components/locales"; +import _ from "lodash"; +import React, { useState } from "react"; +import { Field, FieldRenderProps } from "react-final-form"; + +export function PreviewInputFF({ warning, placeholder, children, name, validate }: PreviewInputFFProps) { + const [open, setOpen] = useState(false); + + return ( + + setOpen(false)} + cancelText={i18n.t("Close")} + > + {children} + + +
setOpen(true)}> + + {({ input, meta }) => ( + {}} + error={!!meta.error} + warning={!!warning} + validationText={warning ?? meta.error ?? meta.submitError} + /> + )} + +
+
+ ); +} + +export interface PreviewInputFFProps extends Pick, "name" | "validate"> { + placeholder: string; + warning?: string; + children: React.ReactNode; +} + +const buildValue = (value: unknown): string => { + if (Array.isArray(value) && value.length === 0) { + return "-"; + } else if (Array.isArray(value)) { + return value.map(item => buildValue(item)).join(", "); + } else if (_.has(value, "name")) { + return _.get(value, "name"); + } else if (value) { + return String(value); + } else { + return "-"; + } +}; diff --git a/src/webapp/components/form/fields/TransferFF.tsx b/src/webapp/components/form/fields/TransferFF.tsx new file mode 100644 index 0000000..0439514 --- /dev/null +++ b/src/webapp/components/form/fields/TransferFF.tsx @@ -0,0 +1,63 @@ +import { FieldState, NoticeBox, Transfer, TransferProps } from "@dhis2/ui"; +import React, { useCallback } from "react"; +import styled from "styled-components"; +import { NamedRef } from "../../../../domain/entities/Ref"; + +export type TransferFFProps = Omit & { + input: any; + meta: FieldState; + error?: boolean; + loading?: boolean; + showLoadingStatus?: boolean; + showValidStatus?: boolean; + valid?: boolean; + validationText?: string; +}; + +export const TransferFF = ({ + input, + meta, + validationText, + loading, + showLoadingStatus, + options, + ...rest +}: TransferFFProps) => { + const isLoading = loading || (showLoadingStatus && meta.validating); + const message = validationText ?? meta.error ?? meta.submitError; + const selected = input.value.map(({ id }: NamedRef) => id); + + const onChange = useCallback( + ({ selected }: { selected: string[] }) => { + input.onChange(selected.map(id => ({ id, name: options.find(item => item.value === id)?.label ?? "" }))); + }, + [input, options] + ); + + return ( + + + + {!!message && } + + ); +}; + +const WarningBox = styled(NoticeBox)` + margin-top: 20px; + align-items: center; + + h6 { + margin: 0px; + } +`; + +const StyledTransfer = styled(Transfer)` + div { + border-color: rgb(160, 173, 186); + } + + .status-icon { + margin-left: 0; + } +`; diff --git a/src/webapp/components/import-summary/ImportSummary.tsx b/src/webapp/components/import-summary/ImportSummary.tsx new file mode 100644 index 0000000..97ba791 --- /dev/null +++ b/src/webapp/components/import-summary/ImportSummary.tsx @@ -0,0 +1,201 @@ +import { + Accordion, + AccordionDetails, + AccordionSummary, + DialogContent, + makeStyles, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from "@material-ui/core"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import _ from "lodash"; +import { useCallback } from "react"; +import ReactJson from "react-json-view"; +import { hasReplicateAuthority, User } from "../../../domain/entities/User"; + +//import { MetadataResponse, MetadataResponseStats } from "../../../domain/entities/Metadata"; +import i18n from "../../../locales"; + +const useStyles = makeStyles(theme => ({ + accordionHeading1: { + marginLeft: 30, + fontSize: theme.typography.pxToRem(15), + flexBasis: "55%", + flexShrink: 0, + }, + accordionHeading2: { + fontSize: theme.typography.pxToRem(15), + color: theme.palette.text.secondary, + }, + accordionDetails: { + padding: "4px 24px 4px", + }, + accordion: { + paddingBottom: "10px", + }, + tooltip: { + maxWidth: 650, + fontSize: "0.9em", + }, +})); + +export const formatStatusTag = (value: string) => { + const text = _.startCase(_.toLower(value)); + const color = + value === "ERROR" || value === "FAILURE" || value === "NETWORK ERROR" + ? "#e53935" + : value === "DONE" || value === "SUCCESS" || value === "OK" + ? "#7cb342" + : "#3e2723"; + + return {text}; +}; +//stats: Array +const buildSummaryTable = (stats: Array) => { + return ( + + + + {i18n.t("Type")} + {i18n.t("Created")} + {i18n.t("Updated")} + {i18n.t("Deleted")} + {i18n.t("Ignored")} + {i18n.t("Total")} + + + + {stats.map(({ type, created, updated, deleted, ignored, total }, i) => ( + + {type} + {created} + {updated} + {deleted} + {ignored} + {total || _.sum([created, deleted, ignored, updated])} + + ))} + +
+ ); +}; + +const buildMessageTable = (messages: ErrorMessage[]) => { + return ( + + + + {i18n.t("Identifier")} + {i18n.t("Message")} + + + + {messages.map(({ id, message }, i) => ( + + {id} + {message} + + ))} + +
+ ); +}; + +interface ErrorMessage { + id: string; + message: string; +} + +interface ImportSummaryProps { + results: any[]; //MetadataResponse + onClose: () => void; +} + +export const ImportSummary = ({ results, onClose }: ImportSummaryProps) => { + const classes = useStyles(); + + const copyToClipboard = useCallback((object: unknown) => { + navigator.clipboard.writeText(JSON.stringify(object, null, 4)); + }, []); + + return ( + + + {results.map(({ status, typeReports = [] }, idx) => { + const stats = typeReports.map(({ stats }: {stats: any}) => ({ + type: i18n.t("Predictors"), + ...stats, + })); + + const errors = _.flatMap(typeReports, ({ objectReports }) => + _.flatMap(objectReports, ({ uid, errorReports }) => + errorReports.map(({ message }: { message: string }) => ({ id: uid, message })) + ) + ); + + return ( + + }> + + {i18n.t("Import")} +
+
+ + {`${i18n.t("Status")}: `} + {formatStatusTag(status)} + +
+ + + {i18n.t("Summary")} + + + {stats && ( + + {buildSummaryTable(stats)} + + )} + + {errors.length > 0 && ( +
+ + {i18n.t("Messages")} + + + {buildMessageTable(_.take(errors, 10))} + +
+ )} +
+ ); + })} + + + }> + {i18n.t("JSON Response")} + + + + + + +
+
+ ); +}; \ No newline at end of file diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx new file mode 100644 index 0000000..c74d7e4 --- /dev/null +++ b/src/webapp/components/user-form/UserForm.tsx @@ -0,0 +1,115 @@ +import { + composeValidators, + createMaxCharacterLength, + createMinNumber, + createPattern, + FieldState, + hasValue, + InputFieldFF, + integer, + SingleSelectFieldFF, +} from "@dhis2/ui"; +import React from "react"; +import i18n from "../../../locales"; +import { fullUidRegex } from "../../../utils/uid"; +import { FormField } from "../form/fields/FormField"; +import { NumberInputFF } from "../form/fields/NumberInputFF"; +import { PreviewInputFF } from "../form/fields/PreviewInputFF"; +import { OrgUnitLevelsFF } from "./components/OrgUnitLevelsFF"; +//import { OutputFF } from "./components/OutputFF"; +import { + getPredictorFieldName, + missingValueStrategy, + periodTypes, + PredictorFormField, + predictorRequiredFields, +} from "./utils"; + +const useValidations = ( + field: PredictorFormField, +): { validation?: (...args: any[]) => any; props?: object } => { + + switch (field) { + case "id": + return { validation: createPattern(fullUidRegex, i18n.t("Please provide a valid identifier")) }; + case "description": + case "generator.description": + case "sampleSkipTest.description": + return { validation: createMaxCharacterLength(255) }; + case "sequentialSampleCount": + case "annualSampleCount": + case "sequentialSkipCount": + case "scheduling.sequence": + case "scheduling.variable": + return { validation: composeValidators(integer, createMinNumber(0)) }; + default: { + const required = predictorRequiredFields.includes(field); + return { validation: required ? hasValue : undefined }; + } + } +}; + +export const RenderPredictorWizardField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { + const name = `predictors[${row}.${field}]`; + const { validation, props: validationProps = {} } = useValidations(field); + const props = { + name, + placeholder: getPredictorFieldName(field), + validate: validation, + ...validationProps, + }; +/* + case "output": + return ; +*/ + switch (field) { + case "id": + case "code": + case "description": + case "name": + case "generator.description": + case "sampleSkipTest.description": + return ; + case "periodType": + return ; + case "organisationUnitLevels": + return ; + case "generator.missingValueStrategy": + return ; + case "sequentialSampleCount": + case "annualSampleCount": + case "sequentialSkipCount": + case "scheduling.sequence": + case "scheduling.variable": + return ; + default: + return null; + } +}; + +export const RenderPredictorImportField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { + const name = `predictors[${row}.${field}]`; + const { validation, props: validationProps = {} } = useValidations(field); + + const props = { + name, + placeholder: getPredictorFieldName(field), + validate: validation, + ...validationProps, + }; + + switch (field) { + case "organisationUnitLevels": + case "predictorGroups": + case "generator.expression": + case "sampleSkipTest.expression": + case "output": + return ( + + + + ); + default: + return ; + } +}; diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx new file mode 100644 index 0000000..4165756 --- /dev/null +++ b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx @@ -0,0 +1,31 @@ +import { TransferOption } from "@dhis2/ui"; +import { NamedRef } from "../../../../domain/entities/Ref"; +import { useAppContext } from "../../../contexts/app-context"; +import { useFuture } from "../../../hooks/useFuture"; +import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; + +export const OrgUnitLevelsFF: React.FC> = props => { + const { compositionRoot } = useAppContext(); + + /*const { data: orgUnitLevels = [] } = useFuture( + () => + compositionRoot.metadata.list("organisationUnitLevels").map(({ objects }) => buildTransferOptions(objects)), + [] + );*/ + const options1 = [{label: "test1", value: "test1"}] + + return ( + + ); +}; + +const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + return options.map(({ id, name }) => ({ value: id, label: name })); +}; diff --git a/src/webapp/components/user-form/components/OutputFF.tsx b/src/webapp/components/user-form/components/OutputFF.tsx new file mode 100644 index 0000000..81872ee --- /dev/null +++ b/src/webapp/components/user-form/components/OutputFF.tsx @@ -0,0 +1,115 @@ +export {} +/*import { FieldState, SingleSelectField, SingleSelectOption } from "@dhis2/ui"; +import _ from "lodash"; +import React, { useCallback } from "react"; +import { useField } from "react-final-form"; +import styled from "styled-components"; +import { NamedRef } from "../../../../domain/entities/Ref"; +import i18n from "../../../../locales"; +import { useAppContext } from "../../../contexts/app-context"; +import { useFuture } from "../../../hooks/useFuture"; +import { getPredictorFieldName } from "../utils"; + +export const OutputFF: React.FC = ({ input, optionComboField }) => { + const { compositionRoot } = useAppContext(); + const { input: optionComboInput } = useField(optionComboField); + + const { data: dataElements = [] } = useFuture( + () => + compositionRoot.metadata + .list( + "dataElements", + { paging: false }, + { id: true, name: true, categoryCombo: { categoryOptionCombos: { id: true, name: true } } } + ) + .map(({ objects }) => buildOptions(objects as unknown as DataElementWithCategoryOptionCombo[])), + [] + ); + + const onChangeDataElement = useCallback( + ({ selected }) => { + const dataElement = dataElements.find(item => item.value === selected); + if (dataElement) { + input.onChange({ id: dataElement.value, name: dataElement.label }); + const categoryOption = dataElement.categoryOptions[0]; + optionComboInput.onChange( + categoryOption ? { id: categoryOption.value, name: categoryOption.label } : undefined + ); + } + }, + [dataElements, input, optionComboInput] + ); + + const onChangeOptionCombo = useCallback( + ({ selected }) => { + const optionCombo = dataElements + .find(item => item.value === input.value.id) + ?.categoryOptions.find(item => item.value === selected); + + if (optionCombo) { + optionComboInput.onChange({ id: optionCombo.value, name: optionCombo.label }); + } + }, + [dataElements, input, optionComboInput] + ); + + const dataElementItems = _.unionBy( + dataElements, + [{ value: input.value.id, label: i18n.t("Invalid option"), categoryOptions: [] }], + ({ value }) => value + ); + + const categoryItems = _.unionBy( + dataElements.find(({ value }) => value === input.value.id)?.categoryOptions, + [{ value: optionComboInput.value.id, label: i18n.t("Invalid option") }], + ({ value }) => value + ); + + return ( + + + {dataElementItems.map(({ value, label }) => ( + + ))} + + + {(dataElements.find(({ value }) => value === input.value.id)?.categoryOptions.length ?? 0) > 1 && ( + + {getPredictorFieldName("outputCombo")} + + {categoryItems.map(({ value, label }) => ( + + ))} + + + )} + + ); +}; + +export interface CategoryOptionComboFFProps { + input: any; + meta: FieldState; + optionComboField: string; +} + +type DataElementWithCategoryOptionCombo = { + id: string; + name: string; + categoryCombo: { categoryOptionCombos: { id: string; name: string }[] }; +}; + +const buildOptions = ( + dataElements: DataElementWithCategoryOptionCombo[] +): { label: string; value: string; categoryOptions: { label: string; value: string }[] }[] => { + return dataElements.map(({ id, name, categoryCombo }) => ({ + value: id, + label: name, + categoryOptions: categoryCombo.categoryOptionCombos.map(({ id, name }) => ({ value: id, label: name })), + })); +}; + +const Row = styled.div` + margin: 20px 0; +`; +*/ \ No newline at end of file diff --git a/src/webapp/components/user-form/utils.ts b/src/webapp/components/user-form/utils.ts new file mode 100644 index 0000000..f527266 --- /dev/null +++ b/src/webapp/components/user-form/utils.ts @@ -0,0 +1,103 @@ +import _ from "lodash"; +import i18n from "../../../locales"; + +export type PredictorFormField = typeof predictorFormFields[number]; + +export const predictorFormFields = [ + "id", + "code", + "name", + "description", + "output", + "periodType", + "annualSampleCount", + "sequentialSampleCount", + "organisationUnitLevels", + "predictorGroups", + "sequentialSkipCount", + "generator.description", + "generator.expression", + "generator.missingValueStrategy", + "sampleSkipTest.description", + "sampleSkipTest.expression", + "scheduling.sequence", + "scheduling.variable", +]; + +export const predictorRequiredFields: PredictorFormField[] = ["name", "generator.expression", "output", "outputCombo"]; + +export const getPredictorName = (field: PredictorFormField) => { + switch (field) { + case "id": + return i18n.t("Identifier"); + case "code": + return i18n.t("Code"); + case "name": + return i18n.t("Name"); + case "description": + return i18n.t("Description"); + case "output": + return i18n.t("Output data element"); + case "outputCombo": + return i18n.t("Output category combo"); + case "periodType": + return i18n.t("Period type"); + case "annualSampleCount": + return i18n.t("Annual sample count"); + case "sequentialSampleCount": + return i18n.t("Sequential sample count"); + case "sequentialSkipCount": + return i18n.t("Sequential skip count"); + case "organisationUnitLevels": + return i18n.t("Organisation unit levels"); + case "predictorGroups": + return i18n.t("Predictor groups"); + case "generator.description": + return i18n.t("Generator description"); + case "generator.missingValueStrategy": + return i18n.t("Missing value strategy"); + case "generator.expression": + return i18n.t("Generator formula"); + case "sampleSkipTest.description": + return i18n.t("Sample skip test description"); + case "sampleSkipTest.expression": + return i18n.t("Sample skip test formula"); + case "scheduling.sequence": + return i18n.t("Sequence"); + case "scheduling.variable": + return i18n.t("Variable"); + } +}; + +export const getPredictorFieldName = (field: PredictorFormField) => { + const name = getPredictorName(field); + const required = predictorRequiredFields.includes(field); + return _.compact([name, required ? "(*)" : undefined]).join(" "); +}; + +export const periodTypes = [ + { value: "Daily", label: i18n.t("Daily") }, + { value: "Weekly", label: i18n.t("Weekly") }, + { value: "WeeklyWednesday", label: i18n.t("Weekly starting Wednesday") }, + { value: "WeeklyThursday", label: i18n.t("Weekly starting Thursday") }, + { value: "WeeklySaturday", label: i18n.t("Weekly starting Saturday") }, + { value: "WeeklySunday", label: i18n.t("Weekly starting Sunday") }, + { value: "BiWeekly", label: i18n.t("Biweekly") }, + { value: "Monthly", label: i18n.t("Monthly") }, + { value: "BiMonthly", label: i18n.t("Bi-monthly") }, + { value: "Quarterly", label: i18n.t("Quarterly") }, + { value: "SixMonthly", label: i18n.t("Six-monthly") }, + { value: "SixMonthlyApril", label: i18n.t("Six-monthly starting April") }, + { value: "SixMonthlyNov", label: i18n.t("Six-monthly starting November") }, + { value: "Yearly", label: i18n.t("Yearly") }, + { value: "FinancialApril", label: i18n.t("Financial year starting April") }, + { value: "FinancialJuly", label: i18n.t("Financial year starting July") }, + { value: "FinancialOct", label: i18n.t("Financial year starting October") }, + { value: "FinancialNov", label: i18n.t("Financial year starting November") }, +]; + +export const missingValueStrategy = [ + { value: "SKIP_IF_ANY_VALUE_MISSING", label: i18n.t("Skip if any value is missing") }, + { value: "SKIP_IF_ALL_VALUES_MISSING", label: i18n.t("Skip if all values are missing") }, + { value: "NEVER_SKIP", label: i18n.t("Never skip") }, +]; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 7a697f2..89f629b 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -9,14 +9,16 @@ import { TablePagination, TableSorting, useObjectsTable, + useSnackbar, } from "@eyeseetea/d2-ui-components"; import { Icon } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; +import { useHistory } from "react-router-dom"; import _ from "lodash"; import React, { useCallback, useMemo } from "react"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; -import { ListFilters } from "../../../domain/repositories/UserRepository"; +import { ListFilters, ListFilterType } from "../../../domain/repositories/UserRepository"; import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; import copyInUserStore from "../../../legacy/List/copyInUser.store"; import deleteUserStore from "../../../legacy/List/deleteUser.store"; @@ -33,6 +35,43 @@ export const UserListTable: React.FC = props => { const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); + const snackbar = useSnackbar(); + const history = useHistory(); + + const editPredictor = useCallback( + (ids: string[]) => { + if (ids.length === 1) { + history.push(`/edit/${ids[0]}`); + } else { + const listOptions = { + filters: {id: ["in" as ListFilterType, ids]} as ListFilters + }; + compositionRoot.users.list(listOptions).run( + ({ pager, objects }: { pager: Pager, objects: User[]}) => { + console.log(objects) + // state: { users: objects } + history.push({ pathname: `/bulk-edit`, state: { users: objects } }); + }, + error => snackbar.error(error) + ); + } + }, + [history, compositionRoot, snackbar] + ); + + const editPredictor1 = (ids: string[]) => { + const listOptions = { + filters: {id: ["in" as ListFilterType, ids]} as ListFilters + }; + compositionRoot.users.list(listOptions).run( + ({ pager, objects }: { pager: Pager, objects: User[]}) => { + console.log(objects) + // state: { users: objects } + props.openBulkEdit(objects); + }, + error => snackbar.error(error) + ); + }; const baseConfig = useMemo((): TableConfig => { return { @@ -102,8 +141,8 @@ export const UserListTable: React.FC = props => { name: "edit", text: i18n.t("Edit"), icon: edit, - multiple: false, - onClick: user => goToUserEditPage(user), + multiple: true, + onClick: editPredictor, isActive: checkAccess(["update"]), }, { @@ -242,5 +281,6 @@ function isStateActionVisible(action: string) { export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; + openBulkEdit: (users: User[]) => void; filters: ListFilters; } diff --git a/src/webapp/hooks/useFuture.ts b/src/webapp/hooks/useFuture.ts new file mode 100644 index 0000000..261f449 --- /dev/null +++ b/src/webapp/hooks/useFuture.ts @@ -0,0 +1,53 @@ +import { useCallback, useState } from "react"; +import useDeepCompareEffect from "use-deep-compare-effect"; +import { Future, FutureData } from "../../domain/entities/Future"; + +type Callback = () => void; +type ResultType = { + data?: Obj; + error?: string; + loading: boolean; + cancel: Callback; + refetch: (...params: Params) => Callback; +}; + +export function useFuture( + inputFuture: (...params: Params) => FutureData, + inputParams: Params +): ResultType { + const [future] = useState(() => inputFuture); + + const [data, setData] = useState(); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(); + const [cancel, setCancel] = useState(Future.noCancel); + + const refetch = useCallback( + (...params: Params) => { + setData(undefined); + setLoading(true); + setError(undefined); + setCancel(Future.noCancel); + + const cancel = future(...params).run( + data => { + setData(data); + setLoading(false); + }, + error => { + setError(error); + } + ); + + setCancel(() => cancel); + return cancel; + }, + [future] + ); + + useDeepCompareEffect(() => { + return refetch(...inputParams); + }, [refetch, inputParams]); + + return { data, loading, cancel, error, refetch }; +} diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 6d05871..bb68dbe 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -1,13 +1,28 @@ import React from "react"; -import { HashRouter, Route, Switch } from "react-router-dom"; +import { HashRouter, Route, Switch, Redirect } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; import { UserBulkEditPage, ActionType } from "./user-bulk-edit/UserBulkEditPage"; - +/* +( + + + + )} + /> +*/ export const Router: React.FC = React.memo(() => { return ( + ( + + )} + /> ( @@ -16,10 +31,7 @@ export const Router: React.FC = React.memo(() => { )} /> - } - /> + ); diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 98f3933..af6ba73 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -1,5 +1,7 @@ import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; -import { useLoading } from "@eyeseetea/d2-ui-components"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; + +//import { useLoading } from "@eyeseetea/d2-ui-components"; import { Paper } from "@material-ui/core"; import { Delete, ViewColumn } from "@material-ui/icons"; import _ from "lodash"; @@ -10,98 +12,130 @@ import { Redirect, useLocation } from "react-router"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeGrid as Grid } from "react-window"; import styled from "styled-components"; -import { MetadataResponse } from "../../../domain/entities/Metadata"; -import { Predictor } from "../../../domain/entities/Predictor"; +//import { MetadataResponse } from "../../../domain/entities/Metadata"; //will I use the clean architecture? +import { User } from "../../../domain/entities/User"; + import i18n from "../../../locales"; import { ColumnSelectorDialog } from "../../components/column-selector-dialog/ColumnSelectorDialog"; import { ImportSummary } from "../../components/import-summary/ImportSummary"; import { PageHeader } from "../../components/page-header/PageHeader"; -import { RenderPredictorImportField } from "../../components/predictor-form/PredictorForm"; -import { predictorFormFields, getPredictorFieldName } from "../../components/predictor-form/utils"; +import { RenderPredictorImportField } from "../../components/user-form/UserForm"; +import { predictorFormFields, getPredictorFieldName } from "../../components/user-form/utils"; import { useAppContext } from "../../contexts/app-context"; import { useGoBack } from "../../hooks/useGoBack"; const rowHeight = (index: number) => (index === 0 ? 30 : 70); const columnWidth = (index: number) => (index === 0 ? 50 : 250); -export interface PredictorBulkEditPageProps { +/*export interface PredictorBulkEditPageProps { type: ActionType; +}*/ + +export interface PredictorBulkEditPageProps { + users: User[]; } export type ActionType = "import" | "bulk-edit"; - -export const UserBulkEditPage: React.FC = ({ type }) => { +//: React.FC { users } +export const UserBulkEditPage = () => { const { compositionRoot } = useAppContext(); const goBack = useGoBack(); - const loading = useLoading(); + //const loading = useLoading(); - const location = useLocation<{ predictors: Predictor[] }>(); - const [predictors] = React.useState(location.state?.predictors ?? []); - const [summary, setSummary] = useState(); + const location = useLocation<{ users: User[] }>(); + const [usersToEdit] = React.useState(location.state.users ?? []); + const [summary, setSummary] = useState(); //MetadataResponse const [columns, setColumns] = useState(basePredictorColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); const goHome = useCallback(() => goBack(true), [goBack]); const onSubmit = useCallback( - async ({ predictors }: { predictors: Predictor[] }) => { - loading.show(true, i18n.t("Saving predictors")); - const { data = [], error } = await compositionRoot.predictors.save(predictors).runAsync(); - if (error) return error ?? i18n.t("Network error"); - loading.reset(); - - if (_.some(data, foo => foo.status === "ERROR")) { + async ({ usersToEdit }: { usersToEdit: User[] }) => { + //loading.show(true, i18n.t("Saving predictors")); + console.log("here!!"); + //const { data = [], error } = await compositionRoot.users.save(users).runAsync(); + //if (error) return error ?? i18n.t("Network error"); + //loading.reset(); + + /*if (_.some(data, foo => foo.status === "ERROR")) { setSummary(data); } else { goHome(); - } + }*/ + //, loading }, - [compositionRoot, goHome, loading] + [compositionRoot, goHome] ); - - if (predictors.length === 0) return ; - - const title = type === "import" ? i18n.t("Import predictors") : i18n.t("Edit predictors"); - const closeSummary = () => setSummary(undefined); - return ( - - - setColumnSelectorOpen(true)} - style={{ float: "right" }} - > - - - + + autocomplete="off" + onSubmit={onSubmit} + initialValues={{ usersToEdit }} + render={({ handleSubmit, values, submitError }) => ( + + + + {({ height, width }: {height: number, width: number}) => ( + + {Row} + + )} + + - {summary ? : null} + {submitError && ( + + {submitError} + + )} - {columnSelectorOpen && ( - setColumnSelectorOpen(false)} - /> - )} + + - - + + + + )} + /> + ); +}; +/* + console.log("cancel")} + onSave={() => console.log("save")} + maxWidth={"lg"} + fullWidth={true} + > + autocomplete="off" onSubmit={onSubmit} - initialValues={{ predictors }} + initialValues={{ usersToEdit }} render={({ handleSubmit, values, submitError }) => ( - {({ height, width }) => ( + {({ height, width }: {height: number, width: number}) => ( = ({ type }) {submitError && ( - + {submitError} )} @@ -133,18 +167,16 @@ export const UserBulkEditPage: React.FC = ({ type }) )} /> - - - ); -}; + + +*/ const basePredictorColumns = [ "id", "name", - "scheduling.sequence", - "scheduling.variable", - "output", - "generator.expression", + "email", + "userCredentials.userRoles", + "userCredentials.userGroups", ]; const MaxHeight = styled.div` @@ -172,7 +204,7 @@ interface RowItemProps { } const RowItem: React.FC = ({ data, columnIndex, rowIndex }) => { - const form = useForm<{ predictors: Predictor[] }>(); + const form = useForm<{ users: User[] }>(); const headerRow = rowIndex === 0; const deleteRow = columnIndex === 0; @@ -180,9 +212,9 @@ const RowItem: React.FC = ({ data, columnIndex, rowIndex }) => { const field = data.columns[columnIndex - 1]; const removeRow = useCallback(() => { - const original = form.getState().values.predictors; - const predictors = [...original.slice(0, row), ...original.slice(row + 1)]; - form.change("predictors", predictors); + const original = form.getState().values.users; + const users = [...original.slice(0, row), ...original.slice(row + 1)]; + form.change("users", users); }, [form, row]); if (deleteRow) { diff --git a/yarn.lock b/yarn.lock index 437f425..f8f591e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1166,7 +1166,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.1", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.1", "@babel/runtime@^7.9.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== @@ -3057,6 +3057,20 @@ dependencies: "@types/react" "*" +"@types/react-virtualized-auto-sizer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz#b3187dae1dfc4c15880c9cfc5b45f2719ea6ebd4" + integrity sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong== + dependencies: + "@types/react" "*" + +"@types/react-window@^1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" + integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@17.0.26": version "17.0.26" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.26.tgz#960ea4b3518cc154ed7df3b35656c508df653331" @@ -4193,6 +4207,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -5241,6 +5260,13 @@ cronstrue@^1.81.0: resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.117.0.tgz#a7413ca510a85935380ae1ad8fef99d5b31ce8a4" integrity sha512-XeRPOHNnkitGDqiLj3V6XJgn/UbrRSaWdVrDjV/IBt2cT+SRPeURiTt6Fbm16liCp78+XFklwuwWpPzPBg08NQ== +cross-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -5787,6 +5813,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +dequal@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -6811,6 +6842,18 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + fbjs@^0.8.1: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" @@ -6824,6 +6867,19 @@ fbjs@^0.8.1: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fbjs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.1.tgz#70a053d34a96c2b513b559eaea124daed49ace64" + integrity sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -6980,6 +7036,14 @@ fluture@14.0.0: sanctuary-show "^2.0.0" sanctuary-type-identifiers "^3.0.0" +flux@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.2.tgz#d71dcaf6cb51ca059f303f3d964d6f325d444952" + integrity sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.0" + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -9643,11 +9707,21 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -9892,6 +9966,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +"memoize-one@>=3.1.1 <6": + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memoize-weak@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/memoize-weak/-/memoize-weak-1.0.2.tgz#d0015a4c7c6cff2263dbbb49db1dc206ebb94916" @@ -10273,6 +10352,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -11860,6 +11944,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + purify-ts-extra-codec@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/purify-ts-extra-codec/-/purify-ts-extra-codec-0.6.0.tgz#4d06756cbf4d9def5a44bb192f18178726400547" @@ -11974,6 +12063,16 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + react-dev-utils@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" @@ -12049,6 +12148,21 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + react-linkify@1.0.0-alpha: version "1.0.0-alpha" resolved "https://registry.yarnpkg.com/react-linkify/-/react-linkify-1.0.0-alpha.tgz#b391c7b88e3443752fafe76a95ca4434e82e70d5" @@ -12179,6 +12293,15 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" +react-textarea-autosize@^8.3.2: + version "8.3.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + react-transition-group@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" @@ -12200,6 +12323,19 @@ react-transition-group@^4.0.0, react-transition-group@^4.4.0: loose-envify "^1.4.0" prop-types "^15.6.2" +react-virtualized-auto-sizer@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz#66c5b1c9278064c5ef1699ed40a29c11518f97ca" + integrity sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ== + +react-window@^1.8.6: + version "1.8.6" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112" + integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg== + dependencies: + "@babel/runtime" "^7.0.0" + memoize-one ">=3.1.1 <6" + react@17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -13892,6 +14028,11 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== + ts-jest@27.0.5: version "27.0.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.5.tgz#0b0604e2271167ec43c12a69770f0bb65ad1b750" @@ -14045,6 +14186,11 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + uc.micro@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -14220,6 +14366,33 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-composed-ref@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc" + integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg== + dependencies: + ts-essentials "^2.0.3" + +use-deep-compare-effect@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6" + integrity sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q== + dependencies: + "@babel/runtime" "^7.12.5" + dequal "^2.0.2" + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From ca6db899760bb039d222c1fc13cbb5f361f58b15 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Thu, 11 Nov 2021 12:46:16 +0100 Subject: [PATCH 055/192] reverting the confirmation dialog user bulk edit that I tried before --- src/legacy/List/List.component.js | 16 ---------------- .../user-list-table/UserListTable.tsx | 17 +---------------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 3d38c82..9f8454e 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -91,11 +91,6 @@ export class ListHybrid extends React.Component { isLoading: true, sorting: initialSorting, settingsVisible: false, - bulkEdit: { - open: false, - users: [] - }, - bulkEditVisible: false, layoutSettingsVisible: false, sharing: { model: null, @@ -329,14 +324,6 @@ export class ListHybrid extends React.Component { this.setState({ settingsVisible: true }); }; - _openBulkEdit = (users) => { - this.setState({ bulkEdit: {open: true, users }}); - }; - - _closeBulkEdit = () => { - this.setState({ bulkEdit: {open: false, users: [] }}); - }; - _closeSettings = newSettings => { this.setState({ settingsVisible: false, @@ -408,7 +395,6 @@ export class ListHybrid extends React.Component { copyUsers, removeUsers, disableUsers, - bulkEdit } = this.state; const { importUsers } = this.state; @@ -546,8 +532,6 @@ export class ListHybrid extends React.Component { {settingsVisible && } - {bulkEdit.open && } - {replicateUser.open ? this.getReplicateDialog(replicateUser) : null} {!importUsers.open ? null : ( diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 89f629b..6db31ad 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -47,7 +47,7 @@ export const UserListTable: React.FC = props => { filters: {id: ["in" as ListFilterType, ids]} as ListFilters }; compositionRoot.users.list(listOptions).run( - ({ pager, objects }: { pager: Pager, objects: User[]}) => { + ({ objects }: { objects: User[]}) => { console.log(objects) // state: { users: objects } history.push({ pathname: `/bulk-edit`, state: { users: objects } }); @@ -59,20 +59,6 @@ export const UserListTable: React.FC = props => { [history, compositionRoot, snackbar] ); - const editPredictor1 = (ids: string[]) => { - const listOptions = { - filters: {id: ["in" as ListFilterType, ids]} as ListFilters - }; - compositionRoot.users.list(listOptions).run( - ({ pager, objects }: { pager: Pager, objects: User[]}) => { - console.log(objects) - // state: { users: objects } - props.openBulkEdit(objects); - }, - error => snackbar.error(error) - ); - }; - const baseConfig = useMemo((): TableConfig => { return { columns, @@ -281,6 +267,5 @@ function isStateActionVisible(action: string) { export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; - openBulkEdit: (users: User[]) => void; filters: ListFilters; } From 86dbd4d1e48db5dcc02875728539146da476a1c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 12 Nov 2021 00:54:03 +1300 Subject: [PATCH 056/192] updated applyAndClose to select the org unit in the correct format --- src/legacy/components/OrgUnitsSelectorFilter.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index 74a85c5..6b06bc9 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -3,7 +3,7 @@ import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; -import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; +import { getOrgUnitsRoots, listWithInFilter } from "../utils/dhis2Helpers"; class OrgUnitsSelectorFilter extends React.Component { constructor(props, context) { @@ -58,8 +58,16 @@ class OrgUnitsSelectorFilter extends React.Component { this.setState({ selected }); } - applyAndClose() { - this.props.onChange(this.state.selected); + async applyAndClose() { + const { d2 } = this.context; + const orgUnitsPaths = this.state.selected; + const orgUnitIds = orgUnitsPaths.map(path => _.last(path.split("/"))); + const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { + paging: false, + fields: "id,displayName,shortName,path", + }); + + this.props.onChange(newSelected); this.closeDialog(); } From 012613993c46abc91ce15fed8d3e779bfcb6d3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 12 Nov 2021 01:05:37 +1300 Subject: [PATCH 057/192] added another OrgUnitsSelectorFilter --- src/legacy/List/Filters.component.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index f417583..1ea500a 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -7,7 +7,6 @@ import memoize from "memoize-weak"; import PropTypes from "prop-types"; import React from "react"; import MultipleFilter from "../components/MultipleFilter.component"; -import OrgUnitsFilter from "../components/OrgUnitsFilter.component"; import OrgUnitsSelectorFilter from "../components/OrgUnitsSelectorFilter"; import listActions from "./list.actions"; import listStore from "./list.store"; @@ -264,7 +263,8 @@ export default class Filters extends React.Component {
- Date: Thu, 11 Nov 2021 13:12:28 +0100 Subject: [PATCH 058/192] fixing some small mistakes --- i18n/en.pot | 236 +++++++++++++++-- i18n/es.po | 239 ++++++++++++++++-- src/data/repositories/UserD2ApiRepository.ts | 2 +- src/legacy/List/List.component.js | 8 +- src/legacy/components/InfoDialog.js | 6 +- src/types/d2-ui.d.ts | 3 - .../import-summary/ImportSummary.tsx | 4 +- src/webapp/components/user-form/UserForm.tsx | 7 +- .../user-form/components/OrgUnitLevelsFF.tsx | 2 +- .../user-form/components/OutputFF.tsx | 4 +- .../user-list-table/UserListTable.tsx | 10 +- src/webapp/pages/Router.tsx | 19 +- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 14 +- 13 files changed, 468 insertions(+), 86 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 69bcc43..d53f90c 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" -"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T11:46:52.240Z\n" +"PO-Revision-Date: 2021-11-11T11:46:52.240Z\n" msgid "Enable users" msgstr "" @@ -14,21 +14,228 @@ msgstr "" msgid "Disable users" msgstr "" -msgid "Replicate error" +msgid "Remove users" msgstr "" -msgid "Remove users" +msgid "Replicate error" msgstr "" msgid "Settings" msgstr "" +msgid "Columns to show in table" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Column" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Updated" +msgstr "" + +msgid "Deleted" +msgstr "" + +msgid "Ignored" +msgstr "" + +msgid "Total" +msgstr "" + +msgid "Identifier" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Import Results" +msgstr "" + +msgid "Ok" +msgstr "" + +msgid "Predictors" +msgstr "" + +msgid "Import" +msgstr "" + +msgid "Status" +msgstr "" + +msgid "Summary" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "JSON Response" +msgstr "" + msgid "Back" msgstr "" msgid "Help" msgstr "" +msgid "Please provide a valid identifier" +msgstr "" + +msgid "Invalid option" +msgstr "" + +msgid "Code" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Output data element" +msgstr "" + +msgid "Output category combo" +msgstr "" + +msgid "Period type" +msgstr "" + +msgid "Annual sample count" +msgstr "" + +msgid "Sequential sample count" +msgstr "" + +msgid "Sequential skip count" +msgstr "" + +msgid "Organisation unit levels" +msgstr "" + +msgid "Predictor groups" +msgstr "" + +msgid "Generator description" +msgstr "" + +msgid "Missing value strategy" +msgstr "" + +msgid "Generator formula" +msgstr "" + +msgid "Sample skip test description" +msgstr "" + +msgid "Sample skip test formula" +msgstr "" + +msgid "Sequence" +msgstr "" + +msgid "Variable" +msgstr "" + +msgid "Daily" +msgstr "" + +msgid "Weekly" +msgstr "" + +msgid "Weekly starting Wednesday" +msgstr "" + +msgid "Weekly starting Thursday" +msgstr "" + +msgid "Weekly starting Saturday" +msgstr "" + +msgid "Weekly starting Sunday" +msgstr "" + +msgid "Biweekly" +msgstr "" + +msgid "Monthly" +msgstr "" + +msgid "Bi-monthly" +msgstr "" + +msgid "Quarterly" +msgstr "" + +msgid "Six-monthly" +msgstr "" + +msgid "Six-monthly starting April" +msgstr "" + +msgid "Six-monthly starting November" +msgstr "" + +msgid "Yearly" +msgstr "" + +msgid "Financial year starting April" +msgstr "" + +msgid "Financial year starting July" +msgstr "" + +msgid "Financial year starting October" +msgstr "" + +msgid "Financial year starting November" +msgstr "" + +msgid "Skip if any value is missing" +msgstr "" + +msgid "Skip if all values are missing" +msgstr "" + +msgid "Never skip" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "" @@ -68,38 +275,35 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" +msgid "Organisation units" msgstr "" -msgid "Created" +msgid "Data view organisation units" msgstr "" -msgid "Last updated" +msgid "Disabled" msgstr "" -msgid "Roles" +msgid "Saving predictors" msgstr "" -msgid "Groups" +msgid "Network error" msgstr "" -msgid "Organisation units" +msgid "Error saving users" msgstr "" -msgid "Data view organisation units" +msgid "Save" msgstr "" -msgid "Last login" +msgid "Edit users" msgstr "" -msgid "Disabled" +msgid "Delete" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index a87d092..821ef85 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-11T11:46:52.240Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -11,21 +11,231 @@ msgstr "" msgid "Enable users" msgstr "" +msgid "Disable users" +msgstr "" + msgid "Remove users" msgstr "Eliminar usuarios" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Settings" msgstr "" +msgid "Columns to show in table" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "Column" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Updated" +msgstr "" + +msgid "Deleted" +msgstr "" + +msgid "Ignored" +msgstr "" + +msgid "Total" +msgstr "" + +msgid "Identifier" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Import Results" +msgstr "" + +msgid "Ok" +msgstr "" + +msgid "Predictors" +msgstr "" + +msgid "Import" +msgstr "" + +msgid "Status" +msgstr "" + +msgid "Summary" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "JSON Response" +msgstr "" + msgid "Back" msgstr "Volver" -msgid "Replicate error" -msgstr "Replicar error" - msgid "Help" msgstr "Ayuda" +msgid "Please provide a valid identifier" +msgstr "" + +msgid "Invalid option" +msgstr "" + +msgid "Code" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Output data element" +msgstr "" + +msgid "Output category combo" +msgstr "" + +msgid "Period type" +msgstr "" + +msgid "Annual sample count" +msgstr "" + +msgid "Sequential sample count" +msgstr "" + +msgid "Sequential skip count" +msgstr "" + +msgid "Organisation unit levels" +msgstr "" + +msgid "Predictor groups" +msgstr "" + +msgid "Generator description" +msgstr "" + +msgid "Missing value strategy" +msgstr "" + +msgid "Generator formula" +msgstr "" + +msgid "Sample skip test description" +msgstr "" + +msgid "Sample skip test formula" +msgstr "" + +msgid "Sequence" +msgstr "" + +msgid "Variable" +msgstr "" + +msgid "Daily" +msgstr "" + +msgid "Weekly" +msgstr "" + +msgid "Weekly starting Wednesday" +msgstr "" + +msgid "Weekly starting Thursday" +msgstr "" + +msgid "Weekly starting Saturday" +msgstr "" + +msgid "Weekly starting Sunday" +msgstr "" + +msgid "Biweekly" +msgstr "" + +msgid "Monthly" +msgstr "" + +msgid "Bi-monthly" +msgstr "" + +msgid "Quarterly" +msgstr "" + +msgid "Six-monthly" +msgstr "" + +msgid "Six-monthly starting April" +msgstr "" + +msgid "Six-monthly starting November" +msgstr "" + +msgid "Yearly" +msgstr "" + +msgid "Financial year starting April" +msgstr "" + +msgid "Financial year starting July" +msgstr "" + +msgid "Financial year starting October" +msgstr "" + +msgid "Financial year starting November" +msgstr "" + +msgid "Skip if any value is missing" +msgstr "" + +msgid "Skip if all values are missing" +msgstr "" + +msgid "Never skip" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "Detalles" @@ -65,38 +275,35 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" +msgid "Organisation units" msgstr "" -msgid "Created" +msgid "Data view organisation units" msgstr "" -msgid "Last updated" +msgid "Disabled" msgstr "" -msgid "Roles" +msgid "Saving predictors" msgstr "" -msgid "Groups" +msgid "Network error" msgstr "" -msgid "Organisation units" +msgid "Error saving users" msgstr "" -msgid "Data view organisation units" +msgid "Save" msgstr "" -msgid "Last login" +msgid "Edit users" msgstr "" -msgid "Disabled" +msgid "Delete" msgstr "" diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index db729a4..2fa61f3 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -24,7 +24,7 @@ export class UserD2ApiRepository implements UserRepository { public list(options: ListOptions): FutureData> { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); - console.log(otherFilters) + return apiToFuture( this.api.models.users.get({ fields, diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 9f8454e..a9f4b4b 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -35,7 +35,7 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; -import { UserBulkEditPage } from "../../webapp/pages/user-bulk-edit/UserBulkEditPage"; +import { UserBulkEditPage } from "../../webapp/pages/user-bulk-edit/UserBulkEditPage"; const pageSize = 50; const initialSorting = ["name", "asc"]; @@ -223,10 +223,7 @@ export class ListHybrid extends React.Component { }; setAssignState = (key, value) => { - this.setState( - { [key]: value }, - () => !value.open && this.filterList({ page: this.state.pager.page }) - ); + this.setState({ [key]: value }, () => !value.open && this.filterList({ page: this.state.pager.page })); }; componentWillReceiveProps(newProps) { @@ -414,7 +411,6 @@ export class ListHybrid extends React.Component { diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index c266ded..5dc4370 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -30,7 +30,9 @@ const InfoDialog = ({ t, title, onClose, response }) => { maxWidth={"sm"} fullWidth={true} onCancel={onClose} - onSave={() => {navigator.clipboard.writeText(details)}} + onSave={() => { + navigator.clipboard.writeText(details); + }} saveText={t("copy_to_clipboard")} cancelText={t("close")} > @@ -50,4 +52,4 @@ InfoDialog.propTypes = { onClose: PropTypes.func.isRequired, }; -export default InfoDialog; \ No newline at end of file +export default InfoDialog; diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 4cda31e..8a8b0da 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -314,7 +314,4 @@ declare module "@dhis2/ui" { export function InputFieldFF(props: InputFieldFFProps): React.ReactElement; export function integer(value: unknown): string | undefined; export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; - - - } diff --git a/src/webapp/components/import-summary/ImportSummary.tsx b/src/webapp/components/import-summary/ImportSummary.tsx index 97ba791..0e787e3 100644 --- a/src/webapp/components/import-summary/ImportSummary.tsx +++ b/src/webapp/components/import-summary/ImportSummary.tsx @@ -134,7 +134,7 @@ export const ImportSummary = ({ results, onClose }: ImportSummaryProps) => { > {results.map(({ status, typeReports = [] }, idx) => { - const stats = typeReports.map(({ stats }: {stats: any}) => ({ + const stats = typeReports.map(({ stats }: { stats: any }) => ({ type: i18n.t("Predictors"), ...stats, })); @@ -198,4 +198,4 @@ export const ImportSummary = ({ results, onClose }: ImportSummaryProps) => { ); -}; \ No newline at end of file +}; diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index c74d7e4..6480217 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -25,10 +25,7 @@ import { predictorRequiredFields, } from "./utils"; -const useValidations = ( - field: PredictorFormField, -): { validation?: (...args: any[]) => any; props?: object } => { - +const useValidations = (field: PredictorFormField): { validation?: (...args: any[]) => any; props?: object } => { switch (field) { case "id": return { validation: createPattern(fullUidRegex, i18n.t("Please provide a valid identifier")) }; @@ -58,7 +55,7 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto validate: validation, ...validationProps, }; -/* + /* case "output": return ; */ diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx index 4165756..52cb860 100644 --- a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx +++ b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx @@ -12,7 +12,7 @@ export const OrgUnitLevelsFF: React.FC> = props compositionRoot.metadata.list("organisationUnitLevels").map(({ objects }) => buildTransferOptions(objects)), [] );*/ - const options1 = [{label: "test1", value: "test1"}] + const options1 = [{ label: "test1", value: "test1" }]; return ( = props => { history.push(`/edit/${ids[0]}`); } else { const listOptions = { - filters: {id: ["in" as ListFilterType, ids]} as ListFilters + filters: { id: ["in" as ListFilterType, ids] } as ListFilters, }; compositionRoot.users.list(listOptions).run( - ({ objects }: { objects: User[]}) => { - console.log(objects) - // state: { users: objects } + ({ objects }: { objects: User[] }) => { + console.log(objects); + // state: { users: objects } history.push({ pathname: `/bulk-edit`, state: { users: objects } }); }, error => snackbar.error(error) @@ -74,7 +74,7 @@ export const UserListTable: React.FC = props => { { name: "userGroups", text: i18n.t("Groups") }, { name: "organisationUnits", text: i18n.t("OU Capture") }, { name: "dataViewOrganisationUnits", text: i18n.t("OU Output") }, - ], + ], actions: [ { name: "details", diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index bb68dbe..3a704ff 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -3,26 +3,12 @@ import { HashRouter, Route, Switch, Redirect } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; import { UserBulkEditPage, ActionType } from "./user-bulk-edit/UserBulkEditPage"; -/* -( - - - - )} - /> -*/ + export const Router: React.FC = React.memo(() => { return ( - ( - - )} - /> + } /> ( @@ -31,7 +17,6 @@ export const Router: React.FC = React.memo(() => { )} /> - ); diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index af6ba73..44c6dd5 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -12,8 +12,8 @@ import { Redirect, useLocation } from "react-router"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeGrid as Grid } from "react-window"; import styled from "styled-components"; -//import { MetadataResponse } from "../../../domain/entities/Metadata"; //will I use the clean architecture? -import { User } from "../../../domain/entities/User"; +//import { MetadataResponse } from "../../../domain/entities/Metadata"; //will I use the clean architecture? +import { User } from "../../../domain/entities/User"; import i18n from "../../../locales"; import { ColumnSelectorDialog } from "../../components/column-selector-dialog/ColumnSelectorDialog"; @@ -76,7 +76,7 @@ export const UserBulkEditPage = () => { - {({ height, width }: {height: number, width: number}) => ( + {({ height, width }: { height: number; width: number }) => ( { */ -const basePredictorColumns = [ - "id", - "name", - "email", - "userCredentials.userRoles", - "userCredentials.userGroups", -]; +const basePredictorColumns = ["id", "name", "email", "userCredentials.userRoles", "userCredentials.userGroups"]; const MaxHeight = styled.div` height: 95%; From 42c911384689adb5abae66a26097d8c9d1adbb8b Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 13:44:25 +0100 Subject: [PATCH 059/192] Review possible undefined Signed-off-by: Alexis Rico --- src/legacy/App/App.component.js | 5 +---- src/legacy/List/Filters.component.js | 2 +- src/legacy/List/List.component.js | 2 +- src/legacy/Snackbar/SnackbarContainer.component.js | 2 +- src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/legacy/App/App.component.js b/src/legacy/App/App.component.js index c829a80..80f1823 100644 --- a/src/legacy/App/App.component.js +++ b/src/legacy/App/App.component.js @@ -48,10 +48,7 @@ class App extends AppWithD2 { componentWillUnmount = () => { super.componentWillUnmount(); - - if (this.disposable && this.disposable.dispose) { - this.disposable.dispose(); - } + this.disposable.dispose?.(); }; render = () => { diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 545dd67..a3ef5f5 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -74,7 +74,7 @@ export default class Filters extends React.Component { }; componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index a9f4b4b..d39acae 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -67,7 +67,7 @@ export class ListHybrid extends React.Component { }; componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { diff --git a/src/legacy/Snackbar/SnackbarContainer.component.js b/src/legacy/Snackbar/SnackbarContainer.component.js index df90425..1ff8fca 100644 --- a/src/legacy/Snackbar/SnackbarContainer.component.js +++ b/src/legacy/Snackbar/SnackbarContainer.component.js @@ -5,7 +5,7 @@ import snackStore from "./snack.store"; class SnackBarContainer extends React.Component { componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 44c6dd5..89af97f 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -43,7 +43,7 @@ export const UserBulkEditPage = () => { //const loading = useLoading(); const location = useLocation<{ users: User[] }>(); - const [usersToEdit] = React.useState(location.state.users ?? []); + const [usersToEdit] = React.useState(location.state?.users ?? []); const [summary, setSummary] = useState(); //MetadataResponse const [columns, setColumns] = useState(basePredictorColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); From 9733cf577dde624b97d5f72d69d40aa8a0b0c3ec Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 13:47:30 +0100 Subject: [PATCH 060/192] Remove old app subscription Signed-off-by: Alexis Rico --- src/legacy/App/App.component.js | 34 --------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/legacy/App/App.component.js b/src/legacy/App/App.component.js index 80f1823..0e8a19d 100644 --- a/src/legacy/App/App.component.js +++ b/src/legacy/App/App.component.js @@ -4,11 +4,9 @@ import SinglePanelLayout from "d2-ui/lib/layout/SinglePanel.component"; import { getInstance } from "d2/lib/d2"; import PropTypes from "prop-types"; import React from "react"; -import { Observable } from "rx"; import LoadingMask from "../loading-mask/LoadingMask.component"; import SnackbarContainer from "../Snackbar/SnackbarContainer.component"; import appTheme from "./app.theme"; -import appState from "./appStateStore"; const withMuiContext = Object.assign(AppWithD2.childContextTypes, { muiTheme: PropTypes.object }); @@ -19,38 +17,6 @@ class App extends AppWithD2 { }); } - componentDidMount = () => { - super.componentDidMount(); - - // The all section is a special section that should not be treated like a normal section as it does not - // have the sidebar. It is used to display the collection of all meta data objects. The all section will - // therefore always emit false. - const allSectionSelected$ = appState.filter(state => state.sideBar.currentSection === "all").map(() => false); - - const nonAllSectionSelected$ = appState - // The all section is managed separately so we do not want to process those any further - .filter(state => state.sideBar.currentSection !== "all") - .map(state => - // Check if the current section is in the list of mainSections - state.mainSections.some(mainSection => mainSection.key === state.sideBar.currentSection) - ); - - this.disposable = Observable.merge(allSectionSelected$, nonAllSectionSelected$) - // Do not emit the value more often than needed to prevent unnecessary react triggers - .distinctUntilChanged() - .subscribe(hasSection => - this.setState({ - ...this.state, - hasSection, - }) - ); - }; - - componentWillUnmount = () => { - super.componentWillUnmount(); - this.disposable.dispose?.(); - }; - render = () => { if (!this.state.d2) { return ; From 911ee3c51f9b93b3809cbc57807e08615957cf4f Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 13:44:25 +0100 Subject: [PATCH 061/192] Review possible undefined Signed-off-by: Alexis Rico --- src/legacy/App/App.component.js | 5 +---- src/legacy/List/Filters.component.js | 2 +- src/legacy/List/List.component.js | 2 +- src/legacy/Snackbar/SnackbarContainer.component.js | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/legacy/App/App.component.js b/src/legacy/App/App.component.js index c829a80..80f1823 100644 --- a/src/legacy/App/App.component.js +++ b/src/legacy/App/App.component.js @@ -48,10 +48,7 @@ class App extends AppWithD2 { componentWillUnmount = () => { super.componentWillUnmount(); - - if (this.disposable && this.disposable.dispose) { - this.disposable.dispose(); - } + this.disposable.dispose?.(); }; render = () => { diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 545dd67..a3ef5f5 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -74,7 +74,7 @@ export default class Filters extends React.Component { }; componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index d78721c..a9b0985 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -67,7 +67,7 @@ export class ListHybrid extends React.Component { }; componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { diff --git a/src/legacy/Snackbar/SnackbarContainer.component.js b/src/legacy/Snackbar/SnackbarContainer.component.js index df90425..1ff8fca 100644 --- a/src/legacy/Snackbar/SnackbarContainer.component.js +++ b/src/legacy/Snackbar/SnackbarContainer.component.js @@ -5,7 +5,7 @@ import snackStore from "./snack.store"; class SnackBarContainer extends React.Component { componentWillUnmount = () => { - this.observerDisposables.forEach(disposable => disposable.dispose()); + this.observerDisposables.forEach(disposable => disposable.dispose?.()); }; registerDisposable = disposable => { From 2c7c9b1686ac70b68c0927a2458ea1d6bf086001 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Thu, 11 Nov 2021 13:47:30 +0100 Subject: [PATCH 062/192] Remove old app subscription Signed-off-by: Alexis Rico --- src/legacy/App/App.component.js | 34 --------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/legacy/App/App.component.js b/src/legacy/App/App.component.js index 80f1823..0e8a19d 100644 --- a/src/legacy/App/App.component.js +++ b/src/legacy/App/App.component.js @@ -4,11 +4,9 @@ import SinglePanelLayout from "d2-ui/lib/layout/SinglePanel.component"; import { getInstance } from "d2/lib/d2"; import PropTypes from "prop-types"; import React from "react"; -import { Observable } from "rx"; import LoadingMask from "../loading-mask/LoadingMask.component"; import SnackbarContainer from "../Snackbar/SnackbarContainer.component"; import appTheme from "./app.theme"; -import appState from "./appStateStore"; const withMuiContext = Object.assign(AppWithD2.childContextTypes, { muiTheme: PropTypes.object }); @@ -19,38 +17,6 @@ class App extends AppWithD2 { }); } - componentDidMount = () => { - super.componentDidMount(); - - // The all section is a special section that should not be treated like a normal section as it does not - // have the sidebar. It is used to display the collection of all meta data objects. The all section will - // therefore always emit false. - const allSectionSelected$ = appState.filter(state => state.sideBar.currentSection === "all").map(() => false); - - const nonAllSectionSelected$ = appState - // The all section is managed separately so we do not want to process those any further - .filter(state => state.sideBar.currentSection !== "all") - .map(state => - // Check if the current section is in the list of mainSections - state.mainSections.some(mainSection => mainSection.key === state.sideBar.currentSection) - ); - - this.disposable = Observable.merge(allSectionSelected$, nonAllSectionSelected$) - // Do not emit the value more often than needed to prevent unnecessary react triggers - .distinctUntilChanged() - .subscribe(hasSection => - this.setState({ - ...this.state, - hasSection, - }) - ); - }; - - componentWillUnmount = () => { - super.componentWillUnmount(); - this.disposable.dispose?.(); - }; - render = () => { if (!this.state.d2) { return ; From 8aa291439d36398bce2a65ed5ce335605815c0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Sat, 13 Nov 2021 00:23:53 +1300 Subject: [PATCH 063/192] map OUs or OU paths so there is no conflict with the components --- .../components/OrgUnitsSelectorFilter.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index 6b06bc9..e24b2f7 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -3,11 +3,12 @@ import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; -import { getOrgUnitsRoots, listWithInFilter } from "../utils/dhis2Helpers"; +import { listWithInFilter } from "../utils/dhis2Helpers"; class OrgUnitsSelectorFilter extends React.Component { constructor(props, context) { super(props, context); + this.getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); this.openDialog = this.openDialog.bind(this); this.closeDialog = this.closeDialog.bind(this); @@ -17,7 +18,6 @@ class OrgUnitsSelectorFilter extends React.Component { this.state = { dialogOpen: false, selected: props.selected, - roots: [], }; } @@ -38,10 +38,6 @@ class OrgUnitsSelectorFilter extends React.Component { }, }; - componentDidMount() { - return getOrgUnitsRoots().then(roots => this.setState({ roots })); - } - componentWillReceiveProps(newProps) { if (newProps.selected !== this.props.selected) this.fieldValue = this.getCompactFieldValue(newProps.selected); } @@ -58,10 +54,15 @@ class OrgUnitsSelectorFilter extends React.Component { this.setState({ selected }); } + getOuPaths() { + return this.state.selected.map(ouOrPath => + typeof ouOrPath === "object" && "path" in ouOrPath ? ouOrPath.path : ouOrPath + ); + } + async applyAndClose() { const { d2 } = this.context; - const orgUnitsPaths = this.state.selected; - const orgUnitIds = orgUnitsPaths.map(path => _.last(path.split("/"))); + const orgUnitIds = this.getOuPaths().map(path => _.last(path.split("/"))); const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { paging: false, fields: "id,displayName,shortName,path", @@ -103,7 +104,7 @@ class OrgUnitsSelectorFilter extends React.Component { > Date: Sat, 13 Nov 2021 00:56:05 +1300 Subject: [PATCH 064/192] call OrgUnitDialog with api --- src/legacy/List/List.component.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 10a8169..d4ed46b 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -433,6 +433,7 @@ export class ListHybrid extends React.Component { {this.state.orgunitassignment.open && this.state.orgunitassignment.field === "organisationUnits" ? ( Date: Sun, 14 Nov 2021 11:28:59 +0100 Subject: [PATCH 065/192] got the fields to show up with the user data, edited the fields to what I think should be there, added the header and go back functionality, tried doing the save api function but had a lot of trouble, created UserModel schema for the save API. --- src/CompositionRoot.ts | 3 + src/data/models/DHIS2Model.ts | 12 + src/data/models/UserModel.ts | 84 ++++ src/data/repositories/UserD2ApiRepository.ts | 46 +- src/domain/repositories/UserRepository.ts | 2 + src/domain/usecases/SaveUsersUseCase.ts | 13 + src/types/d2-ui.d.ts | 405 ++++++++++++------ src/webapp/components/user-form/UserForm.tsx | 36 +- src/webapp/components/user-form/utils.ts | 79 +--- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 105 ++--- 10 files changed, 509 insertions(+), 276 deletions(-) create mode 100644 src/data/models/DHIS2Model.ts create mode 100644 src/data/models/UserModel.ts create mode 100644 src/domain/usecases/SaveUsersUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 05844ef..7f0eb9c 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -5,6 +5,8 @@ import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; +import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; + export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); @@ -18,6 +20,7 @@ export function getCompositionRoot(instance: Instance) { getCurrent: new GetCurrentUserUseCase(userRepository), list: new ListUsersUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), + save: new SaveUsersUseCase(userRepository) }), }; } diff --git a/src/data/models/DHIS2Model.ts b/src/data/models/DHIS2Model.ts new file mode 100644 index 0000000..168f8bc --- /dev/null +++ b/src/data/models/DHIS2Model.ts @@ -0,0 +1,12 @@ +import { NamedRef, Ref } from "../../domain/entities/Ref"; +import { Codec, Schema } from "../../utils/codec"; + +export const RefModel: Codec = Schema.object({ + id: Schema.string, +}); + +export const NamedRefModel: Codec = Schema.object({ + id: Schema.string, + name: Schema.optionalSafe(Schema.string, "Unknown"), +}); + diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts new file mode 100644 index 0000000..b2e1084 --- /dev/null +++ b/src/data/models/UserModel.ts @@ -0,0 +1,84 @@ +import { User, UserRole, AccessPermissions } from "../../domain/entities/User"; +import { Codec, Schema } from "../../utils/codec"; +import { NamedRefModel } from "./DHIS2Model"; + +/* +export interface User { + id: string; + name: string; + username: string; + firstName: string; + surname: string; + email: string; + lastUpdated: Date; + created: Date; + userRoles: UserRole[]; + userGroups: NamedRef[]; + organisationUnits: NamedRef[]; + dataViewOrganisationUnits: NamedRef[]; + lastLogin: Date; + disabled: boolean; + access: AccessPermissions; +} + +export interface AccessPermissions { + read?: boolean; + update?: boolean; + externalize?: boolean; + delete?: boolean; + write?: boolean; + manage?: boolean; +} +*/ +export const AccessPermissionsModel: Codec = Schema.object({ + read: Schema.optional(Schema.boolean), + update: Schema.optional(Schema.boolean), + externalize: Schema.optional(Schema.boolean), + delete: Schema.optional(Schema.boolean), + write: Schema.optional(Schema.boolean), + manage: Schema.optional(Schema.boolean), +}); + +export const UserRolesModel: Codec = Schema.object({ + id: Schema.nonEmptyString, + name: Schema.nonEmptyString, + authorities: Schema.array(Schema.string), +}); + +/* +export interface User { + id: string; + name: string; + username: string; + firstName: string; + surname: string; + email: string; + lastUpdated: Date; + created: Date; + userRoles: UserRole[]; + userGroups: NamedRef[]; + organisationUnits: NamedRef[]; + dataViewOrganisationUnits: NamedRef[]; + lastLogin: Date; + disabled: boolean; + access: AccessPermissions; +} +*/ + +export const UserModel: Codec = Schema.object({ + id: Schema.nonEmptyString, + name: Schema.nonEmptyString, + username: Schema.nonEmptyString, + firstName: Schema.nonEmptyString, + surname: Schema.nonEmptyString, + email: Schema.nonEmptyString, + lastUpdated: Schema.date, + created: Schema.date, + userRoles: UserRolesModel, + userGroups: Schema.array(NamedRefModel), + organisationUnits: Schema.array(NamedRefModel), + dataViewOrganisationUnits: Schema.array(NamedRefModel), + lastLogin: Schema.date, + disabled: Schema.boolean, + access: AccessPermissionsModel +}); diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 2fa61f3..de532ce 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,4 +1,4 @@ -import { D2Api, D2UserSchema, SelectedPick } from "@eyeseetea/d2-api/2.34"; +import { D2Api, D2UserSchema, SelectedPick, MetadataResponse, Pager } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -8,6 +8,8 @@ import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; import { Instance } from "../entities/Instance"; +import { UserModel } from "../models/UserModel"; +import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -51,6 +53,48 @@ export class UserD2ApiRepository implements UserRepository { return Future.success(this.mapUser(user)); }); } + public save(usersToSave: User[]): FutureData { + Future.success(); + } + /*public save(usersToSave: User[]): FutureData { + const validations = usersToSave.map(user => UserModel.decode(user)); + const users = _.compact(validations.map(either => either.toMaybe().extract())); + const errors = _.compact(validations.map(either => either.leftOrDefault(""))); + if (errors.length > 0) { + return Future.error(errors.join("\n")); + } + //return apiToFuture(this.api.metadata.post({ users })); + const userIds = users.map(({ id }) => id); + const listOptions = { + filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, + }; + return apiToFuture(this.api.metadata.post({ users })); + /*return this.list(listOptions).run(existingPredictors => + apiToFuture(this.api.metadata.post({ users: existingPredictors })) + + ) + );*/ + //const saveMetadata$ = apiToFuture(this.api.metadata.post({ users })); + + /*return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap(({ objects }) => { + const [user] = objects; + if (!user) return Future.error(`User ${id} not found`); + + return Future.success(this.mapUser(user)); + });*? + + return this.get(predictors.map(({ id }) => id)).flatMap(existingPredictors => + this.getGroupsToSave(inputPredictors, existingPredictors).flatMap(predictorGroups => { + const saveMetadata$ = apiToFuture(this.api.metadata.post({ predictors, predictorGroups })); + const saveDataStore$ = this.storageRepository.saveObjectsInCollection( + Namespaces.SCHEDULING, + scheduling + ); + + return Future.join2(saveMetadata$, saveDataStore$).map(([metadataResponse]) => [metadataResponse]); + }) + ); + }*/ private mapUser(user: D2ApiUser): User { return { diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 4df5ffd..67cc64e 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -6,6 +6,8 @@ export interface UserRepository { getCurrent(): FutureData; list(options: ListOptions): FutureData>; getById(id: string): FutureData; + save(users: User[]): FutureData; + } export interface ListOptions { diff --git a/src/domain/usecases/SaveUsersUseCase.ts b/src/domain/usecases/SaveUsersUseCase.ts new file mode 100644 index 0000000..6869379 --- /dev/null +++ b/src/domain/usecases/SaveUsersUseCase.ts @@ -0,0 +1,13 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { User } from "../entities/User"; +import { UserRepository } from "../repositories/UserRepository"; +import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; + +export class SaveUsersUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute(usersToSave: User[]): FutureData { + return this.userRepository.save(usersToSave); + } +} diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 8a8b0da..06a1711 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -26,6 +26,84 @@ declare module "@dhis2/ui" { visited?: boolean; } + type FinalFormInput = { + name: string; + value?: any; + onBlur?: (data: any, event: FocusEvent) => void; + onChange?: (data: any, event: ChangeEvent) => void; + onFocus?: (data: any, event: FocusEvent) => void; + }; + + type FinalFormMeta = { + error?: string; + invalid?: boolean; + touched?: boolean; + valid?: boolean; + validating?: boolean; + }; + + export type InputFieldProps = { + className?: string; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + error?: boolean; + helpText?: string; + initialFocus?: boolean; + inputWidth?: string; + label?: string; + loading?: boolean; + max?: string; + min?: string; + name?: string; + placeholder?: string; + readOnly?: boolean; + required?: boolean; + step?: string; + tabIndex?: string; + type?: + | "button" + | "checkbox" + | "color" + | "date" + | "datetime-local" + | "email" + | "file" + | "hidden" + | "image" + | "month" + | "number" + | "password" + | "radio" + | "range" + | "reset" + | "search" + | "submit" + | "tel" + | "text" + | "time" + | "url" + | "week"; + valid?: boolean; + validationText?: string; + value?: string; + warning?: boolean; + onBlur?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; + onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + }; + + export type InputFieldFFProps = InputFieldProps & { + input: FinalFormInput; + meta: FinalFormMeta; + error?: boolean; + loading?: boolean; + showLoadingStatus?: boolean; + showValidStatus?: boolean; + valid?: boolean; + validationText?: string; + }; + export type ButtonProps = { children?: ReactNode; className?: string; @@ -48,35 +126,12 @@ declare module "@dhis2/ui" { onFocus?: (data: { value?: string; name?: string }, event: FocusEvent) => void; }; - export type ButtonStripProps = { - children: React.ReactNode; - className?: string; - dataTest?: string; - end?: boolean; - middle?: boolean; - }; - - export type NoticeBoxProps = { - children?: React.ReactNode; - className?: string; - dataTest?: string; - error?: boolean; - title?: string; - warning?: boolean; - }; - - export type CenteredContentProps = { - children?: React.ReactNode; - dataTest?: string; - className?: string; - position?: "top" | "bottom" | "middle"; - }; - export type TransferOption = { label: string; value: string; disabled?: boolean; }; + export type TransferProps = { options: TransferOption[]; onChange: (params: { selected: string[] }) => void; @@ -122,55 +177,52 @@ declare module "@dhis2/ui" { onFilterChangePicked?: (...args: any[]) => any; }; - export type InputFieldProps = { - className?: string; - dataTest?: string; - dense?: boolean; - disabled?: boolean; + export type MultiSelectProps = { + children: React.ReactNode; + className: string; + /** Required if `clearable` prop is `true` */ + clearText: string; + /** Adds a 'clear' option to the menu */ + clearable: boolean; + dataTest: string; + dense: boolean; + disabled: boolean; + empty: React.ReactNode; + error: boolean; + filterPlaceholder: string; + /** Adds a 'filter' field to the menu */ + filterable: boolean; + initialFocus: boolean; + inputMaxHeight: string; + loading: boolean; + loadingText: string; + maxHeight: string; + /** Required if `filterable` prop is `true` */ + noMatchText: string; + placeholder: string; + prefix: string; + selected: string[]; + tabIndex: string; + valid: boolean; + warning: boolean; + onBlur?: (data: { value?: string; name?: string }, event: FocusEvent) => void; + onChange?: (data: { value?: string; name?: string }, event: ChangeEvent) => void; + onFocus?: (data: { value?: string; name?: string }, event: FocusEvent) => void; + }; + + export type MultiSelectFieldFFProps = MultiSelectProps & { + input: FinalFormInput; + meta: FinalFormMeta; error?: boolean; - helpText?: string; - initialFocus?: boolean; - inputWidth?: string; - label?: string; loading?: boolean; - max?: string; - min?: string; - name?: string; - placeholder?: string; - readOnly?: boolean; - required?: boolean; - step?: string; - tabIndex?: string; - type?: - | "button" - | "checkbox" - | "color" - | "date" - | "datetime-local" - | "email" - | "file" - | "hidden" - | "image" - | "month" - | "number" - | "password" - | "radio" - | "range" - | "reset" - | "search" - | "submit" - | "tel" - | "text" - | "time" - | "url" - | "week"; + options?: { + label?: string; + value?: string; + }[]; + showLoadingStatus?: boolean; + showValidStatus?: boolean; valid?: boolean; validationText?: string; - value?: string; - warning?: boolean; - onBlur?: (data: { name?: string; value?: string }, event: FocusEvent) => void; - onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; - onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; }; export type SingleSelectFieldProps = { @@ -217,101 +269,200 @@ declare module "@dhis2/ui" { onClick?: (...args: any[]) => any; }; - export type InputFieldProps = { + export type SingleSelectFieldFFProps = SingleSelectFieldProps & { + input: FinalFormInput; + meta: FinalFormMeta; + options: { + label?: string; + value?: string; + }[]; + error?: boolean; + loading?: boolean; + showLoadingStatus?: boolean; + showValidStatus?: boolean; + valid?: boolean; + validationText?: string; + }; + + export type TabProps = { + children: React.ReactNode; + className?: string; + dataTest?: string; + disabled?: boolean; + icon?: JSX.Element; + selected?: boolean; + onClick?: (value: {}, event: MouseEvent) => void; + }; + + export type TabBarProps = { + children: React.ReactNode; + className?: string; + dataTest?: string; + fixed?: boolean; + scrollable?: boolean; + }; + + export type MenuProps = { + children: React.ReactNode; + className?: string; + dataTest?: string; + dense?: boolean; + }; + + export type MenuItemProps = { + active?: boolean; + chevron?: boolean; className?: string; dataTest?: string; dense?: boolean; + destructive?: boolean; disabled?: boolean; + href?: string; + icon?: React.ReactNode; + label?: React.ReactNode; + showSubMenu?: boolean; + target?: string; + toggleSubMenu?: (...args: any[]) => any; + value?: string; + onClick?: (data: { value?: string }, event: MouseEvent) => void; + }; + + export type PaginationProps = { + page: number; + pageCount: number; + pageSize: number; + total: number; + className?: string; + dataTest?: string; + hidePageSelect?: boolean; + hidePageSizeSelect?: boolean; + nextPageText?: string | ((...args: any[]) => any); + pageSelectText?: string | ((...args: any[]) => any); + pageSizeSelectText?: string | ((...args: any[]) => any); + pageSizes?: string[]; + pageSummaryText?: string | ((...args: any[]) => any); + previousPageText?: string | ((...args: any[]) => any); + onPageChange: (page: number) => void; + onPageSizeChange: (pageSize: number) => void; + }; + + export type ButtonStripProps = { + children: React.ReactNode; + className?: string; + dataTest?: string; + end?: boolean; + middle?: boolean; + }; + + export type NoticeBoxProps = { + children?: React.ReactNode; + className?: string; + dataTest?: string; error?: boolean; - helpText?: string; + title?: string; + warning?: boolean; + }; + + export type CheckboxFieldProps = { + checked?: boolean; + className?: string; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + error?: boolean; + indeterminate?: boolean; initialFocus?: boolean; - inputWidth?: string; - label?: string; - loading?: boolean; - max?: string; - min?: string; + label?: React.ReactNode; name?: string; - placeholder?: string; - readOnly?: boolean; - required?: boolean; - step?: string; tabIndex?: string; - type?: - | "button" - | "checkbox" - | "color" - | "date" - | "datetime-local" - | "email" - | "file" - | "hidden" - | "image" - | "month" - | "number" - | "password" - | "radio" - | "range" - | "reset" - | "search" - | "submit" - | "tel" - | "text" - | "time" - | "url" - | "week"; valid?: boolean; - validationText?: string; value?: string; warning?: boolean; - onBlur?: (data: { name?: string; value?: string }, event: FocusEvent) => void; - onChange?: (data: { name?: string; value?: string }, event: ChangeEvent) => void; - onFocus?: (data: { name?: string; value?: string }, event: FocusEvent) => void; + onBlur?: (data: { value?: string; name?: string; checked: boolean }, event: FocusEvent) => void; + onChange?: (data: { value?: string; name?: string; checked: boolean }, event: ChangeEvent) => void; + onFocus?: (data: { value?: string; name?: string; checked: boolean }, event: FocusEvent) => void; }; - export type InputFieldFFProps = InputFieldProps & { + export type CheckboxFieldFFProps = CheckboxFieldProps & { input: FinalFormInput; meta: FinalFormMeta; error?: boolean; - loading?: boolean; - showLoadingStatus?: boolean; showValidStatus?: boolean; valid?: boolean; validationText?: string; }; - export type SingleSelectFieldFFProps = SingleSelectFieldProps & { + type SwitchFieldProps = { + ariaLabel?: string; + checked?: boolean; + className?: string; + dataTest?: string; + dense?: boolean; + disabled?: boolean; + error?: boolean; + initialFocus?: boolean; + label?: React.ReactNode; + name?: string; + role?: string; + tabIndex?: string; + valid?: boolean; + value?: string; + warning?: boolean; + onBlur?: (data: { name?: string; value?: string; checked: boolean }, event: FocusEvent) => void; + onChange?: (data: { name?: string; value?: string; checked: boolean }, event: ChangeEvent) => void; + onFocus?: (data: { name?: string; value?: string; checked: boolean }, event: FocusEvent) => void; + }; + + export type SwitchFieldFFProps = SwitchFieldProps & { input: FinalFormInput; meta: FinalFormMeta; - options: { - label?: string; - value?: string; - }[]; - error?: boolean; - loading?: boolean; - showLoadingStatus?: boolean; showValidStatus?: boolean; - valid?: boolean; validationText?: string; }; - export function HeaderBar(props: { className?: string; appName?: string }): React.ReactElement; + export type CenteredContentProps = { + children?: React.ReactNode; + dataTest?: string; + className?: string; + position?: "top" | "bottom" | "middle"; + }; + + export function HeaderBar(props: { className?: string; appName: string }): React.ReactElement; + export function InputField(props: InputFieldProps): React.ReactElement; + export function InputFieldFF(props: InputFieldFFProps): React.ReactElement; export function Button(props: ButtonProps): React.ReactElement; - export function ButtonStrip(props: ButtonStripProps): React.ReactElement; - export function NoticeBox(props: NoticeBoxProps): React.ReactElement; - export function CenteredContent(props: CenteredContentProps): React.ReactElement; export function Transfer(props: TransferProps): React.ReactElement; - export function InputField(props: InputFieldProps): React.ReactElement; + export function MultiSelect(props: MultiSelectProps): React.ReactElement; + export function MultiSelectFieldFF(props: MultiSelectFieldFFProps): React.ReactElement; + export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; export function SingleSelectField(props: SingleSelectFieldProps): React.ReactElement; export function SingleSelectOption(props: SingleSelectOptionProps): React.ReactElement; + export function Tab(props: TabProps): React.ReactElement; + export function TabBar(props: TabBarProps): React.ReactElement; + export function Menu(props: MenuProps): React.ReactElement; + export function MenuItem(props: MenuItemProps): React.ReactElement; + export function Pagination(props: PaginationProps): React.ReactElement; + export function ButtonStrip(props: ButtonStripProps): React.ReactElement; + export function NoticeBox(props: NoticeBoxProps): React.ReactElement; + export function CheckboxField(props: CheckboxFieldProps): React.ReactElement; + export function CheckboxFieldFF(props: CheckboxFieldFFProps): React.ReactElement; + export function SwitchField(props: SwitchFieldProps): React.ReactElement; + export function SwitchFieldFF(props: SwitchFieldFFProps): React.ReactElement; + export function CenteredContent(props: CenteredContentProps): React.ReactElement; + export function composeValidators( ...validators: ((value: unknown) => string | undefined)[] ): (value: unknown) => string | undefined; + export function integer(value: unknown): string | undefined; + export function boolean(value: unknown): string | undefined; + export function alphaNumeric(value: unknown): string | undefined; + export function email(value: unknown): string | undefined; + export function number(value: unknown): string | undefined; + export function string(value: unknown): string | undefined; + export function url(value: unknown): string | undefined; export function hasValue(value: unknown): string | undefined; export function createMinNumber(min: number): (value: unknown) => string | undefined; export function createPattern(pattern: RegExp, message?: string): (value: unknown) => string | undefined; export function createMaxCharacterLength(bound: number): (value: unknown) => string | undefined; export function createMinCharacterLength(bound: number): (value: unknown) => string | undefined; - export function InputFieldFF(props: InputFieldFFProps): React.ReactElement; - export function integer(value: unknown): string | undefined; - export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; } diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 6480217..2882b78 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -7,7 +7,8 @@ import { hasValue, InputFieldFF, integer, - SingleSelectFieldFF, + MultiSelectFieldFF, + CheckboxFieldFF } from "@dhis2/ui"; import React from "react"; import i18n from "../../../locales"; @@ -20,7 +21,6 @@ import { OrgUnitLevelsFF } from "./components/OrgUnitLevelsFF"; import { getPredictorFieldName, missingValueStrategy, - periodTypes, PredictorFormField, predictorRequiredFields, } from "./utils"; @@ -47,7 +47,7 @@ const useValidations = (field: PredictorFormField): { validation?: (...args: any }; export const RenderPredictorWizardField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { - const name = `predictors[${row}.${field}]`; + const name = `users[${row}].${field}`; const { validation, props: validationProps = {} } = useValidations(field); const props = { name, @@ -55,39 +55,35 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto validate: validation, ...validationProps, }; + console.log(props) /* case "output": return ; */ switch (field) { case "id": - case "code": - case "description": - case "name": - case "generator.description": - case "sampleSkipTest.description": + case "email": + case "firstName": + case "surname": return ; - case "periodType": - return ; + case "userGroups": + case "userRoles": + case "organisationUnits": + case "dataViewOrganisationUnits": + return ; case "organisationUnitLevels": return ; - case "generator.missingValueStrategy": - return ; - case "sequentialSampleCount": - case "annualSampleCount": - case "sequentialSkipCount": - case "scheduling.sequence": - case "scheduling.variable": - return ; + case "disabled": + return ; default: return null; } }; export const RenderPredictorImportField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { - const name = `predictors[${row}.${field}]`; + const name = `users[${row}.${field}]`; const { validation, props: validationProps = {} } = useValidations(field); - + console.log(field) const props = { name, placeholder: getPredictorFieldName(field), diff --git a/src/webapp/components/user-form/utils.ts b/src/webapp/components/user-form/utils.ts index f527266..5c012af 100644 --- a/src/webapp/components/user-form/utils.ts +++ b/src/webapp/components/user-form/utils.ts @@ -5,26 +5,16 @@ export type PredictorFormField = typeof predictorFormFields[number]; export const predictorFormFields = [ "id", - "code", + "firstName", + "surname", "name", - "description", - "output", - "periodType", - "annualSampleCount", - "sequentialSampleCount", - "organisationUnitLevels", - "predictorGroups", - "sequentialSkipCount", - "generator.description", - "generator.expression", - "generator.missingValueStrategy", - "sampleSkipTest.description", - "sampleSkipTest.expression", - "scheduling.sequence", - "scheduling.variable", + "email", + "username", + "disabled" + ]; -export const predictorRequiredFields: PredictorFormField[] = ["name", "generator.expression", "output", "outputCombo"]; +export const predictorRequiredFields: PredictorFormField[] = ["id","name"]; export const getPredictorName = (field: PredictorFormField) => { switch (field) { @@ -32,40 +22,26 @@ export const getPredictorName = (field: PredictorFormField) => { return i18n.t("Identifier"); case "code": return i18n.t("Code"); + case "firstName": + return i18n.t("First Name"); case "name": return i18n.t("Name"); - case "description": - return i18n.t("Description"); + case "surname": + return i18n.t("Surname"); + case "username": + return i18n.t("Username"); + case "email": + return i18n.t("Email"); + case "disabled": + return i18n.t("Disabled"); case "output": return i18n.t("Output data element"); case "outputCombo": return i18n.t("Output category combo"); - case "periodType": - return i18n.t("Period type"); - case "annualSampleCount": - return i18n.t("Annual sample count"); - case "sequentialSampleCount": - return i18n.t("Sequential sample count"); - case "sequentialSkipCount": - return i18n.t("Sequential skip count"); case "organisationUnitLevels": return i18n.t("Organisation unit levels"); case "predictorGroups": return i18n.t("Predictor groups"); - case "generator.description": - return i18n.t("Generator description"); - case "generator.missingValueStrategy": - return i18n.t("Missing value strategy"); - case "generator.expression": - return i18n.t("Generator formula"); - case "sampleSkipTest.description": - return i18n.t("Sample skip test description"); - case "sampleSkipTest.expression": - return i18n.t("Sample skip test formula"); - case "scheduling.sequence": - return i18n.t("Sequence"); - case "scheduling.variable": - return i18n.t("Variable"); } }; @@ -75,27 +51,6 @@ export const getPredictorFieldName = (field: PredictorFormField) => { return _.compact([name, required ? "(*)" : undefined]).join(" "); }; -export const periodTypes = [ - { value: "Daily", label: i18n.t("Daily") }, - { value: "Weekly", label: i18n.t("Weekly") }, - { value: "WeeklyWednesday", label: i18n.t("Weekly starting Wednesday") }, - { value: "WeeklyThursday", label: i18n.t("Weekly starting Thursday") }, - { value: "WeeklySaturday", label: i18n.t("Weekly starting Saturday") }, - { value: "WeeklySunday", label: i18n.t("Weekly starting Sunday") }, - { value: "BiWeekly", label: i18n.t("Biweekly") }, - { value: "Monthly", label: i18n.t("Monthly") }, - { value: "BiMonthly", label: i18n.t("Bi-monthly") }, - { value: "Quarterly", label: i18n.t("Quarterly") }, - { value: "SixMonthly", label: i18n.t("Six-monthly") }, - { value: "SixMonthlyApril", label: i18n.t("Six-monthly starting April") }, - { value: "SixMonthlyNov", label: i18n.t("Six-monthly starting November") }, - { value: "Yearly", label: i18n.t("Yearly") }, - { value: "FinancialApril", label: i18n.t("Financial year starting April") }, - { value: "FinancialJuly", label: i18n.t("Financial year starting July") }, - { value: "FinancialOct", label: i18n.t("Financial year starting October") }, - { value: "FinancialNov", label: i18n.t("Financial year starting November") }, -]; - export const missingValueStrategy = [ { value: "SKIP_IF_ANY_VALUE_MISSING", label: i18n.t("Skip if any value is missing") }, { value: "SKIP_IF_ALL_VALUES_MISSING", label: i18n.t("Skip if all values are missing") }, diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 89af97f..1d20b81 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -43,17 +43,18 @@ export const UserBulkEditPage = () => { //const loading = useLoading(); const location = useLocation<{ users: User[] }>(); - const [usersToEdit] = React.useState(location.state?.users ?? []); + const [users] = React.useState(location.state?.users ?? []); + console.log(users) const [summary, setSummary] = useState(); //MetadataResponse - const [columns, setColumns] = useState(basePredictorColumns); + const [columns, setColumns] = useState(baseUserColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); const goHome = useCallback(() => goBack(true), [goBack]); const onSubmit = useCallback( - async ({ usersToEdit }: { usersToEdit: User[] }) => { + async ({ users }: { users: User[] }) => { //loading.show(true, i18n.t("Saving predictors")); - console.log("here!!"); + console.log(users); //const { data = [], error } = await compositionRoot.users.save(users).runAsync(); //if (error) return error ?? i18n.t("Network error"); //loading.reset(); @@ -67,11 +68,38 @@ export const UserBulkEditPage = () => { }, [compositionRoot, goHome] ); + const title = i18n.t("Edit users"); + + if (users.length === 0) return ; + const closeSummary = () => setSummary(undefined); + return ( - + + + setColumnSelectorOpen(true)} + style={{ float: "right" }} + > + + + + {summary ? : null} + + {columnSelectorOpen && ( + setColumnSelectorOpen(false)} + /> + )} + + autocomplete="off" onSubmit={onSubmit} - initialValues={{ usersToEdit }} + initialValues={{ users }} render={({ handleSubmit, values, submitError }) => ( @@ -80,7 +108,7 @@ export const UserBulkEditPage = () => { { )} /> + + ); }; -/* - console.log("cancel")} - onSave={() => console.log("save")} - maxWidth={"lg"} - fullWidth={true} - > - - autocomplete="off" - onSubmit={onSubmit} - initialValues={{ usersToEdit }} - render={({ handleSubmit, values, submitError }) => ( - - - - {({ height, width }: {height: number, width: number}) => ( - - {Row} - - )} - - - - {submitError && ( - - {submitError} - - )} - - - - - - - - )} - /> - - - -*/ -const basePredictorColumns = ["id", "name", "email", "userCredentials.userRoles", "userCredentials.userGroups"]; +//"userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits" +const baseUserColumns = ["id", "firstName", "surname", "email", "disabled"]; const MaxHeight = styled.div` height: 95%; @@ -199,7 +173,6 @@ interface RowItemProps { const RowItem: React.FC = ({ data, columnIndex, rowIndex }) => { const form = useForm<{ users: User[] }>(); - const headerRow = rowIndex === 0; const deleteRow = columnIndex === 0; const row = rowIndex - 1; From a32c936f48463de735a6803dc7627b9d92359575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Mon, 15 Nov 2021 01:26:32 +1300 Subject: [PATCH 066/192] used OrgUnitsSelector in OrgUnitDialog --- .../OrgUnitDialog.component.js | 28 +++++++++---------- .../components/OrgUnitsSelectorFilter.js | 12 ++------ src/legacy/utils/dhis2Helpers.js | 5 +++- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index faa6c1f..6e040f7 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -1,12 +1,12 @@ -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; import _ from "lodash"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; import React from "react"; import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; -import OrgUnitForm from "../../components/OrgUnitForm"; import _m from "../../utils/lodash-mixins"; +import { getOrgUnitsPaths } from "../../utils/dhis2Helpers"; class OrgUnitDialog extends React.Component { constructor(props, context) { @@ -102,13 +102,11 @@ class OrgUnitDialog extends React.Component { }); }; - render = () => { - const { title, filteringByNameLabel, orgUnitsSelectedLabel } = this.props; - + render() { return ( {this._renderStrategyToggle()} - ); - }; + } } OrgUnitDialog.propTypes = { diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index e24b2f7..604c4e1 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -3,7 +3,7 @@ import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; -import { listWithInFilter } from "../utils/dhis2Helpers"; +import { getOrgUnitsPaths, listWithInFilter } from "../utils/dhis2Helpers"; class OrgUnitsSelectorFilter extends React.Component { constructor(props, context) { @@ -54,15 +54,9 @@ class OrgUnitsSelectorFilter extends React.Component { this.setState({ selected }); } - getOuPaths() { - return this.state.selected.map(ouOrPath => - typeof ouOrPath === "object" && "path" in ouOrPath ? ouOrPath.path : ouOrPath - ); - } - async applyAndClose() { const { d2 } = this.context; - const orgUnitIds = this.getOuPaths().map(path => _.last(path.split("/"))); + const orgUnitIds = getOrgUnitsPaths(this.state.selected).map(path => _.last(path.split("/"))); const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { paging: false, fields: "id,displayName,shortName,path", @@ -104,7 +98,7 @@ class OrgUnitsSelectorFilter extends React.Component { > + ouOrPaths.map(ouOrPath => (typeof ouOrPath === "object" && "path" in ouOrPath ? ouOrPath.path : ouOrPath)); + async function mapPromise(inputValues, mapper) { const output = []; for (const value of inputValues) { @@ -76,4 +79,4 @@ async function getModelValuesByField(d2, fields) { ); } -export { getOrgUnitsRoots, mapPromise, getModelValuesByField, listWithInFilter }; +export { getOrgUnitsRoots, mapPromise, getModelValuesByField, listWithInFilter, getOrgUnitsPaths }; From 37c3c1488cd4a638ba867a77e6fe9b49fd0551e7 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Sun, 14 Nov 2021 21:31:52 +0100 Subject: [PATCH 067/192] fixed the user model schema for the userRoles, although now there is an error with the Date attributes, not sure how to fix it. Also figured out that's the only issue preventing me from saving I think, so the problem is narrowed down --- src/data/models/UserModel.ts | 13 +++--- src/data/repositories/UserD2ApiRepository.ts | 43 +++---------------- src/domain/usecases/SaveUsersUseCase.ts | 2 +- src/webapp/components/user-form/UserForm.tsx | 4 +- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 13 +++--- 5 files changed, 20 insertions(+), 55 deletions(-) diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index b2e1084..52500e0 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -39,11 +39,12 @@ export const AccessPermissionsModel: Codec = Schema.object({ manage: Schema.optional(Schema.boolean), }); -export const UserRolesModel: Codec = Schema.object({ - id: Schema.nonEmptyString, - name: Schema.nonEmptyString, - authorities: Schema.array(Schema.string), -}); +export const UserRolesModel: Codec = Schema.extend( + NamedRefModel, + Schema.object({ + authorities: Schema.array(Schema.string), + }) +); /* export interface User { @@ -74,7 +75,7 @@ export const UserModel: Codec = Schema.object({ email: Schema.nonEmptyString, lastUpdated: Schema.date, created: Schema.date, - userRoles: UserRolesModel, + userRoles: Schema.array(UserRolesModel), userGroups: Schema.array(NamedRefModel), organisationUnits: Schema.array(NamedRefModel), dataViewOrganisationUnits: Schema.array(NamedRefModel), diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index de532ce..7fc99c1 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,4 +1,4 @@ -import { D2Api, D2UserSchema, SelectedPick, MetadataResponse, Pager } from "@eyeseetea/d2-api/2.34"; +import { D2Api, D2UserSchema, SelectedPick, MetadataResponse } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -9,7 +9,6 @@ import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; import { Instance } from "../entities/Instance"; import { UserModel } from "../models/UserModel"; -import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -53,48 +52,16 @@ export class UserD2ApiRepository implements UserRepository { return Future.success(this.mapUser(user)); }); } - public save(usersToSave: User[]): FutureData { - Future.success(); - } - /*public save(usersToSave: User[]): FutureData { + public save(usersToSave: User[]): FutureData { const validations = usersToSave.map(user => UserModel.decode(user)); const users = _.compact(validations.map(either => either.toMaybe().extract())); const errors = _.compact(validations.map(either => either.leftOrDefault(""))); if (errors.length > 0) { return Future.error(errors.join("\n")); } - //return apiToFuture(this.api.metadata.post({ users })); - const userIds = users.map(({ id }) => id); - const listOptions = { - filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, - }; - return apiToFuture(this.api.metadata.post({ users })); - /*return this.list(listOptions).run(existingPredictors => - apiToFuture(this.api.metadata.post({ users: existingPredictors })) - - ) - );*/ - //const saveMetadata$ = apiToFuture(this.api.metadata.post({ users })); - - /*return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap(({ objects }) => { - const [user] = objects; - if (!user) return Future.error(`User ${id} not found`); - - return Future.success(this.mapUser(user)); - });*? - - return this.get(predictors.map(({ id }) => id)).flatMap(existingPredictors => - this.getGroupsToSave(inputPredictors, existingPredictors).flatMap(predictorGroups => { - const saveMetadata$ = apiToFuture(this.api.metadata.post({ predictors, predictorGroups })); - const saveDataStore$ = this.storageRepository.saveObjectsInCollection( - Namespaces.SCHEDULING, - scheduling - ); - - return Future.join2(saveMetadata$, saveDataStore$).map(([metadataResponse]) => [metadataResponse]); - }) - ); - }*/ + //there's an error with the date being sent as an object or something + return apiToFuture(this.api.metadata.post({ users })).map((metadataResponse) => metadataResponse); + } private mapUser(user: D2ApiUser): User { return { diff --git a/src/domain/usecases/SaveUsersUseCase.ts b/src/domain/usecases/SaveUsersUseCase.ts index 6869379..2640c0d 100644 --- a/src/domain/usecases/SaveUsersUseCase.ts +++ b/src/domain/usecases/SaveUsersUseCase.ts @@ -7,7 +7,7 @@ import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; export class SaveUsersUseCase implements UseCase { constructor(private userRepository: UserRepository) {} - public execute(usersToSave: User[]): FutureData { + public execute(usersToSave: User[]): FutureData { return this.userRepository.save(usersToSave); } } diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 2882b78..97efe15 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -55,7 +55,7 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto validate: validation, ...validationProps, }; - console.log(props) + // console.log(props) /* case "output": return ; @@ -83,7 +83,7 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto export const RenderPredictorImportField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { const name = `users[${row}.${field}]`; const { validation, props: validationProps = {} } = useValidations(field); - console.log(field) + //console.log(field) const props = { name, placeholder: getPredictorFieldName(field), diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 1d20b81..f1b8d70 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -1,5 +1,4 @@ import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; //import { useLoading } from "@eyeseetea/d2-ui-components"; import { Paper } from "@material-ui/core"; @@ -12,8 +11,8 @@ import { Redirect, useLocation } from "react-router"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeGrid as Grid } from "react-window"; import styled from "styled-components"; -//import { MetadataResponse } from "../../../domain/entities/Metadata"; //will I use the clean architecture? import { User } from "../../../domain/entities/User"; +import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; import i18n from "../../../locales"; import { ColumnSelectorDialog } from "../../components/column-selector-dialog/ColumnSelectorDialog"; @@ -44,8 +43,7 @@ export const UserBulkEditPage = () => { const location = useLocation<{ users: User[] }>(); const [users] = React.useState(location.state?.users ?? []); - console.log(users) - const [summary, setSummary] = useState(); //MetadataResponse + const [summary, setSummary] = useState(); const [columns, setColumns] = useState(baseUserColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); @@ -54,12 +52,11 @@ export const UserBulkEditPage = () => { const onSubmit = useCallback( async ({ users }: { users: User[] }) => { //loading.show(true, i18n.t("Saving predictors")); - console.log(users); - //const { data = [], error } = await compositionRoot.users.save(users).runAsync(); - //if (error) return error ?? i18n.t("Network error"); + const { data = [], error } = await compositionRoot.users.save(users).runAsync(); + if (error) return error ?? i18n.t("Network error"); //loading.reset(); - /*if (_.some(data, foo => foo.status === "ERROR")) { + /* if (_.some(data, foo => foo.status === "ERROR")) { setSummary(data); } else { goHome(); From d00cb7919462a639e9497aeed863b7400cab7a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Mon, 15 Nov 2021 22:49:38 +1300 Subject: [PATCH 068/192] save with Ou object --- .../OrgUnitDialog.component.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index 6e040f7..89230e9 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -6,7 +6,7 @@ import PropTypes from "prop-types"; import React from "react"; import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; import _m from "../../utils/lodash-mixins"; -import { getOrgUnitsPaths } from "../../utils/dhis2Helpers"; +import { getOrgUnitsPaths, listWithInFilter } from "../../utils/dhis2Helpers"; class OrgUnitDialog extends React.Component { constructor(props, context) { @@ -79,17 +79,19 @@ class OrgUnitDialog extends React.Component { this.setState({ selected }); } - save = () => { + async save() { + const { d2 } = this.context; const { selected } = this.state; + const orgUnitIds = selected.map(path => _.last(path.split("/"))); + const selectedOus = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { + paging: false, + fields: "id,displayName,shortName,path", + }); + this.setState({ loading: true }); this.model - .save( - this.props.models, - selected, - selected.map(ou => ou.id), - this.state.updateStrategy - ) + .save(this.props.models, selectedOus, orgUnitIds, this.state.updateStrategy) .then(() => { this.setState({ loading: false }); this.props.onOrgUnitAssignmentSaved(); @@ -100,7 +102,7 @@ class OrgUnitDialog extends React.Component { this.props.onOrgUnitAssignmentError(err); this.props.onRequestClose(); }); - }; + } render() { return ( From 5f47a5537850702e1378804cb06f7c956752d34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Mon, 15 Nov 2021 22:59:39 +1300 Subject: [PATCH 069/192] removed OrgUnitsFilter --- .../components/OrgUnitsFilter.component.js | 155 ------------------ 1 file changed, 155 deletions(-) delete mode 100644 src/legacy/components/OrgUnitsFilter.component.js diff --git a/src/legacy/components/OrgUnitsFilter.component.js b/src/legacy/components/OrgUnitsFilter.component.js deleted file mode 100644 index 493f261..0000000 --- a/src/legacy/components/OrgUnitsFilter.component.js +++ /dev/null @@ -1,155 +0,0 @@ -import _ from "lodash"; -import Dialog from "material-ui/Dialog"; -import FlatButton from "material-ui/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; -import TextField from "material-ui/TextField"; -import PropTypes from "prop-types"; -import React from "react"; -import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; -import OrgUnitForm from "./OrgUnitForm"; - -class OrgUnitsFilter extends React.Component { - constructor(props, context) { - super(props, context); - this.getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); - this.openDialog = this.openDialog.bind(this); - this.closeDialog = this.closeDialog.bind(this); - this.onChange = this.onChange.bind(this); - this.applyAndClose = this.applyAndClose.bind(this); - this.fieldValue = this.getCompactFieldValue(props.selected); - this.state = { - dialogOpen: false, - selected: props.selected, - roots: [], - }; - } - - styles = { - dialog: { - minWidth: 875, - maxWidth: "100%", - }, - cancelButton: { - marginRight: 16, - }, - wrapper: { - width: "inherit", - position: "relative", - }, - inputStyle: { - cursor: "pointer", - }, - }; - - componentDidMount = () => { - return getOrgUnitsRoots().then(roots => this.setState({ roots })); - }; - - componentWillReceiveProps(newProps) { - if (newProps.selected !== this.props.selected) this.fieldValue = this.getCompactFieldValue(newProps.selected); - } - - openDialog = () => { - this.setState({ dialogOpen: true, selected: this.props.selected }); - }; - - closeDialog = () => { - this.setState({ dialogOpen: false }); - }; - - onChange(selected) { - this.setState({ selected }); - } - - applyAndClose = () => { - this.props.onChange(this.state.selected); - this.closeDialog(); - }; - - getDialogButtons = () => { - return ( - - - , - , - - ); - }; - - getCompactFieldValue(selected, { limit = 3 } = {}) { - const names = selected.map(ou => ou.displayName); - - if (names.length <= limit) { - return names.join(", "); - } else { - return this.getTranslation("this_and_n_others_compact", { - this: _(names).take(limit).join(", "), - n: names.length - limit, - }); - } - } - - render = () => { - const { title, styles } = this.props; - const { dialogOpen } = this.state; - const t = this.getTranslation.bind(this); - - return ( -
- - - - - -
- ); - }; -} - -OrgUnitsFilter.propTypes = { - title: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, - selected: PropTypes.arrayOf(PropTypes.object).isRequired, - styles: PropTypes.object, -}; - -OrgUnitsFilter.contextTypes = { - d2: PropTypes.any, -}; - -export default OrgUnitsFilter; From d1e1a0eb61f717487fcf07fea276f0a7c11a49e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Tue, 16 Nov 2021 00:13:43 +1300 Subject: [PATCH 070/192] changed useInOperator to true to fix an api call issue --- src/legacy/models/userHelpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 413dcdb..cfef4ac 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -78,7 +78,7 @@ async function getAssociations(d2, objs, { orgUnitsField }) { dbField, values, { fields: fields.join(","), paging: false }, - { useInOperator: false } + { useInOperator: true } ); return _(listOfModels) From c1bb3031c3fb52002ee296495077634699bd8666 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 15 Nov 2021 12:18:29 +0100 Subject: [PATCH 071/192] got the post api to work finally so the bulk update process is functional --- src/CompositionRoot.ts | 3 +- src/data/models/UserModel.ts | 54 ++----------------- src/data/repositories/UserD2ApiRepository.ts | 50 +++++++++++++++-- src/domain/entities/User.ts | 6 +-- src/domain/repositories/UserRepository.ts | 1 - .../user-list-table/UserListTable.tsx | 1 - .../pages/user-bulk-edit/UserBulkEditPage.tsx | 14 +++-- 7 files changed, 61 insertions(+), 68 deletions(-) diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 7f0eb9c..450208c 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -7,7 +7,6 @@ import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; - export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); const userRepository = new UserD2ApiRepository(instance); @@ -20,7 +19,7 @@ export function getCompositionRoot(instance: Instance) { getCurrent: new GetCurrentUserUseCase(userRepository), list: new ListUsersUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), - save: new SaveUsersUseCase(userRepository) + save: new SaveUsersUseCase(userRepository), }), }; } diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index 52500e0..f0c17cd 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -2,34 +2,6 @@ import { User, UserRole, AccessPermissions } from "../../domain/entities/User"; import { Codec, Schema } from "../../utils/codec"; import { NamedRefModel } from "./DHIS2Model"; -/* -export interface User { - id: string; - name: string; - username: string; - firstName: string; - surname: string; - email: string; - lastUpdated: Date; - created: Date; - userRoles: UserRole[]; - userGroups: NamedRef[]; - organisationUnits: NamedRef[]; - dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date; - disabled: boolean; - access: AccessPermissions; -} - -export interface AccessPermissions { - read?: boolean; - update?: boolean; - externalize?: boolean; - delete?: boolean; - write?: boolean; - manage?: boolean; -} -*/ export const AccessPermissionsModel: Codec = Schema.object({ read: Schema.optional(Schema.boolean), update: Schema.optional(Schema.boolean), @@ -46,26 +18,6 @@ export const UserRolesModel: Codec = Schema.extend( }) ); -/* -export interface User { - id: string; - name: string; - username: string; - firstName: string; - surname: string; - email: string; - lastUpdated: Date; - created: Date; - userRoles: UserRole[]; - userGroups: NamedRef[]; - organisationUnits: NamedRef[]; - dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date; - disabled: boolean; - access: AccessPermissions; -} -*/ - export const UserModel: Codec = Schema.object({ id: Schema.nonEmptyString, name: Schema.nonEmptyString, @@ -73,13 +25,13 @@ export const UserModel: Codec = Schema.object({ firstName: Schema.nonEmptyString, surname: Schema.nonEmptyString, email: Schema.nonEmptyString, - lastUpdated: Schema.date, - created: Schema.date, + lastUpdated: Schema.nonEmptyString, + created: Schema.nonEmptyString, userRoles: Schema.array(UserRolesModel), userGroups: Schema.array(NamedRefModel), organisationUnits: Schema.array(NamedRefModel), dataViewOrganisationUnits: Schema.array(NamedRefModel), - lastLogin: Schema.date, + lastLogin: Schema.nonEmptyString, disabled: Schema.boolean, access: AccessPermissionsModel }); diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 7fc99c1..43da50d 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -9,6 +9,7 @@ import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; import { Instance } from "../entities/Instance"; import { UserModel } from "../models/UserModel"; +import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -52,6 +53,26 @@ export class UserD2ApiRepository implements UserRepository { return Future.success(this.mapUser(user)); }); } + + private getFullUsers(options: ListOptions): FutureData { + const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; + const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); + + const predictorData$ = apiToFuture( + this.api.models.users.get({ + fields, + page, + pageSize, + paging: false, + filter: { + identifiable: search ? { token: search } : undefined, + ...otherFilters, + }, + order: `${sorting.field}:${sorting.order}`, + }) + ); + return predictorData$.map(({ objects }) => objects); + } public save(usersToSave: User[]): FutureData { const validations = usersToSave.map(user => UserModel.decode(user)); const users = _.compact(validations.map(either => either.toMaybe().extract())); @@ -59,8 +80,27 @@ export class UserD2ApiRepository implements UserRepository { if (errors.length > 0) { return Future.error(errors.join("\n")); } - //there's an error with the date being sent as an object or something - return apiToFuture(this.api.metadata.post({ users })).map((metadataResponse) => metadataResponse); + const userIds = users.map(user => user.id); + const listOptions = { + filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, + }; + return this.getFullUsers(listOptions).flatMap(existingUsers => + { + const usersToSend = existingUsers.map((existingUser, index) => ({ + ...existingUser, + email: usersToSave[index]?.email, + firstName: usersToSave[index]?.firstName, + surname: usersToSave[index]?.surname, + userCredentials: { + ...existingUser.userCredentials, + disabled: usersToSave[index]?.disabled, + userRoles: usersToSave[index]?.userRoles, + username: usersToSave[index]?.username, + + }, + + })); + return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data) }); } private mapUser(user: D2ApiUser): User { @@ -70,12 +110,12 @@ export class UserD2ApiRepository implements UserRepository { firstName: user.firstName, surname: user.surname, email: user.email, - lastUpdated: new Date(user.lastUpdated), - created: new Date(user.created), + lastUpdated: user.lastUpdated, + created: user.created, userGroups: user.userGroups, username: user.userCredentials.username, userRoles: user.userCredentials.userRoles, - lastLogin: new Date(user.userCredentials.lastLogin), + lastLogin: user.userCredentials.lastLogin, disabled: user.userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 6edcace..86d6279 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -8,13 +8,13 @@ export interface User { firstName: string; surname: string; email: string; - lastUpdated: Date; - created: Date; + lastUpdated: string; + created: string; userRoles: UserRole[]; userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date; + lastLogin: string; disabled: boolean; access: AccessPermissions; } diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 67cc64e..afa50d1 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -7,7 +7,6 @@ export interface UserRepository { list(options: ListOptions): FutureData>; getById(id: string): FutureData; save(users: User[]): FutureData; - } export interface ListOptions { diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 54ab3fe..1e4f160 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -49,7 +49,6 @@ export const UserListTable: React.FC = props => { compositionRoot.users.list(listOptions).run( ({ objects }: { objects: User[] }) => { console.log(objects); - // state: { users: objects } history.push({ pathname: `/bulk-edit`, state: { users: objects } }); }, error => snackbar.error(error) diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index f1b8d70..200380a 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -3,7 +3,6 @@ import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; //import { useLoading } from "@eyeseetea/d2-ui-components"; import { Paper } from "@material-ui/core"; import { Delete, ViewColumn } from "@material-ui/icons"; -import _ from "lodash"; import { IconButton } from "material-ui"; import React, { useCallback, useState } from "react"; import { Form, useForm } from "react-final-form"; @@ -43,7 +42,7 @@ export const UserBulkEditPage = () => { const location = useLocation<{ users: User[] }>(); const [users] = React.useState(location.state?.users ?? []); - const [summary, setSummary] = useState(); + const [summary, setSummary] = useState(); const [columns, setColumns] = useState(baseUserColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); @@ -52,11 +51,16 @@ export const UserBulkEditPage = () => { const onSubmit = useCallback( async ({ users }: { users: User[] }) => { //loading.show(true, i18n.t("Saving predictors")); - const { data = [], error } = await compositionRoot.users.save(users).runAsync(); + const { data, error } = await compositionRoot.users.save(users).runAsync(); + console.log(data) if (error) return error ?? i18n.t("Network error"); //loading.reset(); - - /* if (_.some(data, foo => foo.status === "ERROR")) { + if (data && data.status === "ERROR") { + setSummary(data); + } else { + goHome(); + } + /*if (_.some(data, foo => foo.status === "ERROR")) { setSummary(data); } else { goHome(); From 625a3931fc77fbe0c882933a313b7104572e8b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Tue, 16 Nov 2021 01:20:55 +1300 Subject: [PATCH 072/192] started switching to ConfirmationDialog --- src/legacy/components/Dropdown.component.js | 18 +++++++--- .../components/MultipleFilter.component.js | 35 ++++++++----------- .../components/TableLayout.component.js | 35 +++++++++---------- 3 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/legacy/components/Dropdown.component.js b/src/legacy/components/Dropdown.component.js index 2db7f73..6e53c19 100644 --- a/src/legacy/components/Dropdown.component.js +++ b/src/legacy/components/Dropdown.component.js @@ -1,11 +1,10 @@ import isString from "d2-utilizr/lib/isString"; -import Dialog from "material-ui/Dialog"; -import FlatButton from "material-ui/FlatButton"; import MenuItem from "material-ui/MenuItem/MenuItem"; import SelectField from "material-ui/SelectField/SelectField"; import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; /* Selector wrapper. When options.length < props.limit -> show a normal SelectField, @@ -89,14 +88,22 @@ class Dropdown extends React.Component { return this.state.options.length > limit ? (
- + {/*} - > + >*/} { @@ -116,7 +123,8 @@ class Dropdown extends React.Component { .every(f => o.text.toLocaleLowerCase().includes(f.toLocaleLowerCase())) ) .map(o => this.renderDialogOption(o.value, o.text))} - + {/**/} + { - return ( - - - , - , - - ); - }; - getCompactFieldValue(options, selected, limit = 3) { const names = _(options).keyBy("value").at(selected).map("text").value(); @@ -93,11 +76,10 @@ class MultipleFilter extends React.Component { render = () => { const { title, options, styles } = this.props; const { dialogOpen, selected } = this.state; - const { dialogButtons } = this; return (
- */} + - + + {/**/} { - return ( - - - , - , - - ); - }; - render = () => { const { options, selected } = this.props; const title = this.getTranslation("layout_settings"); return (
- */} + - + + {/**/}
); }; From b64a8386ef81590efc28c510cdac07bbe308334a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Tue, 16 Nov 2021 23:03:30 +1300 Subject: [PATCH 073/192] removed commented Dialog --- src/legacy/components/Dropdown.component.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/legacy/components/Dropdown.component.js b/src/legacy/components/Dropdown.component.js index 6e53c19..8dba13f 100644 --- a/src/legacy/components/Dropdown.component.js +++ b/src/legacy/components/Dropdown.component.js @@ -96,14 +96,6 @@ class Dropdown extends React.Component { onCancel={this.closeDialog} cancelText={this.getTranslation("cancel")} > - {/*} - >*/} { @@ -123,7 +115,6 @@ class Dropdown extends React.Component { .every(f => o.text.toLocaleLowerCase().includes(f.toLocaleLowerCase())) ) .map(o => this.renderDialogOption(o.value, o.text))} - {/**/} Date: Wed, 17 Nov 2021 00:24:43 +1300 Subject: [PATCH 074/192] removed commented Dialog code --- src/legacy/components/MultipleFilter.component.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/legacy/components/MultipleFilter.component.js b/src/legacy/components/MultipleFilter.component.js index 065e861..ba91d42 100644 --- a/src/legacy/components/MultipleFilter.component.js +++ b/src/legacy/components/MultipleFilter.component.js @@ -79,15 +79,6 @@ class MultipleFilter extends React.Component { return (
- {/**/} - {/**/} Date: Wed, 17 Nov 2021 00:25:53 +1300 Subject: [PATCH 075/192] removed commented Dialog code --- src/legacy/components/TableLayout.component.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/legacy/components/TableLayout.component.js b/src/legacy/components/TableLayout.component.js index 388e668..670d1ad 100644 --- a/src/legacy/components/TableLayout.component.js +++ b/src/legacy/components/TableLayout.component.js @@ -53,16 +53,6 @@ class TableLayout extends React.Component { return (
- {/**/} - {/**/}
); }; From 6e2bef3d116f4555dc3295b6d94b58e764e24052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Wed, 17 Nov 2021 00:58:29 +1300 Subject: [PATCH 076/192] reverted i18n files --- i18n/en.pot | 65 +++++++++++++++++++++-------------------------------- i18n/es.po | 65 +++++++++++++++++++++-------------------------------- 2 files changed, 50 insertions(+), 80 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index e7ab562..69bcc43 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-11T10:56:17.684Z\n" -"PO-Revision-Date: 2021-11-11T10:56:17.684Z\n" +"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" msgid "Enable users" msgstr "" @@ -14,10 +14,10 @@ msgstr "" msgid "Disable users" msgstr "" -msgid "Remove users" +msgid "Replicate error" msgstr "" -msgid "Replicate error" +msgid "Remove users" msgstr "" msgid "Settings" @@ -29,42 +29,6 @@ msgstr "" msgid "Help" msgstr "" -msgid "Name" -msgstr "" - -msgid "Username" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Last login" -msgstr "" - -msgid "ID" -msgstr "" - -msgid "Api URL" -msgstr "" - -msgid "Email" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - -msgid "OU Capture" -msgstr "" - -msgid "OU Output" -msgstr "" - msgid "Details" msgstr "" @@ -104,17 +68,38 @@ msgstr "" msgid "Search by name" msgstr "" +msgid "Username" +msgstr "" + msgid "First name" msgstr "" msgid "Surname" msgstr "" +msgid "Email" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" +msgid "Last login" +msgstr "" + msgid "Disabled" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 31c709a..4ea7746 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-11T10:56:17.684Z\n" +"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,54 +17,18 @@ msgstr "" msgid "Remove users" msgstr "Eliminar usuarios" -msgid "Replicate error" -msgstr "Replicar error" - msgid "Settings" msgstr "" msgid "Back" msgstr "Volver" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Help" msgstr "Ayuda" -msgid "Name" -msgstr "" - -msgid "Username" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Last login" -msgstr "" - -msgid "ID" -msgstr "" - -msgid "Api URL" -msgstr "" - -msgid "Email" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - -msgid "OU Capture" -msgstr "" - -msgid "OU Output" -msgstr "" - msgid "Details" msgstr "Detalles" @@ -104,17 +68,38 @@ msgstr "" msgid "Search by name" msgstr "" +msgid "Username" +msgstr "" + msgid "First name" msgstr "" msgid "Surname" msgstr "" +msgid "Email" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" +msgid "Last login" +msgstr "" + msgid "Disabled" msgstr "" From 0cfa4ef87b70536952c8bc57c72fd59d19140c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Wed, 17 Nov 2021 00:58:51 +1300 Subject: [PATCH 077/192] ran localize --- i18n/en.pot | 65 ++++++++++++++++++++++++++++++++--------------------- i18n/es.po | 65 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 80 insertions(+), 50 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 69bcc43..49b0a1b 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" -"PO-Revision-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-16T11:58:36.229Z\n" +"PO-Revision-Date: 2021-11-16T11:58:36.229Z\n" msgid "Enable users" msgstr "" @@ -14,10 +14,10 @@ msgstr "" msgid "Disable users" msgstr "" -msgid "Replicate error" +msgid "Remove users" msgstr "" -msgid "Remove users" +msgid "Replicate error" msgstr "" msgid "Settings" @@ -29,6 +29,42 @@ msgstr "" msgid "Help" msgstr "" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Api URL" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "" @@ -68,38 +104,17 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" -msgstr "" - msgid "Disabled" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 4ea7746..04e5edb 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-10-19T19:21:37.649Z\n" +"POT-Creation-Date: 2021-11-16T11:58:36.229Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,18 +17,54 @@ msgstr "" msgid "Remove users" msgstr "Eliminar usuarios" +msgid "Replicate error" +msgstr "Replicar error" + msgid "Settings" msgstr "" msgid "Back" msgstr "Volver" -msgid "Replicate error" -msgstr "Replicar error" - msgid "Help" msgstr "Ayuda" +msgid "Name" +msgstr "" + +msgid "Username" +msgstr "" + +msgid "Created" +msgstr "" + +msgid "Last updated" +msgstr "" + +msgid "Last login" +msgstr "" + +msgid "ID" +msgstr "" + +msgid "Api URL" +msgstr "" + +msgid "Email" +msgstr "" + +msgid "Roles" +msgstr "" + +msgid "Groups" +msgstr "" + +msgid "OU Capture" +msgstr "" + +msgid "OU Output" +msgstr "" + msgid "Details" msgstr "Detalles" @@ -68,38 +104,17 @@ msgstr "" msgid "Search by name" msgstr "" -msgid "Username" -msgstr "" - msgid "First name" msgstr "" msgid "Surname" msgstr "" -msgid "Email" -msgstr "" - -msgid "Created" -msgstr "" - -msgid "Last updated" -msgstr "" - -msgid "Roles" -msgstr "" - -msgid "Groups" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Last login" -msgstr "" - msgid "Disabled" msgstr "" From e6dd8053605efb5d1a42c18b5bfb64b8cba73366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Wed, 17 Nov 2021 01:02:50 +1300 Subject: [PATCH 078/192] updated i18n files after merge --- i18n/en.pot | 8 +++++--- i18n/es.po | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 91990bd..dcbb1f4 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-16T11:58:36.229Z\n" -"PO-Revision-Date: 2021-11-16T11:58:36.229Z\n" +"POT-Creation-Date: 2021-11-16T12:02:22.312Z\n" +"PO-Revision-Date: 2021-11-16T12:02:22.312Z\n" msgid "Enable users" msgstr "" @@ -101,7 +101,7 @@ msgstr "" msgid "Replicate user from table" msgstr "" -msgid "Search by name" +msgid "Search by name or username..." msgstr "" msgid "First name" @@ -119,3 +119,5 @@ msgstr "" msgid "Disabled" msgstr "" +msgid "Open ID" +msgstr "" diff --git a/i18n/es.po b/i18n/es.po index af45d69..5e3b848 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-16T11:58:36.229Z\n" +"POT-Creation-Date: 2021-11-16T12:02:22.312Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -101,7 +101,7 @@ msgstr "" msgid "Replicate user from table" msgstr "" -msgid "Search by name" +msgid "Search by name or username..." msgstr "" msgid "First name" @@ -119,3 +119,5 @@ msgstr "" msgid "Disabled" msgstr "" +msgid "Open ID" +msgstr "" From 9adac08abcbee3bbb2b46711149e669717ce5bed Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Sun, 21 Nov 2021 07:22:18 +0100 Subject: [PATCH 079/192] changes --- i18n/en.pot | 116 +++--------------- i18n/es.po | 114 +++-------------- src/data/models/DHIS2Model.ts | 3 +- src/data/models/UserModel.ts | 2 +- src/data/repositories/UserD2ApiRepository.ts | 24 ++-- src/webapp/components/user-form/UserForm.tsx | 15 +-- src/webapp/components/user-form/utils.ts | 13 +- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 92 +++++++------- 8 files changed, 97 insertions(+), 282 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index d53f90c..b1a70f1 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-11T11:46:52.240Z\n" -"PO-Revision-Date: 2021-11-11T11:46:52.240Z\n" +"POT-Creation-Date: 2021-11-15T11:19:02.027Z\n" +"PO-Revision-Date: 2021-11-15T11:19:02.027Z\n" msgid "Enable users" msgstr "" @@ -95,28 +95,28 @@ msgstr "" msgid "Code" msgstr "" -msgid "Name" +msgid "First Name" msgstr "" -msgid "Description" +msgid "Name" msgstr "" -msgid "Output data element" +msgid "Surname" msgstr "" -msgid "Output category combo" +msgid "Username" msgstr "" -msgid "Period type" +msgid "Email" msgstr "" -msgid "Annual sample count" +msgid "Disabled" msgstr "" -msgid "Sequential sample count" +msgid "Output data element" msgstr "" -msgid "Sequential skip count" +msgid "Output category combo" msgstr "" msgid "Organisation unit levels" @@ -125,81 +125,6 @@ msgstr "" msgid "Predictor groups" msgstr "" -msgid "Generator description" -msgstr "" - -msgid "Missing value strategy" -msgstr "" - -msgid "Generator formula" -msgstr "" - -msgid "Sample skip test description" -msgstr "" - -msgid "Sample skip test formula" -msgstr "" - -msgid "Sequence" -msgstr "" - -msgid "Variable" -msgstr "" - -msgid "Daily" -msgstr "" - -msgid "Weekly" -msgstr "" - -msgid "Weekly starting Wednesday" -msgstr "" - -msgid "Weekly starting Thursday" -msgstr "" - -msgid "Weekly starting Saturday" -msgstr "" - -msgid "Weekly starting Sunday" -msgstr "" - -msgid "Biweekly" -msgstr "" - -msgid "Monthly" -msgstr "" - -msgid "Bi-monthly" -msgstr "" - -msgid "Quarterly" -msgstr "" - -msgid "Six-monthly" -msgstr "" - -msgid "Six-monthly starting April" -msgstr "" - -msgid "Six-monthly starting November" -msgstr "" - -msgid "Yearly" -msgstr "" - -msgid "Financial year starting April" -msgstr "" - -msgid "Financial year starting July" -msgstr "" - -msgid "Financial year starting October" -msgstr "" - -msgid "Financial year starting November" -msgstr "" - msgid "Skip if any value is missing" msgstr "" @@ -209,9 +134,6 @@ msgstr "" msgid "Never skip" msgstr "" -msgid "Username" -msgstr "" - msgid "Last updated" msgstr "" @@ -221,9 +143,6 @@ msgstr "" msgid "ID" msgstr "" -msgid "Email" -msgstr "" - msgid "Roles" msgstr "" @@ -278,31 +197,28 @@ msgstr "" msgid "First name" msgstr "" -msgid "Surname" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Disabled" -msgstr "" - msgid "Saving predictors" msgstr "" msgid "Network error" msgstr "" -msgid "Error saving users" +msgid "Edit users" msgstr "" -msgid "Save" +msgid "Column settings" msgstr "" -msgid "Edit users" +msgid "Error saving users" +msgstr "" + +msgid "Save" msgstr "" msgid "Delete" diff --git a/i18n/es.po b/i18n/es.po index 821ef85..7719faa 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-11T11:46:52.240Z\n" +"POT-Creation-Date: 2021-11-15T11:19:02.027Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -95,28 +95,28 @@ msgstr "" msgid "Code" msgstr "" -msgid "Name" +msgid "First Name" msgstr "" -msgid "Description" +msgid "Name" msgstr "" -msgid "Output data element" +msgid "Surname" msgstr "" -msgid "Output category combo" +msgid "Username" msgstr "" -msgid "Period type" +msgid "Email" msgstr "" -msgid "Annual sample count" +msgid "Disabled" msgstr "" -msgid "Sequential sample count" +msgid "Output data element" msgstr "" -msgid "Sequential skip count" +msgid "Output category combo" msgstr "" msgid "Organisation unit levels" @@ -125,81 +125,6 @@ msgstr "" msgid "Predictor groups" msgstr "" -msgid "Generator description" -msgstr "" - -msgid "Missing value strategy" -msgstr "" - -msgid "Generator formula" -msgstr "" - -msgid "Sample skip test description" -msgstr "" - -msgid "Sample skip test formula" -msgstr "" - -msgid "Sequence" -msgstr "" - -msgid "Variable" -msgstr "" - -msgid "Daily" -msgstr "" - -msgid "Weekly" -msgstr "" - -msgid "Weekly starting Wednesday" -msgstr "" - -msgid "Weekly starting Thursday" -msgstr "" - -msgid "Weekly starting Saturday" -msgstr "" - -msgid "Weekly starting Sunday" -msgstr "" - -msgid "Biweekly" -msgstr "" - -msgid "Monthly" -msgstr "" - -msgid "Bi-monthly" -msgstr "" - -msgid "Quarterly" -msgstr "" - -msgid "Six-monthly" -msgstr "" - -msgid "Six-monthly starting April" -msgstr "" - -msgid "Six-monthly starting November" -msgstr "" - -msgid "Yearly" -msgstr "" - -msgid "Financial year starting April" -msgstr "" - -msgid "Financial year starting July" -msgstr "" - -msgid "Financial year starting October" -msgstr "" - -msgid "Financial year starting November" -msgstr "" - msgid "Skip if any value is missing" msgstr "" @@ -209,9 +134,6 @@ msgstr "" msgid "Never skip" msgstr "" -msgid "Username" -msgstr "" - msgid "Last updated" msgstr "" @@ -221,9 +143,6 @@ msgstr "" msgid "ID" msgstr "" -msgid "Email" -msgstr "" - msgid "Roles" msgstr "" @@ -278,31 +197,28 @@ msgstr "" msgid "First name" msgstr "" -msgid "Surname" -msgstr "" - msgid "Organisation units" msgstr "" msgid "Data view organisation units" msgstr "" -msgid "Disabled" -msgstr "" - msgid "Saving predictors" msgstr "" msgid "Network error" msgstr "" -msgid "Error saving users" +msgid "Edit users" msgstr "" -msgid "Save" +msgid "Column settings" msgstr "" -msgid "Edit users" +msgid "Error saving users" +msgstr "" + +msgid "Save" msgstr "" msgid "Delete" diff --git a/src/data/models/DHIS2Model.ts b/src/data/models/DHIS2Model.ts index 168f8bc..47e6975 100644 --- a/src/data/models/DHIS2Model.ts +++ b/src/data/models/DHIS2Model.ts @@ -1,4 +1,4 @@ -import { NamedRef, Ref } from "../../domain/entities/Ref"; +import { NamedRef, Ref } from "../../domain/entities/Ref"; import { Codec, Schema } from "../../utils/codec"; export const RefModel: Codec = Schema.object({ @@ -9,4 +9,3 @@ export const NamedRefModel: Codec = Schema.object({ id: Schema.string, name: Schema.optionalSafe(Schema.string, "Unknown"), }); - diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index f0c17cd..6e31e29 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -33,5 +33,5 @@ export const UserModel: Codec = Schema.object({ dataViewOrganisationUnits: Schema.array(NamedRefModel), lastLogin: Schema.nonEmptyString, disabled: Schema.boolean, - access: AccessPermissionsModel + access: AccessPermissionsModel, }); diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 43da50d..0139efc 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -58,7 +58,7 @@ export class UserD2ApiRepository implements UserRepository { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); - const predictorData$ = apiToFuture( + const predictorData$ = apiToFuture( this.api.models.users.get({ fields, page, @@ -80,27 +80,25 @@ export class UserD2ApiRepository implements UserRepository { if (errors.length > 0) { return Future.error(errors.join("\n")); } - const userIds = users.map(user => user.id); - const listOptions = { - filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, - }; - return this.getFullUsers(listOptions).flatMap(existingUsers => - { - const usersToSend = existingUsers.map((existingUser, index) => ({ - ...existingUser, + const userIds = users.map(user => user.id); + const listOptions = { + filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, + }; + return this.getFullUsers(listOptions).flatMap(existingUsers => { + const usersToSend = existingUsers.map((existingUser, index) => ({ + ...existingUser, email: usersToSave[index]?.email, firstName: usersToSave[index]?.firstName, surname: usersToSave[index]?.surname, userCredentials: { ...existingUser.userCredentials, - disabled: usersToSave[index]?.disabled, + disabled: usersToSave[index]?.disabled, userRoles: usersToSave[index]?.userRoles, username: usersToSave[index]?.username, - }, - })); - return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data) }); + return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data); + }); } private mapUser(user: D2ApiUser): User { diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 97efe15..adbd2dc 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -8,7 +8,7 @@ import { InputFieldFF, integer, MultiSelectFieldFF, - CheckboxFieldFF + CheckboxFieldFF, } from "@dhis2/ui"; import React from "react"; import i18n from "../../../locales"; @@ -18,12 +18,7 @@ import { NumberInputFF } from "../form/fields/NumberInputFF"; import { PreviewInputFF } from "../form/fields/PreviewInputFF"; import { OrgUnitLevelsFF } from "./components/OrgUnitLevelsFF"; //import { OutputFF } from "./components/OutputFF"; -import { - getPredictorFieldName, - missingValueStrategy, - PredictorFormField, - predictorRequiredFields, -} from "./utils"; +import { getPredictorFieldName, missingValueStrategy, PredictorFormField, predictorRequiredFields } from "./utils"; const useValidations = (field: PredictorFormField): { validation?: (...args: any[]) => any; props?: object } => { switch (field) { @@ -55,7 +50,7 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto validate: validation, ...validationProps, }; - // console.log(props) + // console.log(props) /* case "output": return ; @@ -73,8 +68,8 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto return ; case "organisationUnitLevels": return ; - case "disabled": - return ; + case "disabled": + return ; default: return null; } diff --git a/src/webapp/components/user-form/utils.ts b/src/webapp/components/user-form/utils.ts index 5c012af..775f6bd 100644 --- a/src/webapp/components/user-form/utils.ts +++ b/src/webapp/components/user-form/utils.ts @@ -3,18 +3,9 @@ import i18n from "../../../locales"; export type PredictorFormField = typeof predictorFormFields[number]; -export const predictorFormFields = [ - "id", - "firstName", - "surname", - "name", - "email", - "username", - "disabled" +export const predictorFormFields = ["id", "firstName", "surname", "name", "email", "username", "disabled"]; -]; - -export const predictorRequiredFields: PredictorFormField[] = ["id","name"]; +export const predictorRequiredFields: PredictorFormField[] = ["id", "name"]; export const getPredictorName = (field: PredictorFormField) => { switch (field) { diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 200380a..3f01219 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -51,8 +51,8 @@ export const UserBulkEditPage = () => { const onSubmit = useCallback( async ({ users }: { users: User[] }) => { //loading.show(true, i18n.t("Saving predictors")); - const { data, error } = await compositionRoot.users.save(users).runAsync(); - console.log(data) + const { data, error } = await compositionRoot.users.save(users).runAsync(); + console.log(data); if (error) return error ?? i18n.t("Network error"); //loading.reset(); if (data && data.status === "ERROR") { @@ -60,7 +60,7 @@ export const UserBulkEditPage = () => { } else { goHome(); } - /*if (_.some(data, foo => foo.status === "ERROR")) { + /*if (_.some(data, foo => foo.status === "ERROR")) { setSummary(data); } else { goHome(); @@ -96,52 +96,52 @@ export const UserBulkEditPage = () => { onCancel={() => setColumnSelectorOpen(false)} /> )} - - - autocomplete="off" - onSubmit={onSubmit} - initialValues={{ users }} - render={({ handleSubmit, values, submitError }) => ( - - - - {({ height, width }: { height: number; width: number }) => ( - - {Row} - + + + autocomplete="off" + onSubmit={onSubmit} + initialValues={{ users }} + render={({ handleSubmit, values, submitError }) => ( + + + + {({ height, width }: { height: number; width: number }) => ( + + {Row} + + )} + + + + {submitError && ( + + {submitError} + )} - - - {submitError && ( - - {submitError} - - )} - - - + + - - - - )} - /> - + + + + )} + /> + ); }; From 7d60db1a1f27a719895bd42e876fcf29716b3869 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Mon, 22 Nov 2021 22:17:15 +0100 Subject: [PATCH 080/192] showed the transferFF props in the bulk edit and it opens up into a preview where you can select the transfer items. However still figuring out some issues of the number of transfer options the API is sending --- src/CompositionRoot.ts | 7 +++ .../repositories/MetadataD2ApiRepository.ts | 45 ++++++++++++++++ src/data/repositories/UserD2ApiRepository.ts | 6 +++ src/domain/entities/Metadata.ts | 9 ++++ src/domain/repositories/MetadataRepository.ts | 10 ++++ src/domain/usecases/ListMetadataUseCase.ts | 26 ++++++++++ src/webapp/components/user-form/UserForm.tsx | 22 ++++---- .../user-form/components/OrgUnitLevelsFF.tsx | 24 ++++++--- .../user-form/components/OutputFF.tsx | 51 ++++++------------- src/webapp/components/user-form/utils.ts | 8 +++ .../pages/user-bulk-edit/UserBulkEditPage.tsx | 3 +- 11 files changed, 157 insertions(+), 54 deletions(-) create mode 100644 src/data/repositories/MetadataD2ApiRepository.ts create mode 100644 src/domain/entities/Metadata.ts create mode 100644 src/domain/repositories/MetadataRepository.ts create mode 100644 src/domain/usecases/ListMetadataUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 450208c..552b7e4 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -1,15 +1,19 @@ import { Instance } from "./data/entities/Instance"; import { InstanceD2ApiRepository } from "./data/repositories/InstanceD2ApiRepository"; import { UserD2ApiRepository } from "./data/repositories/UserD2ApiRepository"; +import { MetadataD2ApiRepository } from "./data/repositories/MetadataD2ApiRepository"; import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; +import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); const userRepository = new UserD2ApiRepository(instance); + const metadataRepository = new MetadataD2ApiRepository(instance); + return { instance: getExecute({ @@ -21,6 +25,9 @@ export function getCompositionRoot(instance: Instance) { get: new GetUserByIdUseCase(userRepository), save: new SaveUsersUseCase(userRepository), }), + metadata: getExecute({ + list: new ListMetadataUseCase(metadataRepository), + }), }; } diff --git a/src/data/repositories/MetadataD2ApiRepository.ts b/src/data/repositories/MetadataD2ApiRepository.ts new file mode 100644 index 0000000..d991f60 --- /dev/null +++ b/src/data/repositories/MetadataD2ApiRepository.ts @@ -0,0 +1,45 @@ +import _ from "lodash"; +import { FutureData } from "../../domain/entities/Future"; +import { Instance } from "../entities/Instance"; +import { Metadata, MetadataType, MetadataPackage } from "../../domain/entities/Metadata"; +import { MetadataRepository } from "../../domain/repositories/MetadataRepository"; +import { D2Api, Pager } from "@eyeseetea/d2-api/2.34"; +import { getD2APiFromInstance } from "../../utils/d2-api"; +import { apiToFuture } from "../../utils/futures"; + +export class MetadataD2ApiRepository implements MetadataRepository { + private api: D2Api; + + constructor(instance: Instance) { + this.api = getD2APiFromInstance(instance); + } + + public list( + type: MetadataType, + options: { pageSize?: number; page?: number; filter?: string }, + fieldOptions: {} + ): FutureData<{ pager: Pager; objects: Metadata[] }> { + return apiToFuture( + //@ts-ignore + this.api.models[type].get({ + filter: options.filter ? { identifiable: { token: options.filter } } : undefined, + fields: { ...fieldOptions, id: true, name: true, code: true }, + pageSize: options.pageSize ?? 25, + page: options.page ?? 1, + }) + ); + } + + public listAll( + types: MetadataType[], + fields = { id: true, name: true, code: true }, + filter?: string + ): FutureData { + const params = _.zipObject( + types, + types.map(() => ({ fields, filter })) + ); + + return apiToFuture(this.api.metadata.get(params)); + } +} diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 0139efc..6dd65eb 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -84,9 +84,14 @@ export class UserD2ApiRepository implements UserRepository { const listOptions = { filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, }; + console.log(usersToSave) return this.getFullUsers(listOptions).flatMap(existingUsers => { + console.log(existingUsers) const usersToSend = existingUsers.map((existingUser, index) => ({ ...existingUser, + organisationUnits: usersToSave[index]?.organisationUnits, + dataViewOrganisationUnits: usersToSave[index]?.dataViewOrganisationUnits, + userGroups: usersToSave[index]?.userGroups, email: usersToSave[index]?.email, firstName: usersToSave[index]?.firstName, surname: usersToSave[index]?.surname, @@ -97,6 +102,7 @@ export class UserD2ApiRepository implements UserRepository { username: usersToSave[index]?.username, }, })); + console.log(usersToSend) return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data); }); } diff --git a/src/domain/entities/Metadata.ts b/src/domain/entities/Metadata.ts new file mode 100644 index 0000000..cdeed45 --- /dev/null +++ b/src/domain/entities/Metadata.ts @@ -0,0 +1,9 @@ +import { D2ModelSchemas } from "../../types/d2-api"; + +export type MetadataType = keyof D2ModelSchemas; + +export type MetadataPackage = Record; + +export type Metadata = { id: string; name: string; shortName?: string; code?: string; [key: string]: any }; + +export type { MetadataResponse, Stats as MetadataResponseStats } from "../../types/d2-api"; diff --git a/src/domain/repositories/MetadataRepository.ts b/src/domain/repositories/MetadataRepository.ts new file mode 100644 index 0000000..521a7a9 --- /dev/null +++ b/src/domain/repositories/MetadataRepository.ts @@ -0,0 +1,10 @@ +import { Pager } from "../../types/d2-api"; +import { FutureData } from "../entities/Future"; +import { Metadata, MetadataType, MetadataPackage } from "../entities/Metadata"; + +export interface MetadataRepository { + list(type: MetadataType, options: ListOptions, fieldOptions: {}): FutureData<{ pager: Pager; objects: Metadata[] }>; + listAll(types: MetadataType[], fields?: object, filter?: string): FutureData; +} + +export type ListOptions = { pageSize?: number; page?: number; filter?: string }; diff --git a/src/domain/usecases/ListMetadataUseCase.ts b/src/domain/usecases/ListMetadataUseCase.ts new file mode 100644 index 0000000..b64134c --- /dev/null +++ b/src/domain/usecases/ListMetadataUseCase.ts @@ -0,0 +1,26 @@ +import { UseCase } from "../../CompositionRoot"; +import { Pager } from "@eyeseetea/d2-api/2.34"; +import { FutureData } from "../entities/Future"; +import { Metadata, MetadataType } from "../entities/Metadata"; +import { ListOptions, MetadataRepository } from "../repositories/MetadataRepository"; + +export class ListMetadataUseCase implements UseCase { + constructor(private metadataRepository: MetadataRepository) {} + + public execute( + type: MetadataType, + options: ListOptions & { paging?: boolean } = {}, + fields: {} = {} + ): FutureData<{ pager: Pager; objects: Metadata[] }> { + const { paging = true } = options; + + if (paging) { + return this.metadataRepository.list(type, options, fields); + } else { + return this.metadataRepository.listAll([type], fields, options.filter).map(metadata => ({ + pager: { page: 1, pageCount: 1, pageSize: metadata[type]?.length, total: metadata[type]?.length }, + objects: metadata[type] ?? [], + })); + } + } +} diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index adbd2dc..2258c6f 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -17,7 +17,7 @@ import { FormField } from "../form/fields/FormField"; import { NumberInputFF } from "../form/fields/NumberInputFF"; import { PreviewInputFF } from "../form/fields/PreviewInputFF"; import { OrgUnitLevelsFF } from "./components/OrgUnitLevelsFF"; -//import { OutputFF } from "./components/OutputFF"; +import { OutputFF } from "./components/OutputFF"; import { getPredictorFieldName, missingValueStrategy, PredictorFormField, predictorRequiredFields } from "./utils"; const useValidations = (field: PredictorFormField): { validation?: (...args: any[]) => any; props?: object } => { @@ -55,6 +55,8 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto case "output": return ; */ +// return ; +//model type for dataViewOrganisationUnits ? switch (field) { case "id": case "email": @@ -62,12 +64,13 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto case "surname": return ; case "userGroups": + return ; case "userRoles": + return ; case "organisationUnits": + return ; case "dataViewOrganisationUnits": - return ; - case "organisationUnitLevels": - return ; + return ; case "disabled": return ; default: @@ -76,7 +79,7 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto }; export const RenderPredictorImportField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { - const name = `users[${row}.${field}]`; + const name = `users[${row}].${field}`; const { validation, props: validationProps = {} } = useValidations(field); //console.log(field) const props = { @@ -87,11 +90,10 @@ export const RenderPredictorImportField: React.FC<{ row: number; field: Predicto }; switch (field) { - case "organisationUnitLevels": - case "predictorGroups": - case "generator.expression": - case "sampleSkipTest.expression": - case "output": + case "userGroups": + case "userRoles": + case "organisationUnits": + case "dataViewOrganisationUnits": return ( diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx index 52cb860..d772b5b 100644 --- a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx +++ b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx @@ -1,31 +1,39 @@ +import React from "react"; import { TransferOption } from "@dhis2/ui"; import { NamedRef } from "../../../../domain/entities/Ref"; import { useAppContext } from "../../../contexts/app-context"; import { useFuture } from "../../../hooks/useFuture"; import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; +import { D2ModelSchemas } from "@eyeseetea/d2-api/2.34"; -export const OrgUnitLevelsFF: React.FC> = props => { +export interface OrgUnitLevelsFFProps extends TransferFFProps{ + modelType: keyof D2ModelSchemas; +} +export const OrgUnitLevelsFF: React.FC> = props => { const { compositionRoot } = useAppContext(); - - /*const { data: orgUnitLevels = [] } = useFuture( + //buildTransferOptions(objects) + const { data: orgUnitLevels = [] } = useFuture( () => - compositionRoot.metadata.list("organisationUnitLevels").map(({ objects }) => buildTransferOptions(objects)), + compositionRoot.metadata.list(props.modelType).map(({objects}) => buildTransferOptions(objects)), [] - );*/ - const options1 = [{ label: "test1", value: "test1" }]; - + ); + const options = [{value: "test", label: "test"}] return ( + + + ); }; const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + console.log(options) return options.map(({ id, name }) => ({ value: id, label: name })); }; diff --git a/src/webapp/components/user-form/components/OutputFF.tsx b/src/webapp/components/user-form/components/OutputFF.tsx index 5714351..a81de09 100644 --- a/src/webapp/components/user-form/components/OutputFF.tsx +++ b/src/webapp/components/user-form/components/OutputFF.tsx @@ -1,5 +1,4 @@ -export {}; -/*import { FieldState, SingleSelectField, SingleSelectOption } from "@dhis2/ui"; +import { FieldState, SingleSelectField, SingleSelectOption } from "@dhis2/ui"; import _ from "lodash"; import React, { useCallback } from "react"; import { useField } from "react-final-form"; @@ -14,7 +13,7 @@ export const OutputFF: React.FC = ({ input, optionCo const { compositionRoot } = useAppContext(); const { input: optionComboInput } = useField(optionComboField); - const { data: dataElements = [] } = useFuture( + /*const { data: dataElements = [] } = useFuture( () => compositionRoot.metadata .list( @@ -24,47 +23,40 @@ export const OutputFF: React.FC = ({ input, optionCo ) .map(({ objects }) => buildOptions(objects as unknown as DataElementWithCategoryOptionCombo[])), [] - ); + );*/ + const dataElements = [{ label: "test1", value: "test1" }]; const onChangeDataElement = useCallback( ({ selected }) => { const dataElement = dataElements.find(item => item.value === selected); if (dataElement) { input.onChange({ id: dataElement.value, name: dataElement.label }); - const categoryOption = dataElement.categoryOptions[0]; + /*const categoryOption = dataElement.categoryOptions[0]; optionComboInput.onChange( categoryOption ? { id: categoryOption.value, name: categoryOption.label } : undefined - ); - } - }, - [dataElements, input, optionComboInput] - ); - - const onChangeOptionCombo = useCallback( - ({ selected }) => { - const optionCombo = dataElements - .find(item => item.value === input.value.id) - ?.categoryOptions.find(item => item.value === selected); - - if (optionCombo) { - optionComboInput.onChange({ id: optionCombo.value, name: optionCombo.label }); + );*/ } }, [dataElements, input, optionComboInput] ); + //categoryOptions: [] const dataElementItems = _.unionBy( dataElements, - [{ value: input.value.id, label: i18n.t("Invalid option"), categoryOptions: [] }], + [{ value: input.value.id, label: i18n.t("Invalid option") }], ({ value }) => value ); - const categoryItems = _.unionBy( + /*const categoryItems = _.unionBy( dataElements.find(({ value }) => value === input.value.id)?.categoryOptions, [{ value: optionComboInput.value.id, label: i18n.t("Invalid option") }], ({ value }) => value - ); - + );*/ + /* + {categoryItems.map(({ value, label }) => ( + + ))} + */ return ( @@ -72,17 +64,6 @@ export const OutputFF: React.FC = ({ input, optionCo ))} - - {(dataElements.find(({ value }) => value === input.value.id)?.categoryOptions.length ?? 0) > 1 && ( - - {getPredictorFieldName("outputCombo")} - - {categoryItems.map(({ value, label }) => ( - - ))} - - - )} ); }; @@ -112,4 +93,4 @@ const buildOptions = ( const Row = styled.div` margin: 20px 0; `; -*/ + diff --git a/src/webapp/components/user-form/utils.ts b/src/webapp/components/user-form/utils.ts index 775f6bd..f08208b 100644 --- a/src/webapp/components/user-form/utils.ts +++ b/src/webapp/components/user-form/utils.ts @@ -25,6 +25,14 @@ export const getPredictorName = (field: PredictorFormField) => { return i18n.t("Email"); case "disabled": return i18n.t("Disabled"); + case "userRoles": + return i18n.t("User Roles"); + case "userGroups": + return i18n.t("User Groups"); + case "organisationUnits": + return i18n.t("Organisation Units"); + case "dataViewOrganisationUnits": + return i18n.t("Data View Organisation Units"); case "output": return i18n.t("Output data element"); case "outputCombo": diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 3f01219..a7fa969 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -53,6 +53,7 @@ export const UserBulkEditPage = () => { //loading.show(true, i18n.t("Saving predictors")); const { data, error } = await compositionRoot.users.save(users).runAsync(); console.log(data); + console.log(error); if (error) return error ?? i18n.t("Network error"); //loading.reset(); if (data && data.status === "ERROR") { @@ -146,7 +147,7 @@ export const UserBulkEditPage = () => { ); }; //"userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits" -const baseUserColumns = ["id", "firstName", "surname", "email", "disabled"]; +const baseUserColumns = ["id", "firstName", "surname", "email", "disabled", "userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits"]; const MaxHeight = styled.div` height: 95%; From 8eb1941371d57065153d45eb75b24a677a80fecb Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Wed, 24 Nov 2021 12:37:22 +0100 Subject: [PATCH 081/192] add metadata API without paging for user roles and user groups --- .env | 4 ++-- src/data/models/UserModel.ts | 6 +++--- src/data/repositories/MetadataD2ApiRepository.ts | 6 ++++-- src/data/repositories/UserD2ApiRepository.ts | 4 +--- src/domain/entities/User.ts | 9 +++++---- src/domain/usecases/ListMetadataUseCase.ts | 6 ++++-- src/legacy/components/OrgUnitForm.js | 2 +- src/webapp/components/form/fields/TransferFF.tsx | 2 +- .../components/user-form/components/OrgUnitLevelsFF.tsx | 9 ++++++--- src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx | 2 +- 10 files changed, 28 insertions(+), 22 deletions(-) diff --git a/.env b/.env index 82781ca..ba6edae 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ BROWSER=false PORT=8081 SKIP_PREFLIGHT_CHECK=true -REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/play -REACT_APP_DHIS2_AUTH='admin:district' +REACT_APP_DHIS2_BASE_URL=https://dev.eyeseetea.com/who-dev-234 +REACT_APP_DHIS2_AUTH='ignacio.foche:Ignacio2018!' CYPRESS_DHIS2_AUTH='admin:district' CYPRESS_EXTERNAL_API="https://dev.eyeseetea.com/play" diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index 6e31e29..fbb0895 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -11,12 +11,12 @@ export const AccessPermissionsModel: Codec = Schema.object({ manage: Schema.optional(Schema.boolean), }); -export const UserRolesModel: Codec = Schema.extend( +/*export const UserRolesModel: Codec = Schema.extend( NamedRefModel, Schema.object({ authorities: Schema.array(Schema.string), }) -); +);*/ export const UserModel: Codec = Schema.object({ id: Schema.nonEmptyString, @@ -27,7 +27,7 @@ export const UserModel: Codec = Schema.object({ email: Schema.nonEmptyString, lastUpdated: Schema.nonEmptyString, created: Schema.nonEmptyString, - userRoles: Schema.array(UserRolesModel), + userRoles: Schema.array(NamedRefModel), userGroups: Schema.array(NamedRefModel), organisationUnits: Schema.array(NamedRefModel), dataViewOrganisationUnits: Schema.array(NamedRefModel), diff --git a/src/data/repositories/MetadataD2ApiRepository.ts b/src/data/repositories/MetadataD2ApiRepository.ts index d991f60..2bc82e5 100644 --- a/src/data/repositories/MetadataD2ApiRepository.ts +++ b/src/data/repositories/MetadataD2ApiRepository.ts @@ -19,13 +19,15 @@ export class MetadataD2ApiRepository implements MetadataRepository { options: { pageSize?: number; page?: number; filter?: string }, fieldOptions: {} ): FutureData<{ pager: Pager; objects: Metadata[] }> { + //, authorities: true return apiToFuture( //@ts-ignore this.api.models[type].get({ filter: options.filter ? { identifiable: { token: options.filter } } : undefined, fields: { ...fieldOptions, id: true, name: true, code: true }, - pageSize: options.pageSize ?? 25, - page: options.page ?? 1, + paging: false + //pageSize: options.pageSize ?? 25, + //page: options.page ?? 1, }) ); } diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 6dd65eb..e17a114 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -84,9 +84,8 @@ export class UserD2ApiRepository implements UserRepository { const listOptions = { filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, }; - console.log(usersToSave) + return this.getFullUsers(listOptions).flatMap(existingUsers => { - console.log(existingUsers) const usersToSend = existingUsers.map((existingUser, index) => ({ ...existingUser, organisationUnits: usersToSave[index]?.organisationUnits, @@ -102,7 +101,6 @@ export class UserD2ApiRepository implements UserRepository { username: usersToSave[index]?.username, }, })); - console.log(usersToSend) return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data); }); } diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 86d6279..904dbb7 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -10,7 +10,7 @@ export interface User { email: string; lastUpdated: string; created: string; - userRoles: UserRole[]; + userRoles: NamedRef[]; userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; @@ -32,10 +32,11 @@ export interface AccessPermissions { manage?: boolean; } -export const isSuperAdmin = (user: User): boolean => { +/*export const isSuperAdmin = (user: User): boolean => { return _.some(user.userRoles, ({ authorities }) => authorities.includes("ALL")); }; - +*/ export const hasReplicateAuthority = (user: User): boolean => { - return _.some(user.userRoles, ({ authorities }) => authorities.includes("F_REPLICATE_USER")); + return true; + //return _.some(user.userRoles, ({ authorities }) => authorities.includes("F_REPLICATE_USER")); }; diff --git a/src/domain/usecases/ListMetadataUseCase.ts b/src/domain/usecases/ListMetadataUseCase.ts index b64134c..f1de0c9 100644 --- a/src/domain/usecases/ListMetadataUseCase.ts +++ b/src/domain/usecases/ListMetadataUseCase.ts @@ -12,8 +12,10 @@ export class ListMetadataUseCase implements UseCase { options: ListOptions & { paging?: boolean } = {}, fields: {} = {} ): FutureData<{ pager: Pager; objects: Metadata[] }> { - const { paging = true } = options; + //const { paging = true } = options; + return this.metadataRepository.list(type, options, fields); + /* console.log(options) if (paging) { return this.metadataRepository.list(type, options, fields); } else { @@ -21,6 +23,6 @@ export class ListMetadataUseCase implements UseCase { pager: { page: 1, pageCount: 1, pageSize: metadata[type]?.length, total: metadata[type]?.length }, objects: metadata[type] ?? [], })); - } + }*/ } } diff --git a/src/legacy/components/OrgUnitForm.js b/src/legacy/components/OrgUnitForm.js index f45d6c4..860f39f 100644 --- a/src/legacy/components/OrgUnitForm.js +++ b/src/legacy/components/OrgUnitForm.js @@ -186,7 +186,7 @@ class OrgUnitForm extends React.Component { onUpdateSelection={this.onChange} />
- +
diff --git a/src/webapp/components/form/fields/TransferFF.tsx b/src/webapp/components/form/fields/TransferFF.tsx index 0439514..4cf0e56 100644 --- a/src/webapp/components/form/fields/TransferFF.tsx +++ b/src/webapp/components/form/fields/TransferFF.tsx @@ -29,7 +29,7 @@ export const TransferFF = ({ const onChange = useCallback( ({ selected }: { selected: string[] }) => { - input.onChange(selected.map(id => ({ id, name: options.find(item => item.value === id)?.label ?? "" }))); + input.onChange(selected.map(id => ({ id, name: options.find(item => item.value === id)?.label ?? "", }))); }, [input, options] ); diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx index d772b5b..a622a27 100644 --- a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx +++ b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx @@ -17,7 +17,8 @@ export const OrgUnitLevelsFF: React.FC> = compositionRoot.metadata.list(props.modelType).map(({objects}) => buildTransferOptions(objects)), [] ); - const options = [{value: "test", label: "test"}] + console.log(orgUnitLevels) + return ( > = ); }; - +interface OptionType extends NamedRef { + authorities?: string[]; +} const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { console.log(options) - return options.map(({ id, name }) => ({ value: id, label: name })); + return options.map(({ id, name}) => ({ value: id, label: name })); }; diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index a7fa969..97c4cf6 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -147,7 +147,7 @@ export const UserBulkEditPage = () => { ); }; //"userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits" -const baseUserColumns = ["id", "firstName", "surname", "email", "disabled", "userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits"]; +const baseUserColumns = ["id", "firstName", "surname", "email", "disabled", "userRoles", "userGroups", "organisationUnits", "organisationUnits"]; const MaxHeight = styled.div` height: 95%; From 83257caf78baa051d3343902edc07ff3ebcdc9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 26 Nov 2021 16:56:52 +1300 Subject: [PATCH 082/192] refactored code and simplified to remove use of "in" --- .../components/ReplicateUserFromTemplate.component.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/legacy/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js index b9611cc..3878550 100644 --- a/src/legacy/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -56,11 +56,8 @@ class ReplicateUserFromTemplate extends React.Component { this.setState({ [field]: value, validate: true }); }; - onUpdateFormStatus = formStatus => { - const asyncValidating = "asyncValidating" in formStatus && formStatus.asyncValidating; - const isValid = !asyncValidating && formStatus.valid; - this.setState({ isValid, validate: false }); - }; + onUpdateFormStatus = ({ asyncValidating = false, valid }) => + this.setState({ isValid: !asyncValidating && valid, validate: false }); closeInfoDialog = () => { this.setState({ infoDialog: null }); From af4f0a9bab4d41584e1373ffe96f1bda846469df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 26 Nov 2021 19:52:12 +1300 Subject: [PATCH 083/192] updated entity and view to reflect "N/A" when date is undefined --- src/data/repositories/UserD2ApiRepository.ts | 4 +-- src/domain/entities/User.ts | 2 +- .../user-list-table/UserListTable.tsx | 26 +++++++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index c210428..653c7c2 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -51,7 +51,7 @@ export class UserD2ApiRepository implements UserRepository { } private mapUser(user: D2ApiUser): User { - const lastLogin = user.userCredentials.lastLogin; + const userLastLogin = _.get(user, "userCredentials.lastLogin", 0); return { id: user.id, @@ -65,7 +65,7 @@ export class UserD2ApiRepository implements UserRepository { username: user.userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, userRoles: user.userCredentials.userRoles, - lastLogin: lastLogin === undefined ? "N/A" : new Date(lastLogin), + lastLogin: new Date(userLastLogin), disabled: user.userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index b88b92c..0472078 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -15,7 +15,7 @@ export interface User { userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date | string; + lastLogin: Date; disabled: boolean; access: AccessPermissions; openId: string; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index de2d22e..b7d69ca 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -28,13 +28,22 @@ import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; +interface UserView extends User { + lastLoginView?: string; +} + +const getUserView = (user: User) => ({ + ...user, + lastLoginView: user.lastLogin.getTime() === 0 ? "N/A" : user.lastLogin.toISOString(), +}); + export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); - const baseConfig = useMemo((): TableConfig => { + const baseConfig = useMemo((): TableConfig => { return { columns, details: [ @@ -42,7 +51,7 @@ export const UserListTable: React.FC = props => { { name: "username", text: i18n.t("Username") }, { name: "created", text: i18n.t("Created") }, { name: "lastUpdated", text: i18n.t("Last updated") }, - { name: "lastLogin", text: i18n.t("Last login") }, + { name: "lastLoginView", text: i18n.t("Last login") }, { name: "id", text: i18n.t("ID") }, { name: "apiUrl", text: i18n.t("Api URL") }, { name: "email", text: i18n.t("Email") }, @@ -180,7 +189,7 @@ export const UserListTable: React.FC = props => { search: string, { page, pageSize }: TablePagination, sorting: TableSorting - ): Promise<{ objects: User[]; pager: Pager }> => { + ): Promise<{ objects: UserView[]; pager: Pager }> => { return compositionRoot.users .list({ search, @@ -194,7 +203,8 @@ export const UserListTable: React.FC = props => { [compositionRoot, props.filters] ); - const tableProps = useObjectsTable(baseConfig, refreshRows); + const { rows, ...rest } = useObjectsTable(baseConfig, refreshRows); + const tableProps = { ...rest, rows: rows.map(getUserView) }; return ( @@ -205,7 +215,7 @@ export const UserListTable: React.FC = props => { ); }; -export const columns: TableColumn[] = [ +export const columns: TableColumn[] = [ { name: "username", sortable: false, text: i18n.t("Username") }, { name: "firstName", sortable: true, text: i18n.t("First name") }, { name: "surname", sortable: true, text: i18n.t("Surname") }, @@ -217,7 +227,7 @@ export const columns: TableColumn[] = [ { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, - { name: "lastLogin", sortable: false, text: i18n.t("Last login") }, + { name: "lastLoginView", sortable: false, text: i18n.t("Last login") }, { name: "disabled", sortable: false, @@ -228,7 +238,7 @@ export const columns: TableColumn[] = [ ]; function checkAccess(requiredKeys: string[]) { - return (users: User[]) => + return (users: UserView[]) => _(users).every(user => { const permissions = _(user.access).pickBy().keys().value(); return _(requiredKeys).difference(permissions).isEmpty(); @@ -239,7 +249,7 @@ function isStateActionVisible(action: string) { const currentUserHasUpdateAccessOn = checkAccess(["update"]); const requiredDisabledValue = action === "enable"; - return (users: User[]) => + return (users: UserView[]) => currentUserHasUpdateAccessOn(users) && _(users).some(user => user.disabled === requiredDisabledValue); } From e3a15ad1c61fcb4c3e986db15f36aa47c90f80c6 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 08:24:40 +0100 Subject: [PATCH 084/192] Clean-up user lastLogin access Signed-off-by: Alexis Rico --- src/data/repositories/UserD2ApiRepository.ts | 12 ++++---- src/domain/entities/User.ts | 4 +-- .../user-list-table/UserListTable.tsx | 29 +++++++------------ 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 653c7c2..83318e7 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -51,7 +51,7 @@ export class UserD2ApiRepository implements UserRepository { } private mapUser(user: D2ApiUser): User { - const userLastLogin = _.get(user, "userCredentials.lastLogin", 0); + const { userCredentials } = user; return { id: user.id, @@ -62,15 +62,15 @@ export class UserD2ApiRepository implements UserRepository { lastUpdated: new Date(user.lastUpdated), created: new Date(user.created), userGroups: user.userGroups, - username: user.userCredentials.username, + username: userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, - userRoles: user.userCredentials.userRoles, - lastLogin: new Date(userLastLogin), - disabled: user.userCredentials.disabled, + userRoles: userCredentials.userRoles, + lastLogin: userCredentials.lastLogin ? new Date(userCredentials.lastLogin) : undefined, + disabled: userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, access: user.access, - openId: user.userCredentials.openId ?? "", + openId: userCredentials.openId, }; } } diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 0472078..c5971c5 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -15,10 +15,10 @@ export interface User { userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; - lastLogin: Date; + lastLogin?: Date; disabled: boolean; access: AccessPermissions; - openId: string; + openId?: string; } export interface UserRole extends NamedRef { diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index b7d69ca..996221e 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -28,22 +28,13 @@ import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; -interface UserView extends User { - lastLoginView?: string; -} - -const getUserView = (user: User) => ({ - ...user, - lastLoginView: user.lastLogin.getTime() === 0 ? "N/A" : user.lastLogin.toISOString(), -}); - export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); const [dialogProps, _openDialog] = React.useState(); const enableReplicate = hasReplicateAuthority(currentUser); - const baseConfig = useMemo((): TableConfig => { + const baseConfig = useMemo((): TableConfig => { return { columns, details: [ @@ -51,10 +42,11 @@ export const UserListTable: React.FC = props => { { name: "username", text: i18n.t("Username") }, { name: "created", text: i18n.t("Created") }, { name: "lastUpdated", text: i18n.t("Last updated") }, - { name: "lastLoginView", text: i18n.t("Last login") }, + { name: "lastLogin", text: i18n.t("Last login"), getValue: user => user.lastLogin ?? "-" }, { name: "id", text: i18n.t("ID") }, { name: "apiUrl", text: i18n.t("Api URL") }, { name: "email", text: i18n.t("Email") }, + { name: "openId", text: i18n.t("Open ID") }, { name: "userRoles", text: i18n.t("Roles") }, { name: "userGroups", text: i18n.t("Groups") }, { name: "organisationUnits", text: i18n.t("OU Capture") }, @@ -189,7 +181,7 @@ export const UserListTable: React.FC = props => { search: string, { page, pageSize }: TablePagination, sorting: TableSorting - ): Promise<{ objects: UserView[]; pager: Pager }> => { + ): Promise<{ objects: User[]; pager: Pager }> => { return compositionRoot.users .list({ search, @@ -203,8 +195,7 @@ export const UserListTable: React.FC = props => { [compositionRoot, props.filters] ); - const { rows, ...rest } = useObjectsTable(baseConfig, refreshRows); - const tableProps = { ...rest, rows: rows.map(getUserView) }; + const tableProps = useObjectsTable(baseConfig, refreshRows); return ( @@ -215,11 +206,12 @@ export const UserListTable: React.FC = props => { ); }; -export const columns: TableColumn[] = [ +export const columns: TableColumn[] = [ { name: "username", sortable: false, text: i18n.t("Username") }, { name: "firstName", sortable: true, text: i18n.t("First name") }, { name: "surname", sortable: true, text: i18n.t("Surname") }, { name: "email", sortable: true, text: i18n.t("Email") }, + { name: "openId", sortable: false, text: i18n.t("Open ID"), hidden: true }, { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, { name: "apiUrl", sortable: false, text: i18n.t("Api URL"), hidden: true }, @@ -227,18 +219,17 @@ export const columns: TableColumn[] = [ { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, - { name: "lastLoginView", sortable: false, text: i18n.t("Last login") }, + { name: "lastLogin", sortable: false, text: i18n.t("Last login"), getValue: user => user.lastLogin ?? "-" }, { name: "disabled", sortable: false, text: i18n.t("Disabled"), getValue: row => (row.disabled ? : undefined), }, - { name: "openId", sortable: false, text: i18n.t("Open ID"), hidden: true }, ]; function checkAccess(requiredKeys: string[]) { - return (users: UserView[]) => + return (users: User[]) => _(users).every(user => { const permissions = _(user.access).pickBy().keys().value(); return _(requiredKeys).difference(permissions).isEmpty(); @@ -249,7 +240,7 @@ function isStateActionVisible(action: string) { const currentUserHasUpdateAccessOn = checkAccess(["update"]); const requiredDisabledValue = action === "enable"; - return (users: UserView[]) => + return (users: User[]) => currentUserHasUpdateAccessOn(users) && _(users).some(user => user.disabled === requiredDisabledValue); } From 548f42fb8f4b061e24a534388819c799d4488f89 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 08:28:06 +0100 Subject: [PATCH 085/192] Simplify user edit redirect Signed-off-by: Alexis Rico --- src/legacy/List/context.actions.js | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/legacy/List/context.actions.js b/src/legacy/List/context.actions.js index 4ad9115..3f96e84 100644 --- a/src/legacy/List/context.actions.js +++ b/src/legacy/List/context.actions.js @@ -25,22 +25,7 @@ export async function assignToOrgUnits(userIds, field, titleKey) { }); } -// Compare two arrays lexicographically and return -1 (if xs < ys), 0 (if xs == ys) or 1 (if xs > ys). -function lexicographicalCompare(xs, ys) { - const compare = (x, y) => (x < y ? -1 : x === y ? 0 : 1); - return _(xs).zipWith(ys, compare).find() || 0; -} - export async function goToUserEditPage(userId) { - const d2 = await getD2(); - const user = (await d2.models.users.list({ filter: `id:in:[${userId}]` })).toArray().pop(); - const baseUrl = d2.system.systemInfo.contextPath; - const { major, minor } = d2.system.version; - // DHIS2 >= 2.30 uses a new React user-app - const url = - lexicographicalCompare([major, minor], [2, 30]) >= 0 - ? `${baseUrl}/dhis-web-user/index.html#/users/edit/${user.id}` - : `${baseUrl}/dhis-web-maintenance-user/alluser.action?key=${user.username}`; - + const url = `${baseUrl}/dhis-web-user/index.html#/users/edit/${userId}`; window.open(url, "_blank"); } From ea243b7f0013a67ff77ef4b849ea472c6e53fd3d Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 08:35:16 +0100 Subject: [PATCH 086/192] Add orgunit helpers Signed-off-by: Alexis Rico --- src/domain/entities/OrgUnit.ts | 9 +++++++++ src/legacy/List/context.actions.js | 3 ++- .../organisation-unit-dialog/OrgUnitDialog.component.js | 5 +++-- src/legacy/components/OrgUnitsSelectorFilter.js | 8 +++++--- 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 src/domain/entities/OrgUnit.ts diff --git a/src/domain/entities/OrgUnit.ts b/src/domain/entities/OrgUnit.ts new file mode 100644 index 0000000..be1581b --- /dev/null +++ b/src/domain/entities/OrgUnit.ts @@ -0,0 +1,9 @@ +import _ from "lodash"; + +export function extractIdFromPath(orgUnitPath?: string): string { + return _(orgUnitPath).split("/").last() ?? ""; +} + +export function extractIdsFromPaths(orgUnitPaths: string[]): string[] { + return orgUnitPaths.map(extractIdFromPath); +} diff --git a/src/legacy/List/context.actions.js b/src/legacy/List/context.actions.js index 3f96e84..9c0cdb5 100644 --- a/src/legacy/List/context.actions.js +++ b/src/legacy/List/context.actions.js @@ -1,5 +1,4 @@ import { getInstance as getD2 } from "d2/lib/d2"; -import _ from "lodash"; import { getOrgUnitsRoots } from "../utils/dhis2Helpers"; import _m from "../utils/lodash-mixins"; import orgUnitAssignmentDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; @@ -26,6 +25,8 @@ export async function assignToOrgUnits(userIds, field, titleKey) { } export async function goToUserEditPage(userId) { + const d2 = await getD2(); + const baseUrl = d2.system.systemInfo.contextPath; const url = `${baseUrl}/dhis-web-user/index.html#/users/edit/${userId}`; window.open(url, "_blank"); } diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index 89230e9..dea1d5b 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -4,9 +4,10 @@ import _ from "lodash"; import Toggle from "material-ui/Toggle/Toggle"; import PropTypes from "prop-types"; import React from "react"; +import { extractIdsFromPaths } from "../../../domain/entities/OrgUnit"; import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; -import _m from "../../utils/lodash-mixins"; import { getOrgUnitsPaths, listWithInFilter } from "../../utils/dhis2Helpers"; +import _m from "../../utils/lodash-mixins"; class OrgUnitDialog extends React.Component { constructor(props, context) { @@ -83,7 +84,7 @@ class OrgUnitDialog extends React.Component { const { d2 } = this.context; const { selected } = this.state; - const orgUnitIds = selected.map(path => _.last(path.split("/"))); + const orgUnitIds = extractIdsFromPaths(selected); const selectedOus = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { paging: false, fields: "id,displayName,shortName,path", diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index 604c4e1..ae3b1fa 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -1,8 +1,9 @@ +import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; -import { ConfirmationDialog, OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; +import { extractIdsFromPaths } from "../../domain/entities/OrgUnit"; import { getOrgUnitsPaths, listWithInFilter } from "../utils/dhis2Helpers"; class OrgUnitsSelectorFilter extends React.Component { @@ -56,8 +57,9 @@ class OrgUnitsSelectorFilter extends React.Component { async applyAndClose() { const { d2 } = this.context; - const orgUnitIds = getOrgUnitsPaths(this.state.selected).map(path => _.last(path.split("/"))); - const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { + const paths = getOrgUnitsPaths(this.state.selected); + + const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", extractIdsFromPaths(paths), { paging: false, fields: "id,displayName,shortName,path", }); From 6eabf9faf4184854ff23d21736a1a87abbf04dd7 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 08:59:06 +0100 Subject: [PATCH 087/192] Use paths for org unit selector Signed-off-by: Alexis Rico --- i18n/en.pot | 10 ++++----- i18n/es.po | 8 +++---- .../OrgUnitDialog.component.js | 16 ++++++-------- src/legacy/components/Dropdown.component.js | 2 +- .../components/MultipleFilter.component.js | 2 +- .../components/OrgUnitsSelectorFilter.js | 21 +++++++++---------- src/legacy/utils/dhis2Helpers.js | 5 +---- .../user-list-table/UserListTable.tsx | 4 ++-- 8 files changed, 30 insertions(+), 38 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index dcbb1f4..5cb9b8a 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-16T12:02:22.312Z\n" -"PO-Revision-Date: 2021-11-16T12:02:22.312Z\n" +"POT-Creation-Date: 2021-11-26T07:40:41.047Z\n" +"PO-Revision-Date: 2021-11-26T07:40:41.047Z\n" msgid "Enable users" msgstr "" @@ -53,6 +53,9 @@ msgstr "" msgid "Email" msgstr "" +msgid "Open ID" +msgstr "" + msgid "Roles" msgstr "" @@ -118,6 +121,3 @@ msgstr "" msgid "Disabled" msgstr "" - -msgid "Open ID" -msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 5e3b848..15b656b 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-16T12:02:22.312Z\n" +"POT-Creation-Date: 2021-11-26T07:40:41.047Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,6 +53,9 @@ msgstr "" msgid "Email" msgstr "" +msgid "Open ID" +msgstr "" + msgid "Roles" msgstr "" @@ -118,6 +121,3 @@ msgstr "" msgid "Disabled" msgstr "" - -msgid "Open ID" -msgstr "" diff --git a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js index dea1d5b..b264245 100644 --- a/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js +++ b/src/legacy/List/organisation-unit-dialog/OrgUnitDialog.component.js @@ -6,7 +6,7 @@ import PropTypes from "prop-types"; import React from "react"; import { extractIdsFromPaths } from "../../../domain/entities/OrgUnit"; import BatchModelsMultiSelectModel from "../../components/batch-models-multi-select/BatchModelsMultiSelect.model"; -import { getOrgUnitsPaths, listWithInFilter } from "../../utils/dhis2Helpers"; +import { listWithInFilter } from "../../utils/dhis2Helpers"; import _m from "../../utils/lodash-mixins"; class OrgUnitDialog extends React.Component { @@ -31,10 +31,9 @@ class OrgUnitDialog extends React.Component { }), }; this.model = new BatchModelsMultiSelectModel(this.context.d2, modelOptions); - const selected = this.getCommonOrgUnits(props.models, props.field); this.state = { - selected: selected, + selected: this.getCommonOrgUnits(props.models, props.field), updateStrategy: props.models.length > 1 ? "merge" : "replace", }; @@ -44,7 +43,7 @@ class OrgUnitDialog extends React.Component { } getCommonOrgUnits(objects, orgUnitField) { - return _.intersectionBy(...objects.map(obj => obj[orgUnitField].toArray()), "id"); + return _.intersectionBy(...objects.map(obj => obj[orgUnitField].toArray()), "id").map(ou => ou.path); } _renderStrategyToggle = () => { @@ -81,11 +80,8 @@ class OrgUnitDialog extends React.Component { } async save() { - const { d2 } = this.context; - const { selected } = this.state; - - const orgUnitIds = extractIdsFromPaths(selected); - const selectedOus = await listWithInFilter(d2.models.organisationUnits, "id", orgUnitIds, { + const orgUnitIds = extractIdsFromPaths(this.state.selected); + const selectedOus = await listWithInFilter(this.context.d2.models.organisationUnits, "id", orgUnitIds, { paging: false, fields: "id,displayName,shortName,path", }); @@ -120,7 +116,7 @@ class OrgUnitDialog extends React.Component { show a normal SelectField, diff --git a/src/legacy/components/MultipleFilter.component.js b/src/legacy/components/MultipleFilter.component.js index ba91d42..ad11322 100644 --- a/src/legacy/components/MultipleFilter.component.js +++ b/src/legacy/components/MultipleFilter.component.js @@ -1,9 +1,9 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; import FilteredMultiSelect from "./FilteredMultiSelect.component"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; class MultipleFilter extends React.Component { constructor(props, context) { diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index ae3b1fa..3449fc6 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -4,7 +4,7 @@ import TextField from "material-ui/TextField"; import PropTypes from "prop-types"; import React from "react"; import { extractIdsFromPaths } from "../../domain/entities/OrgUnit"; -import { getOrgUnitsPaths, listWithInFilter } from "../utils/dhis2Helpers"; +import { listWithInFilter } from "../utils/dhis2Helpers"; class OrgUnitsSelectorFilter extends React.Component { constructor(props, context) { @@ -51,20 +51,19 @@ class OrgUnitsSelectorFilter extends React.Component { this.setState({ dialogOpen: false }); } - onChange(selected) { - this.setState({ selected }); - } - - async applyAndClose() { - const { d2 } = this.context; - const paths = getOrgUnitsPaths(this.state.selected); + async onChange(paths) { + const ids = extractIdsFromPaths(paths); - const newSelected = await listWithInFilter(d2.models.organisationUnits, "id", extractIdsFromPaths(paths), { + const selected = await listWithInFilter(this.context.d2.models.organisationUnits, "id", ids, { paging: false, fields: "id,displayName,shortName,path", }); - this.props.onChange(newSelected); + this.setState({ selected }); + } + + async applyAndClose() { + this.props.onChange(this.state.selected); this.closeDialog(); } @@ -100,7 +99,7 @@ class OrgUnitsSelectorFilter extends React.Component { > ou.path)} onChange={this.onChange} controls={{ filterByLevel: true, diff --git a/src/legacy/utils/dhis2Helpers.js b/src/legacy/utils/dhis2Helpers.js index c13ed59..5eee228 100644 --- a/src/legacy/utils/dhis2Helpers.js +++ b/src/legacy/utils/dhis2Helpers.js @@ -10,9 +10,6 @@ function getOrgUnitsRoots() { .toPromise(); } -const getOrgUnitsPaths = ouOrPaths => - ouOrPaths.map(ouOrPath => (typeof ouOrPath === "object" && "path" in ouOrPath ? ouOrPath.path : ouOrPath)); - async function mapPromise(inputValues, mapper) { const output = []; for (const value of inputValues) { @@ -79,4 +76,4 @@ async function getModelValuesByField(d2, fields) { ); } -export { getOrgUnitsRoots, mapPromise, getModelValuesByField, listWithInFilter, getOrgUnitsPaths }; +export { getOrgUnitsRoots, mapPromise, getModelValuesByField, listWithInFilter }; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 996221e..339f6ba 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -42,7 +42,7 @@ export const UserListTable: React.FC = props => { { name: "username", text: i18n.t("Username") }, { name: "created", text: i18n.t("Created") }, { name: "lastUpdated", text: i18n.t("Last updated") }, - { name: "lastLogin", text: i18n.t("Last login"), getValue: user => user.lastLogin ?? "-" }, + { name: "lastLogin", text: i18n.t("Last login") }, { name: "id", text: i18n.t("ID") }, { name: "apiUrl", text: i18n.t("Api URL") }, { name: "email", text: i18n.t("Email") }, @@ -219,7 +219,7 @@ export const columns: TableColumn[] = [ { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, - { name: "lastLogin", sortable: false, text: i18n.t("Last login"), getValue: user => user.lastLogin ?? "-" }, + { name: "lastLogin", sortable: false, text: i18n.t("Last login") }, { name: "disabled", sortable: false, From 912ca55c63d59dc294c1c8eb30cf47cfbdc9e9a0 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 08:59:46 +0100 Subject: [PATCH 088/192] Capitalize API Signed-off-by: Alexis Rico --- i18n/en.pot | 6 +++--- i18n/es.po | 4 ++-- src/webapp/components/user-list-table/UserListTable.tsx | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 5cb9b8a..6db9dab 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-26T07:40:41.047Z\n" -"PO-Revision-Date: 2021-11-26T07:40:41.047Z\n" +"POT-Creation-Date: 2021-11-26T07:59:41.934Z\n" +"PO-Revision-Date: 2021-11-26T07:59:41.934Z\n" msgid "Enable users" msgstr "" @@ -47,7 +47,7 @@ msgstr "" msgid "ID" msgstr "" -msgid "Api URL" +msgid "API URL" msgstr "" msgid "Email" diff --git a/i18n/es.po b/i18n/es.po index 15b656b..4d94075 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-26T07:40:41.047Z\n" +"POT-Creation-Date: 2021-11-26T07:59:41.934Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,7 +47,7 @@ msgstr "" msgid "ID" msgstr "" -msgid "Api URL" +msgid "API URL" msgstr "" msgid "Email" diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 339f6ba..2948ea3 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -44,7 +44,7 @@ export const UserListTable: React.FC = props => { { name: "lastUpdated", text: i18n.t("Last updated") }, { name: "lastLogin", text: i18n.t("Last login") }, { name: "id", text: i18n.t("ID") }, - { name: "apiUrl", text: i18n.t("Api URL") }, + { name: "apiUrl", text: i18n.t("API URL") }, { name: "email", text: i18n.t("Email") }, { name: "openId", text: i18n.t("Open ID") }, { name: "userRoles", text: i18n.t("Roles") }, @@ -214,7 +214,7 @@ export const columns: TableColumn[] = [ { name: "openId", sortable: false, text: i18n.t("Open ID"), hidden: true }, { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, - { name: "apiUrl", sortable: false, text: i18n.t("Api URL"), hidden: true }, + { name: "apiUrl", sortable: false, text: i18n.t("API URL"), hidden: true }, { name: "userRoles", sortable: false, text: i18n.t("Roles"), hidden: true }, { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, From bcaf4638f65447fa52a5802f8584c8902f6c3c50 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 09:26:59 +0100 Subject: [PATCH 089/192] Add ellipsis to long arrays Signed-off-by: Alexis Rico --- i18n/en.pot | 7 ++- i18n/es.po | 5 +- .../user-list-table/UserListTable.tsx | 51 +++++++++++++++++-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 6db9dab..2546afb 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-26T07:59:41.934Z\n" -"PO-Revision-Date: 2021-11-26T07:59:41.934Z\n" +"POT-Creation-Date: 2021-11-26T08:24:28.513Z\n" +"PO-Revision-Date: 2021-11-26T08:24:28.513Z\n" msgid "Enable users" msgstr "" @@ -121,3 +121,6 @@ msgstr "" msgid "Disabled" msgstr "" + +msgid "And {{overflow}} more..." +msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 4d94075..1b89120 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-26T07:59:41.934Z\n" +"POT-Creation-Date: 2021-11-26T08:24:28.513Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -121,3 +121,6 @@ msgstr "" msgid "Disabled" msgstr "" + +msgid "And {{overflow}} more..." +msgstr "" diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 2948ea3..1faeb77 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -10,11 +10,12 @@ import { TableSorting, useObjectsTable, } from "@eyeseetea/d2-ui-components"; -import { Icon } from "@material-ui/core"; +import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; import React, { useCallback, useMemo } from "react"; +import { NamedRef } from "../../../domain/entities/Ref"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; import { ListFilters } from "../../../domain/repositories/UserRepository"; import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; @@ -215,10 +216,32 @@ export const columns: TableColumn[] = [ { name: "created", sortable: true, text: i18n.t("Created"), hidden: true }, { name: "lastUpdated", sortable: true, text: i18n.t("Last updated"), hidden: true }, { name: "apiUrl", sortable: false, text: i18n.t("API URL"), hidden: true }, - { name: "userRoles", sortable: false, text: i18n.t("Roles"), hidden: true }, - { name: "userGroups", sortable: false, text: i18n.t("Groups"), hidden: true }, - { name: "organisationUnits", sortable: false, text: i18n.t("Organisation units") }, - { name: "dataViewOrganisationUnits", sortable: false, text: i18n.t("Data view organisation units") }, + { + name: "userRoles", + sortable: false, + text: i18n.t("Roles"), + getValue: user => buildEllipsizedList(user.userRoles), + hidden: true, + }, + { + name: "userGroups", + sortable: false, + text: i18n.t("Groups"), + getValue: user => buildEllipsizedList(user.userGroups), + hidden: true, + }, + { + name: "organisationUnits", + sortable: false, + text: i18n.t("Organisation units"), + getValue: user => buildEllipsizedList(user.organisationUnits), + }, + { + name: "dataViewOrganisationUnits", + sortable: false, + text: i18n.t("Data view organisation units"), + getValue: user => buildEllipsizedList(user.dataViewOrganisationUnits), + }, { name: "lastLogin", sortable: false, text: i18n.t("Last login") }, { name: "disabled", @@ -248,3 +271,21 @@ export interface UserListTableProps extends Pick, "loadi openSettings: () => void; filters: ListFilters; } + +function buildEllipsizedList(items: NamedRef[], limit = 3) { + const names = items.map(item => item.name); + const overflow = items.length - limit; + const hasOverflow = overflow > 0; + + const buildList = (items: string[]) => items.map((item, idx) =>
  • {item}
  • ); + + return ( + +
      + {buildList(_.take(names, limit))} + + {hasOverflow &&
    • {i18n.t("And {{overflow}} more...", { overflow })}
    • } +
    +
    + ); +} From 5f0265537a7ffb422dd124acc6a9a07422e1265a Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 10:04:06 +0100 Subject: [PATCH 090/192] Add select all ids --- src/CompositionRoot.ts | 2 ++ src/data/repositories/UserD2ApiRepository.ts | 16 +++++++++++- src/domain/repositories/UserRepository.ts | 1 + src/domain/usecases/ListAllUserIdsUseCase.ts | 11 ++++++++ .../user-list-table/UserListTable.tsx | 26 +++++++++++++++---- 5 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 src/domain/usecases/ListAllUserIdsUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 05844ef..cfb3470 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -4,6 +4,7 @@ import { UserD2ApiRepository } from "./data/repositories/UserD2ApiRepository"; import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; +import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; export function getCompositionRoot(instance: Instance) { @@ -17,6 +18,7 @@ export function getCompositionRoot(instance: Instance) { users: getExecute({ getCurrent: new GetCurrentUserUseCase(userRepository), list: new ListUsersUseCase(userRepository), + listAllIds: new ListAllUserIdsUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), }), }; diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 83318e7..725430f 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -30,7 +30,6 @@ export class UserD2ApiRepository implements UserRepository { fields, page, pageSize, - paging: true, query: search, filter: otherFilters, order: `${sorting.field}:${sorting.order}`, @@ -41,6 +40,21 @@ export class UserD2ApiRepository implements UserRepository { })); } + public listAllIds(options: ListOptions): FutureData { + const { search, sorting = { field: "firstName", order: "asc" }, filters } = options; + const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); + + return apiToFuture( + this.api.models.users.get({ + fields: { id: true }, + paging: false, + query: search, + filter: otherFilters, + order: `${sorting.field}:${sorting.order}`, + }) + ).map(({ objects }) => objects.map(user => user.id)); + } + public getById(id: string): FutureData { return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap(({ objects }) => { const [user] = objects; diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 4df5ffd..d1159e7 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -5,6 +5,7 @@ import { User } from "../entities/User"; export interface UserRepository { getCurrent(): FutureData; list(options: ListOptions): FutureData>; + listAllIds(options: ListOptions): FutureData; getById(id: string): FutureData; } diff --git a/src/domain/usecases/ListAllUserIdsUseCase.ts b/src/domain/usecases/ListAllUserIdsUseCase.ts new file mode 100644 index 0000000..6768627 --- /dev/null +++ b/src/domain/usecases/ListAllUserIdsUseCase.ts @@ -0,0 +1,11 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { ListOptions, UserRepository } from "../repositories/UserRepository"; + +export class ListAllUserIdsUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute(options: ListOptions): FutureData { + return this.userRepository.listAllIds(options); + } +} diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 1faeb77..d891e19 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -9,12 +9,13 @@ import { TablePagination, TableSorting, useObjectsTable, + useSnackbar, } from "@eyeseetea/d2-ui-components"; import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; -import React, { useCallback, useMemo } from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { NamedRef } from "../../../domain/entities/Ref"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; import { ListFilters } from "../../../domain/repositories/UserRepository"; @@ -25,13 +26,15 @@ import enableStore from "../../../legacy/List/enable.store"; import replicateUserStore from "../../../legacy/List/replicateUser.store"; import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.store"; import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; - import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); - const [dialogProps, _openDialog] = React.useState(); + const snackbar = useSnackbar(); + + const [dialogProps, _openDialog] = useState(); + const [allIds, setAllIds] = useState([]); const enableReplicate = hasReplicateAuthority(currentUser); @@ -183,6 +186,17 @@ export const UserListTable: React.FC = props => { { page, pageSize }: TablePagination, sorting: TableSorting ): Promise<{ objects: User[]; pager: Pager }> => { + compositionRoot.users + .listAllIds({ + search, + sorting, + filters: props?.filters, + }) + .run( + ids => setAllIds(ids), + error => snackbar.error(error) + ); + return compositionRoot.users .list({ search, @@ -193,7 +207,7 @@ export const UserListTable: React.FC = props => { }) .toPromise(); }, - [compositionRoot, props.filters] + [compositionRoot, snackbar, props.filters] ); const tableProps = useObjectsTable(baseConfig, refreshRows); @@ -202,7 +216,9 @@ export const UserListTable: React.FC = props => { {dialogProps && } - {props.children} + + {props.children} + ); }; From 8e53982b23313c04f19ba9c60ec7164287188702 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 12:46:11 +0100 Subject: [PATCH 091/192] Fix all ids gathering Signed-off-by: Alexis Rico --- package.json | 2 +- src/data/repositories/UserD2ApiRepository.ts | 4 +- .../user-list-table/UserListTable.tsx | 28 +- yarn.lock | 625 +++++++++++++++++- 4 files changed, 636 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 007ceb2..c02c3a1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dhis2/d2-i18n-generate": "1.2.0", "@dhis2/ui": "7.2.1", "@eyeseetea/d2-api": "1.9.2", - "@eyeseetea/d2-ui-components": "2.6.7", + "@eyeseetea/d2-ui-components": "2.6.9-beta.5", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", "axios": "0.21.4", diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 725430f..9453920 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -30,7 +30,7 @@ export class UserD2ApiRepository implements UserRepository { fields, page, pageSize, - query: search, + query: search !== "" ? search : undefined, filter: otherFilters, order: `${sorting.field}:${sorting.order}`, }) @@ -48,7 +48,7 @@ export class UserD2ApiRepository implements UserRepository { this.api.models.users.get({ fields: { id: true }, paging: false, - query: search, + query: search !== "" ? search : undefined, filter: otherFilters, order: `${sorting.field}:${sorting.order}`, }) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index d891e19..c67eef9 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -31,10 +31,8 @@ import { useAppContext } from "../../contexts/app-context"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); - const snackbar = useSnackbar(); const [dialogProps, _openDialog] = useState(); - const [allIds, setAllIds] = useState([]); const enableReplicate = hasReplicateAuthority(currentUser); @@ -186,37 +184,39 @@ export const UserListTable: React.FC = props => { { page, pageSize }: TablePagination, sorting: TableSorting ): Promise<{ objects: User[]; pager: Pager }> => { - compositionRoot.users - .listAllIds({ + return compositionRoot.users + .list({ search, + page, + pageSize, sorting, filters: props?.filters, }) - .run( - ids => setAllIds(ids), - error => snackbar.error(error) - ); + .toPromise(); + }, + [compositionRoot, props.filters] + ); + const refreshAllIds = useCallback( + (search: string, sorting: TableSorting): Promise => { return compositionRoot.users - .list({ + .listAllIds({ search, - page, - pageSize, sorting, filters: props?.filters, }) .toPromise(); }, - [compositionRoot, snackbar, props.filters] + [compositionRoot, props.filters] ); - const tableProps = useObjectsTable(baseConfig, refreshRows); + const tableProps = useObjectsTable(baseConfig, refreshRows, refreshAllIds); return ( {dialogProps && } - + {props.children} diff --git a/yarn.lock b/yarn.lock index 437f425..79d70ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1274,6 +1274,17 @@ dependencies: "@date-io/core" "^1.0.2" +"@dhis2-ui/alert@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-6.15.2.tgz#95d2de9ba0f316798d55339cb672ea632b470018" + integrity sha512-dDjHQ+5eWIPPTxBlWLIM3lPa/3Bd4DHenODi6pLsajMKKpSmrdqVo/AazQVYIqUWquVpZv2Cm/pqs4lmziNiNQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/alert@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-7.2.1.tgz#07faad192ec7a145c4ced0adfd6987fa10484aa6" @@ -1286,6 +1297,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/box@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-6.15.2.tgz#7b27190363ad9250a7ea092646ab11f39c86a9cb" + integrity sha512-HXAQcFDjwEgjM8ZPS49hbkfV/bTkjC/aqPuXyJ6mqPS6S7r5bl4zzGVhVOSmi5V81Lhspx5qr16b79t6TukJTg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/box@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-7.2.1.tgz#c6a5ace28dcfaff6457eebe737cf4f4a608ae271" @@ -1296,6 +1317,20 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/button@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-6.15.2.tgz#bdf44efa7ebd17df031c75495c833b6f8c4a8cae" + integrity sha512-MIhCN3fxHNOrlRCXVNqAi+sgZYCPfFzE/2hbMNLAtRWOQTBNqnicwfGNtcJY2wzkhO+y/8OJilmY2pBjZBjY1A== + dependencies: + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/button@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-7.2.1.tgz#c03d21a370848deefe73d3db0ea276cf07707d18" @@ -1310,6 +1345,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/card@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-6.15.2.tgz#ac1db093fc1f3bc40fbca78f803e2a7d38dd69bb" + integrity sha512-y1KClCq1P9Kb5cqi/GgFeA593nrRnznXkK4mqW9xiygoB0R2ongPHSOAwJTSklff31Hzi9l2DIi1ZUgX871eaw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/card@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-7.2.1.tgz#4038044dd48358702e73371d9d08cc1d55e01d6d" @@ -1320,6 +1365,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/center@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-6.15.2.tgz#7e4461c165c30b87d629bf390f03e54e8dbcb2c8" + integrity sha512-pjXWJ5nbYwNpf0t8iy/7DVN+bJnvO8XWRz3uraS8NJ7IjhHtLl0sktpG0tIatiAzjrtO1QLD9ds0o4oRgT52MQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/center@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-7.2.1.tgz#bc0b04ab414da45124207cc8fff7612b5f6f3209" @@ -1330,6 +1385,18 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/checkbox@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-6.15.2.tgz#673d5f33025b4cb81984eb2c729eca5b14e12581" + integrity sha512-jM7KDsgq/fMOSoWTa08P3Qq6JzUM6zySsmCdEC4AHBmsD0u/2Eb1ktyv/BZQkPMx14lInSMtPsvcWCPaNtCtJg== + dependencies: + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/required" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/checkbox@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-7.2.1.tgz#8825cdf7a05169154ab59f0f825c624a54f033bb" @@ -1342,6 +1409,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/chip@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-6.15.2.tgz#8684980c993bb208eeca6bf625b112be346ac14c" + integrity sha512-G8DBc0EG2bIouZQ4uBWu5iB9QbWgX9WdPuGCnf6ZVIKQcM/NHFc74e2WW2XLrqqbpvm0xhNyopSAZhtZ+9YYzw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/chip@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-7.2.1.tgz#19fca26500e235f39b4c45ebbb65935ac01f997c" @@ -1352,6 +1429,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/cover@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-6.15.2.tgz#a946e696b27f6b2425f67d8f97db83e998dbeca3" + integrity sha512-iyio99zj7X88kmFBKN94MY3KLEUfFfJaDpwrrq683igBaOyd8wqkLnu+rDE4v7sSklsQoeuficJFJoRwA3CDCw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/cover@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-7.2.1.tgz#1ee4a7a1bc23509faeb781d1c8edb1f527442a2f" @@ -1362,6 +1449,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/css@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-6.15.2.tgz#82cdf63d42a00d4b1a9b6233c031e226898a2135" + integrity sha512-fCA0xMCHA4piMC3EcImBuC8/XR8rlBcBFWTITtOQGrE8yHsTfv+Ik8SF+j9sW/jfg7p9mZXt9s1KnT3uOdg2Kw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/css@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-7.2.1.tgz#5f1942246b907d6e0fdadf7f089bbaff080ebed5" @@ -1372,6 +1469,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/divider@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-6.15.2.tgz#009678eef72b1018849958b6d25572b29235ddc5" + integrity sha512-HCmrd5T7mK5YsVZO8fZDkYUBueuo5wdC8BGvY73s5PiwkQI0q1becj6dCjqGhaTlEY7z1RbXO0A/YQ62CkbDOQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/divider@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-7.2.1.tgz#37b219edafaaff2728f1661f28f72114fe23096b" @@ -1382,6 +1489,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/field@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-6.15.2.tgz#45939045db980fe1f6eb95c3c31aa3b59134a3ef" + integrity sha512-2b3gYg9W/gQlHiKoHHCsHbLF9WXjWPVkeRnBx1BF+E04rImbfwL6FPjin4RqtwJkskfW64/mVZW5V+Dn51cA6g== + dependencies: + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/help" "6.15.2" + "@dhis2-ui/label" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/field@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-7.2.1.tgz#e16733cc34f231e525420a05d47685b2b1e61914" @@ -1395,6 +1515,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/file-input@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-6.15.2.tgz#18b170df11e89ed67af416f4d71d185dd5606fde" + integrity sha512-ehDgzscRp1m89My9Fk8EvgFUFuQyi7i1nhcFIGni+70vvmlPe/g4PvYSj8rju4MK3KR/2+7PoR6BLvyFE+H0LQ== + dependencies: + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/label" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/file-input@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-7.2.1.tgz#2cc043d1f3b930954bdc1884a97b28b98144e1f9" @@ -1410,6 +1543,23 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/header-bar@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-6.15.2.tgz#5a0ef910759c955e28a9a6157010c0596e3edaf7" + integrity sha512-tZP54F6WWCTmO6HHbS2BvWKQVfFz1dYqCUir07XoLCFUhRsBcK325C/zASC6+PzrB24n7vLXS5jSdSMXSlX6Ew== + dependencies: + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/divider" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/logo" "6.15.2" + "@dhis2-ui/menu" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/header-bar@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-7.2.1.tgz#fa311a30acb1b2b118a44d2575634f7baebace7d" @@ -1431,6 +1581,16 @@ moment "^2.29.1" prop-types "^15.7.2" +"@dhis2-ui/help@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-6.15.2.tgz#ad009f14fc1721b5b1d736e4b1662208d9453ff8" + integrity sha512-mNsmR0TjhunEgJ8et3r21Bw5Q3WQaB38g6nY9W8Nbjdxt4mBgXxNKsAxCSLYrAdcNdUDzaY/tCBGWqbVkRcdFg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/help@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-7.2.1.tgz#ccb574e3c90a4777fcc06cb2510032daa74eb237" @@ -1441,6 +1601,21 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/input@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-6.15.2.tgz#f58a102ac5b35eca590c42af195c32aae1c6e891" + integrity sha512-Nt2bVJ21RAP5uDGoYbY+5joOjrcyQwBwjx7BOScLseC5Zb7MphRLmFGTxAy1kSIvl+9XFG/QTXS4lQTrXOYrlw== + dependencies: + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/input@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-7.2.1.tgz#1cf1057899a6d65b2f677423c217a5f92930b8da" @@ -1456,6 +1631,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/intersection-detector@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-6.15.2.tgz#cf9db0a7826f7c454864e7ea801f3a9aec456226" + integrity sha512-tP6wqu09cZHg5tvNLJteozk+YQQ4iAt1i4uaJrv4SF+iSir0EJ3hOkNQuxgkqi1qMFzmu4IVtF8OhZS1iCE0Cg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/intersection-detector@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-7.2.1.tgz#2c5ea36d5adafe7914cd3c8cef9536a0c053d2b8" @@ -1466,6 +1651,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/label@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-6.15.2.tgz#c6e703c9b9f129f6f4419baf0ef7ad3c9a974126" + integrity sha512-xNq1jFwj33TJADyYzyN4C6JTQxuZscoY3tUi93Mh2a2Pl8h+tz9FhM+7cM9H4FfTbYZpttBCwsP2v08viYE7Sg== + dependencies: + "@dhis2-ui/required" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + "@dhis2-ui/label@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-7.2.1.tgz#903c0d377c0f1ca1cb0112c25bd4b0d551b8bb7c" @@ -1477,6 +1672,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/layer@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-6.15.2.tgz#46eac6f539351fa63f3fe1e0351556cf68c19594" + integrity sha512-MGf5rMGUT5a8MgFOEgafYAriU0WBQmjpAghcAumOVG+qPUrKzn0Ao7Fo8FsNcrUfW5VsAZUiYrJPXl9HAvv6sw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/layer@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-7.2.1.tgz#566643906bbbfbf064aaf617d519ac099906580e" @@ -1488,6 +1693,17 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/legend@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-6.15.2.tgz#15f1d5ce387654147b4912fc180a17500e6323e4" + integrity sha512-miN75VfTU4SPA0kL1De5BBKot47NssRJRuohYlsIguEe2kqFZaP6mJBSsw+JG73PRX0eiCWjh6JEAEWX4Czuyw== + dependencies: + "@dhis2-ui/required" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/legend@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-7.2.1.tgz#cee54be7715ef50443dc52f1198cdc1fac998eb3" @@ -1499,6 +1715,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/loader@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-6.15.2.tgz#e770f976acce4ff8c91c183f2f5e0b91faa93d0e" + integrity sha512-MZOzbDYYKOky62a/DVsNTmATmoWErgBDDyA+bdab0U2gvImHi9NjrRM3vbTMz6746BaX4ChqSPtvmXHB4zmZFw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/loader@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-7.2.1.tgz#49c7fa1fea3bb53a86c1a2d631a79ffd3d2dcdd5" @@ -1509,6 +1735,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/logo@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-6.15.2.tgz#6750613acbcc71f9d2d3ce55f00994c41732deec" + integrity sha512-2sBAh1QOO3X95aGVocKn3HrrrynB66+iUV7dbmOMJPem8QiDLD+Fsa9y20DdGt0a4+I83SlFp1ao8mU6TGwDvg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/logo@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-7.2.1.tgz#d9d19c0b8eac073a374b6ae7e5812b7260aab1d7" @@ -1519,6 +1755,21 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/menu@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-6.15.2.tgz#7cf5dd281b2e61240d58791dc840fcaff13f842d" + integrity sha512-bXzPz2PK5JGOIEV619gIaBHZkoo3MCGCWys/r3Vzut2Z/qO69F0gjc5kH6DXad0SKO6UIsR+cWfRehmcAKNewQ== + dependencies: + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/divider" "6.15.2" + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/menu@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-7.2.1.tgz#39d314ef4fc251ffc68dc7c6d963d9bd6dab4ecc" @@ -1535,6 +1786,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/modal@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-6.15.2.tgz#4d92831584a1ec8f6dbd7756a3042a2aa5ffd099" + integrity sha512-2A/k3VEqgYguOe0bJyZzy95OfOUSEChkuvNx7cQ1dsSlyq8/Il7/w5CLsgBwSI+vNQu4gBqqMFQMcs0NQsDMRA== + dependencies: + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/center" "6.15.2" + "@dhis2-ui/layer" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/modal@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-7.2.1.tgz#7a656235a3a976bac962fb89fa3cce1876a264ee" @@ -1549,6 +1813,17 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/node@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-6.15.2.tgz#72ba545771af69dbfb6653d1aa8b4a2f606ba21d" + integrity sha512-IKA28wWMNRzoU8LycY4z4b/yA0ljxEvhIcZUKq+em164dKKIMdIIfxN9WbN9+TkpJKJpmCJ+E4yVBDb8amrJUw== + dependencies: + "@dhis2-ui/loader" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/node@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-7.2.1.tgz#2f408b26804b11c10d07edafa9a615fcaa388e48" @@ -1560,6 +1835,17 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/notice-box@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-6.15.2.tgz#eb99e3a8af770bfad349d929f0fd0e0877c5d714" + integrity sha512-Vj4HyD+zzseza+SdboOneiq4gNsI3JFW5QygWoEiHk03qLweZuFkTczfPRokE46ns0TWEtH3zIeuCnQyFJataA== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/notice-box@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-7.2.1.tgz#80074caa3f04847ce2b492e93d9ad11fc49e5b80" @@ -1571,6 +1857,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/organisation-unit-tree@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-6.15.2.tgz#90560588fbc3e92a524d2d2fbf8763f806fe5f1e" + integrity sha512-ibnOCWhZzw/rsdX8JNdqYd7XNYrf5ek4EcbeMHsD2ai7NCeZgaErbQCPdavEaWdvEOLNvXB1HAHcSV/THS9qsg== + dependencies: + "@dhis2-ui/checkbox" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2-ui/node" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/organisation-unit-tree@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-7.2.1.tgz#94f7097f5bb3fe9af74f324537abb36e31166a89" @@ -1584,6 +1883,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/pagination@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-6.15.2.tgz#f81dc3310e61d428a7fd8fd934551cb5da79f5d0" + integrity sha512-A9ZHWPfX0f4QRrwpsMfvnuM3gZktdW8fjwyW1yJj46FeP5iKg3U3ztV4T+2NjRxhjJBT/mnYWJ0viWgH+PsEEQ== + dependencies: + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/select" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/pagination@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-7.2.1.tgz#c2e0e5105f04a2fed491dcafb97a2ce9d62ce405" @@ -1597,6 +1909,18 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/popover@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-6.15.2.tgz#8c1a11f4a755d61596900139baf316673c7a8578" + integrity sha512-xIuYqVSoc6BrSiS11tTen4r92XJYgFhc4c97gD0UKkTKQS+AjonIx0MJRhjaTaCFrFGIcyq+Y1BGtV4mW6xhHw== + dependencies: + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/popover@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-7.2.1.tgz#ef26c45bc927f130eb4928daed3451f269572860" @@ -1609,6 +1933,19 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/popper@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-6.15.2.tgz#1c62ba43c1376dcfb62df480782ad649b35cf43d" + integrity sha512-QZ06ACjy4NV04zp+6j9rd5SapDuBBSnu8OliQJ24bWPIcWIYC86N4HBKuRUiwfflT/j1zNfNWvM9IvoNrYscQg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@popperjs/core" "^2.6.0" + classnames "^2.3.1" + prop-types "^15.7.2" + react-popper "^2.2.5" + resize-observer-polyfill "^1.5.1" + "@dhis2-ui/popper@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-7.2.1.tgz#09ff9aaec832ee2e484c72971da755887f18879a" @@ -1630,6 +1967,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/radio@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-6.15.2.tgz#eb2506f991f4053c074bc14e5b1fb5501d5ff340" + integrity sha512-zONnVmxehxX7UVdv59XYEQxXGKRg33hDHRKZTwdECuKvAguFM4XXcaRNqnQr1hBdTiOQocCPd+TUqV4xyukWcA== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/radio@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-7.2.1.tgz#4f1935b65ebe1dfcda66b40ff22fd2dde73a0fef" @@ -1640,6 +1987,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/required@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-6.15.2.tgz#3cdff92ca19d8e053327e28bedc1f96f63caf102" + integrity sha512-ydZVBwm0gujka9bGmBb31SEqRAoLNcNHVBPjxv0S952CQsWaebOEY+baQS/3lIjb3gvEtWcIxc5UXO2+0FcuSQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/required@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-7.2.1.tgz#ef7034cc9068a52077de7f167ea5f19a5918cd09" @@ -1650,6 +2007,27 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/select@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-6.15.2.tgz#abe0d30483713bd3c592540f000a50a52a0799b2" + integrity sha512-VuRRXNIyBnhyeevLnrc6j29qFjD9MH0YdS0rmmjqddq0reAVT0gNyYQSWFOSOkaFxiKKYI7tRNE5GR0kHmEpdA== + dependencies: + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/checkbox" "6.15.2" + "@dhis2-ui/chip" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/select@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-7.2.1.tgz#336374348ad42ff1a78057aa8e34def2550be45c" @@ -1695,6 +2073,18 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/switch@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-6.15.2.tgz#f06406b6882c22d660d425c15111ccfe0a971298" + integrity sha512-SxEmlvWIFZnd97PZkVKJyvrq+ftC+OAlF9Xa22mptAUYJr6XwykkkC9wd370fwiYHXCRVbqB+id963xkz1k4ZQ== + dependencies: + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/required" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/switch@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-7.2.1.tgz#ee513fcf78237b945e3de2a762e4dedfdf45092b" @@ -1707,6 +2097,17 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/tab@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-6.15.2.tgz#f05a6ba4cfe06ee731887775d8ae2cdd4f3b6b67" + integrity sha512-/gGYcOQJYzrU/Lr3s7VrjA7va/unAVSDFTMETlgt9V3erQQ4t+OBk6p3JpLfuvrsdgZkXIreYbROicYmkqODAg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/tab@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-7.2.1.tgz#79bdcdc04f4c718ce14728675980b43c0e64f290" @@ -1718,6 +2119,17 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/table@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-6.15.2.tgz#a7b9578a0bbe7ebe52aa4a5d152d9b0668012fda" + integrity sha512-Fib8YfGSwMT+08dt4QtcrtoHKbTR/0i+HM4AEloJWUuBjF1E93aeC6yH4oDTQnxKH2vR6rvyQWgLQ54X87H3OA== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/table@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-7.2.1.tgz#764ad1aff730d1f1ca603ee5f4028f5b5478dcf2" @@ -1729,6 +2141,16 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/tag@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-6.15.2.tgz#b7943c7d6202af179ca978608822084bfef9661c" + integrity sha512-F3u70BS37+y5fU8kM5hSNdEDH8DAZ4HZASXPDxIqpSzOYFmHwd9h/K5k8Dx9E28RqKh1feY61mmfbom9/7RYzw== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/tag@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-7.2.1.tgz#93ad67cd4f0dd4231d4ae5be5db5180aabf628a3" @@ -1739,6 +2161,20 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/text-area@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-6.15.2.tgz#e7b575e053aeb4ff443140942886184aebe1ebf0" + integrity sha512-0BkNkc0dtFMfQalrPBpcj8SqFh275ZgkZjcnmjc1OSiGaDn22oYtQqL1/ER3TZYJRGPMGaXVfBjZOhkr939Zuw== + dependencies: + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/text-area@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-7.2.1.tgz#d562c44db5774783465ed18c04e6f53b48052df6" @@ -1753,6 +2189,18 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/tooltip@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-6.15.2.tgz#c96b2a0623c6c9004a6cc544f899f8e5b4e0ad3e" + integrity sha512-gdpuMS/rOav/c7KHGGDz0VxQbxeVHIK/j9V3sl2H7s2uj+0FWMMA1RiPqEofFIiKsV+RRwrCK3faus7jai6HXw== + dependencies: + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/tooltip@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-7.2.1.tgz#72a221a0e47d96486f9af4554f441282b7d03cbf" @@ -1765,6 +2213,21 @@ classnames "^2.3.1" prop-types "^15.7.2" +"@dhis2-ui/transfer@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-6.15.2.tgz#f0a99ac7840dae924ee824da6302a3f1aa5d8f14" + integrity sha512-DtY273nqsb25EKBcSrvm90o7vLu1EOiaoZI3ZaLuFVBOqCNpLm/fDJZqQngy6PbkWna57dyc78JYa/gAXyoUpg== + dependencies: + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/intersection-detector" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + "@dhis2-ui/transfer@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-7.2.1.tgz#0968dc66dc03e9c183400d95173130f7e437fbf2" @@ -1860,11 +2323,26 @@ lodash "^4.17.10" material-ui "^0.20.0" +"@dhis2/prop-types@^1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-1.6.4.tgz#ec4d256c9440d4d00071524422a727c61ddaa6f6" + integrity sha512-qkVj8OuyjDmSxzYDlCWZllvC9hIbrIImMp79/U5CVsIRbjUF0zA/tfbv4rWnsWALmwEHOQFbzl5GnO5D8RNneA== + dependencies: + prop-types "^15" + "@dhis2/prop-types@^3.0.0-beta.1": version "3.0.0" resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-3.0.0.tgz#a17dd1b8475ab7e4e66c736624ac83fd372876af" integrity sha512-Crqimyk6XTJWWqmVZ+Asnle3OgOXsnUYVM2ozC+Z6Ad0O0M3I4lE2QS6V20nGEmUDl3K1Vri9lzmL8vAMpUBsw== +"@dhis2/ui-constants@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-6.15.2.tgz#3df26e9fa5683b87b85e75cc5b9c930ec2115b29" + integrity sha512-Ayprow4LPAbfyHcZ92KLSlSHgo7zRTa9aU+ZV/Ov3fjI+a9I7fJwgjvRXMBzZkS6NvuWFrHmOXkUMDreN7ZxAg== + dependencies: + "@dhis2/prop-types" "^1.6.4" + prop-types "^15.7.2" + "@dhis2/ui-constants@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-7.2.1.tgz#5b0c39a173508043345ebb6bb41a60dc15fdb01f" @@ -1872,6 +2350,64 @@ dependencies: prop-types "^15.7.2" +"@dhis2/ui-core@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui-core/-/ui-core-6.15.2.tgz#bafd358eae994de0c532d08951663ecd2331f736" + integrity sha512-3Ucpv9a2qcN4LYQywayW0Qtn2JVsNWXOivN5DjUHSlp62DGSwj9T1ZrThV3HznXNG4DqFSjD7pGetV1wDyOTvw== + dependencies: + "@dhis2-ui/alert" "6.15.2" + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/center" "6.15.2" + "@dhis2-ui/checkbox" "6.15.2" + "@dhis2-ui/chip" "6.15.2" + "@dhis2-ui/cover" "6.15.2" + "@dhis2-ui/css" "6.15.2" + "@dhis2-ui/divider" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/file-input" "6.15.2" + "@dhis2-ui/help" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/intersection-detector" "6.15.2" + "@dhis2-ui/label" "6.15.2" + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/legend" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2-ui/logo" "6.15.2" + "@dhis2-ui/menu" "6.15.2" + "@dhis2-ui/modal" "6.15.2" + "@dhis2-ui/node" "6.15.2" + "@dhis2-ui/notice-box" "6.15.2" + "@dhis2-ui/popover" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2-ui/radio" "6.15.2" + "@dhis2-ui/required" "6.15.2" + "@dhis2-ui/select" "6.15.2" + "@dhis2-ui/switch" "6.15.2" + "@dhis2-ui/tab" "6.15.2" + "@dhis2-ui/table" "6.15.2" + "@dhis2-ui/tag" "6.15.2" + "@dhis2-ui/text-area" "6.15.2" + "@dhis2-ui/tooltip" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-constants" "6.15.2" + classnames "^2.3.1" + prop-types "^15.7.2" + +"@dhis2/ui-forms@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-6.15.2.tgz#cf3a0cfaa5b9f25c0ec471dddbc6ad068a6c5ce4" + integrity sha512-ob9cTmvcGUb0oO9TCuBdrH/oHgcGJ2LMAC04KYNbIok7LIbheQxnjpMhES5IXEFvMjr46IMw2X3xcspoyzLv3Q== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-core" "6.15.2" + "@dhis2/ui-widgets" "6.15.2" + classnames "^2.3.1" + final-form "^4.20.2" + prop-types "^15.7.2" + react-final-form "^6.5.3" + "@dhis2/ui-forms@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-7.2.1.tgz#cfb5b9f5da66214871af66fd1f11bee9b52e7865" @@ -1892,11 +2428,87 @@ prop-types "^15.7.2" react-final-form "^6.5.3" +"@dhis2/ui-icons@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-6.15.2.tgz#acc01f5e22afda910b6a0f4027702a87207a8725" + integrity sha512-jVGhFyC693UqU2M7hxfQc5d7laaDOnttLDJejy2iFcl3w9CoSM1LBBernX0r9r8OGeOrxZvThAJ+YoGJO1vlHQ== + dependencies: + "@dhis2/prop-types" "^1.6.4" + "@dhis2/ui-icons@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-7.2.1.tgz#e29a05c9f210f0be982523a70b024fca58029cdd" integrity sha512-3G+HPtPQnrds7Tf7m96lqdlRmCeoMEqvql2HOThjhbt1iCxrVLBVSAD0nNTl+rgntl3tUxXorDaCVTiWzp4+Qg== +"@dhis2/ui-widgets@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui-widgets/-/ui-widgets-6.15.2.tgz#64de32ed38cd601e100c2fb96c04feee9e673204" + integrity sha512-OKT1nuh7DdArhm9T+EXm5w8VdCCgeGiJ6GfMYsMV6YsSInbQTim4qZVsQ4zJWreQokjwTTwh/Y+1NXaL+GA8sA== + dependencies: + "@dhis2-ui/checkbox" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/file-input" "6.15.2" + "@dhis2-ui/header-bar" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/organisation-unit-tree" "6.15.2" + "@dhis2-ui/pagination" "6.15.2" + "@dhis2-ui/select" "6.15.2" + "@dhis2-ui/switch" "6.15.2" + "@dhis2-ui/table" "6.15.2" + "@dhis2-ui/text-area" "6.15.2" + "@dhis2-ui/transfer" "6.15.2" + "@dhis2/prop-types" "^1.6.4" + classnames "^2.3.1" + +"@dhis2/ui@6.15.2": + version "6.15.2" + resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-6.15.2.tgz#cdc86a7bf55bc0fc6725a94fcd2c7cd4642408b0" + integrity sha512-huVjhujg3FXeJ+0B2qrTtfColePA2ipi43Q+TpV0VUAD/yw1NtvLapeEl2LMGVg4jnYdhQyk9mNCdl/K9EOshQ== + dependencies: + "@dhis2-ui/alert" "6.15.2" + "@dhis2-ui/box" "6.15.2" + "@dhis2-ui/button" "6.15.2" + "@dhis2-ui/card" "6.15.2" + "@dhis2-ui/center" "6.15.2" + "@dhis2-ui/checkbox" "6.15.2" + "@dhis2-ui/chip" "6.15.2" + "@dhis2-ui/cover" "6.15.2" + "@dhis2-ui/css" "6.15.2" + "@dhis2-ui/divider" "6.15.2" + "@dhis2-ui/field" "6.15.2" + "@dhis2-ui/file-input" "6.15.2" + "@dhis2-ui/header-bar" "6.15.2" + "@dhis2-ui/help" "6.15.2" + "@dhis2-ui/input" "6.15.2" + "@dhis2-ui/intersection-detector" "6.15.2" + "@dhis2-ui/label" "6.15.2" + "@dhis2-ui/layer" "6.15.2" + "@dhis2-ui/legend" "6.15.2" + "@dhis2-ui/loader" "6.15.2" + "@dhis2-ui/logo" "6.15.2" + "@dhis2-ui/menu" "6.15.2" + "@dhis2-ui/modal" "6.15.2" + "@dhis2-ui/node" "6.15.2" + "@dhis2-ui/notice-box" "6.15.2" + "@dhis2-ui/organisation-unit-tree" "6.15.2" + "@dhis2-ui/pagination" "6.15.2" + "@dhis2-ui/popover" "6.15.2" + "@dhis2-ui/popper" "6.15.2" + "@dhis2-ui/radio" "6.15.2" + "@dhis2-ui/required" "6.15.2" + "@dhis2-ui/select" "6.15.2" + "@dhis2-ui/switch" "6.15.2" + "@dhis2-ui/tab" "6.15.2" + "@dhis2-ui/table" "6.15.2" + "@dhis2-ui/tag" "6.15.2" + "@dhis2-ui/text-area" "6.15.2" + "@dhis2-ui/tooltip" "6.15.2" + "@dhis2-ui/transfer" "6.15.2" + "@dhis2/ui-constants" "6.15.2" + "@dhis2/ui-forms" "6.15.2" + "@dhis2/ui-icons" "6.15.2" + prop-types "^15.7.2" + "@dhis2/ui@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-7.2.1.tgz#50ac8cbc276174cf37062bbaccf2cd842a95625e" @@ -2019,15 +2631,16 @@ react "^16.12.0" yargs "^14.0.0" -"@eyeseetea/d2-ui-components@2.6.7": - version "2.6.7" - resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.7.tgz#f6d2b9b39f40d128b1099b5ad2d4817cfeca2408" - integrity sha512-SAVK7l028ORB7l2b4jmP4awbPujwKhlXz3z76UG1CXwLMUmHH0GJ4TC5G7X8hootXBS+ag0Ilv4nbNfZZK66/w== +"@eyeseetea/d2-ui-components@2.6.9-beta.5": + version "2.6.9-beta.5" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.9-beta.5.tgz#540544cf1748f6084ae63fea0a5633498f57df79" + integrity sha512-u+iVmDdWajPFijBsOpx6pg6mkPXsl/NSEKl5PZQp9WHQYMxSJIfOckg3jc0fXOf9ziUjD2F5jFTNIcitS8M6FA== dependencies: "@date-io/core" "1.3.6" "@date-io/moment" "1.0.2" "@dhis2/d2-i18n" "1.0.6" "@dhis2/d2-ui-core" "6.3.0" + "@dhis2/ui" "6.15.2" "@material-ui/pickers" "3.2.10" classnames "2.2.6" downshift "5.4.2" @@ -2576,7 +3189,7 @@ schema-utils "^2.6.5" source-map "^0.7.3" -"@popperjs/core@^2.10.1": +"@popperjs/core@^2.10.1", "@popperjs/core@^2.6.0": version "2.10.2" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590" integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== @@ -11781,7 +12394,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.7.2, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== From 05b2696b20a5a1fae86b18dc16e036605de076ed Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 12:47:10 +0100 Subject: [PATCH 092/192] Remove old import Signed-off-by: Alexis Rico --- src/webapp/components/user-list-table/UserListTable.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index c67eef9..6cb1cf8 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -9,7 +9,6 @@ import { TablePagination, TableSorting, useObjectsTable, - useSnackbar, } from "@eyeseetea/d2-ui-components"; import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; @@ -216,9 +215,7 @@ export const UserListTable: React.FC = props => { {dialogProps && } - - {props.children} - + {props.children} ); }; From 11b882b292b34079a806e5791a52ab0b6334e84a Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Fri, 26 Nov 2021 12:58:40 +0100 Subject: [PATCH 093/192] Clean-up dialogs Signed-off-by: Alexis Rico --- src/legacy/components/MultipleFilter.component.js | 6 ++---- src/legacy/components/OrgUnitsSelectorFilter.js | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/legacy/components/MultipleFilter.component.js b/src/legacy/components/MultipleFilter.component.js index ad11322..8b6f384 100644 --- a/src/legacy/components/MultipleFilter.component.js +++ b/src/legacy/components/MultipleFilter.component.js @@ -84,10 +84,8 @@ class MultipleFilter extends React.Component { title={title} maxWidth={"lg"} fullWidth={true} - onCancel={this.closeDialog} - cancelText={this.getTranslation("cancel")} - onSave={this.applyAndClose} - saveText={this.getTranslation("apply")} + onCancel={this.applyAndClose} + cancelText={this.getTranslation("close")} > ou.path)} onChange={this.onChange} + fullWidth={true} + withElevation={false} controls={{ filterByLevel: true, filterByGroup: true, From 4c17cb92de55f288f85dcb8bc3a93c158339cd80 Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Sun, 28 Nov 2021 16:57:05 +0100 Subject: [PATCH 094/192] adding orgunitselector to bulk form --- i18n/en.pot | 16 ++- i18n/es.po | 14 ++- src/CompositionRoot.ts | 1 - src/data/models/UserModel.ts | 10 +- .../repositories/MetadataD2ApiRepository.ts | 2 +- src/data/repositories/UserD2ApiRepository.ts | 98 +++++++++++++++---- src/domain/entities/User.ts | 12 +-- src/domain/usecases/ListMetadataUseCase.ts | 2 +- src/legacy/components/OrgUnitForm.js | 2 +- .../components/form/fields/TransferFF.tsx | 2 +- src/webapp/components/user-form/UserForm.tsx | 4 +- .../user-form/components/OrgUnitFF.tsx | 53 ++++++++++ .../user-form/components/OrgUnitLevelsFF.tsx | 28 +++--- .../user-form/components/OutputFF.tsx | 3 +- src/webapp/pages/Router.tsx | 2 + .../pages/user-bulk-edit/UserBulkEditPage.tsx | 12 ++- 16 files changed, 198 insertions(+), 63 deletions(-) create mode 100644 src/webapp/components/user-form/components/OrgUnitFF.tsx diff --git a/i18n/en.pot b/i18n/en.pot index b1a70f1..1a084a0 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-15T11:19:02.027Z\n" -"PO-Revision-Date: 2021-11-15T11:19:02.027Z\n" +"POT-Creation-Date: 2021-11-24T11:38:00.676Z\n" +"PO-Revision-Date: 2021-11-24T11:38:00.676Z\n" msgid "Enable users" msgstr "" @@ -113,6 +113,18 @@ msgstr "" msgid "Disabled" msgstr "" +msgid "User Roles" +msgstr "" + +msgid "User Groups" +msgstr "" + +msgid "Organisation Units" +msgstr "" + +msgid "Data View Organisation Units" +msgstr "" + msgid "Output data element" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 7719faa..f4ec461 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-15T11:19:02.027Z\n" +"POT-Creation-Date: 2021-11-24T11:38:00.676Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -113,6 +113,18 @@ msgstr "" msgid "Disabled" msgstr "" +msgid "User Roles" +msgstr "" + +msgid "User Groups" +msgstr "" + +msgid "Organisation Units" +msgstr "" + +msgid "Data View Organisation Units" +msgstr "" + msgid "Output data element" msgstr "" diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 552b7e4..4ae4a45 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -14,7 +14,6 @@ export function getCompositionRoot(instance: Instance) { const userRepository = new UserD2ApiRepository(instance); const metadataRepository = new MetadataD2ApiRepository(instance); - return { instance: getExecute({ getVersion: new GetInstanceVersionUseCase(instanceRepository), diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index fbb0895..d77bb73 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -1,4 +1,4 @@ -import { User, UserRole, AccessPermissions } from "../../domain/entities/User"; +import { User, AccessPermissions } from "../../domain/entities/User"; import { Codec, Schema } from "../../utils/codec"; import { NamedRefModel } from "./DHIS2Model"; @@ -11,13 +11,6 @@ export const AccessPermissionsModel: Codec = Schema.object({ manage: Schema.optional(Schema.boolean), }); -/*export const UserRolesModel: Codec = Schema.extend( - NamedRefModel, - Schema.object({ - authorities: Schema.array(Schema.string), - }) -);*/ - export const UserModel: Codec = Schema.object({ id: Schema.nonEmptyString, name: Schema.nonEmptyString, @@ -34,4 +27,5 @@ export const UserModel: Codec = Schema.object({ lastLogin: Schema.nonEmptyString, disabled: Schema.boolean, access: AccessPermissionsModel, + authorities: Schema.array(Schema.nonEmptyString) }); diff --git a/src/data/repositories/MetadataD2ApiRepository.ts b/src/data/repositories/MetadataD2ApiRepository.ts index 2bc82e5..865897c 100644 --- a/src/data/repositories/MetadataD2ApiRepository.ts +++ b/src/data/repositories/MetadataD2ApiRepository.ts @@ -25,7 +25,7 @@ export class MetadataD2ApiRepository implements MetadataRepository { this.api.models[type].get({ filter: options.filter ? { identifiable: { token: options.filter } } : undefined, fields: { ...fieldOptions, id: true, name: true, code: true }, - paging: false + paging: false, //pageSize: options.pageSize ?? 25, //page: options.page ?? 1, }) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index e17a114..b535589 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,4 +1,4 @@ -import { D2Api, D2UserSchema, SelectedPick, MetadataResponse } from "@eyeseetea/d2-api/2.34"; +import { D2Api, D2UserSchema, SelectedPick, MetadataResponse, PostOptions, MetadataPayloadBase, D2ApiDefinition } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -11,6 +11,10 @@ import { Instance } from "../entities/Instance"; import { UserModel } from "../models/UserModel"; import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; +interface MetadataPost { + data:Partial>; + options: Partial +} export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -73,10 +77,15 @@ export class UserD2ApiRepository implements UserRepository { ); return predictorData$.map(({ objects }) => objects); } + public save(usersToSave: User[]): FutureData { + console.log(usersToSave) const validations = usersToSave.map(user => UserModel.decode(user)); const users = _.compact(validations.map(either => either.toMaybe().extract())); + console.log(users) const errors = _.compact(validations.map(either => either.leftOrDefault(""))); + console.log(errors) + if (errors.length > 0) { return Future.error(errors.join("\n")); } @@ -84,28 +93,78 @@ export class UserD2ApiRepository implements UserRepository { const listOptions = { filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, }; - + return this.getFullUsers(listOptions).flatMap(existingUsers => { - const usersToSend = existingUsers.map((existingUser, index) => ({ - ...existingUser, - organisationUnits: usersToSave[index]?.organisationUnits, - dataViewOrganisationUnits: usersToSave[index]?.dataViewOrganisationUnits, - userGroups: usersToSave[index]?.userGroups, - email: usersToSave[index]?.email, - firstName: usersToSave[index]?.firstName, - surname: usersToSave[index]?.surname, - userCredentials: { - ...existingUser.userCredentials, - disabled: usersToSave[index]?.disabled, - userRoles: usersToSave[index]?.userRoles, - username: usersToSave[index]?.username, - }, - })); - return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data); + console.log(existingUsers) + return this.getGroupsToSave(users, existingUsers).flatMap(userGroups => { + const usersToSend = existingUsers.map((existingUser, index) => ({ + ...existingUser, + organisationUnits: usersToSave[index]?.organisationUnits, + dataViewOrganisationUnits: usersToSave[index]?.dataViewOrganisationUnits, + email: usersToSave[index]?.email, + firstName: usersToSave[index]?.firstName, + surname: usersToSave[index]?.surname, + userCredentials: { + ...existingUser.userCredentials, + disabled: usersToSave[index]?.disabled, + userRoles: usersToSave[index]?.userRoles, + username: usersToSave[index]?.username, + }, + })); + return apiToFuture(this.api.metadata.post({ users: usersToSend, userGroups })).map(data => data); + }) + + /*console.log(usersToSend) + //importStrategy=UPDATE&mergeMode=REPLACE + const payload: MetadataPost = { + data: { users: usersToSend }, + options: { importStrategy: "UPDATE", mergeMode: "REPLACE"} + } + return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data);*/ }); } + private getGroupsToSave(users: User[], existing: User[]) { + const userIds = users.map(({ id }) => id); + const groupDictionary = _(users) + .flatMap(({ id, userGroups }) => userGroups.map(group => ({ id, group }))) + .groupBy(({ group }) => group.id) + .mapValues(items => items.map(({ id }) => id)) + .value(); + + const existingGroupRefs = _.flatMap(existing, ({ userGroups }) => userGroups); + const newGroupRefs = _.flatMap(users, ({ userGroups }) => userGroups); + const allGroupRefs = _.concat(existingGroupRefs, newGroupRefs); + + const groupInfo$ = apiToFuture( + this.api.metadata.get({ + userGroups: { + fields: { $owner: true }, + filter: { id: { in: _.uniq(allGroupRefs.map(oug => oug.id)) } }, // Review 414 + }, + }) + ); + + return groupInfo$.map(({ userGroups }) => + userGroups + .map(group => { + const cleanList = group.users.filter(({ id }) => !userIds.includes(id)); + const newItems = groupDictionary[group.id] ?? []; + const users = [...cleanList, ...newItems.map(id => ({ id }))]; + + return { ...group, users }; + }) + .filter(group => { + const newIds = group.users.map(({ id }) => id); + const oldIds = + userGroups.find(({ id }) => id === group.id)?.users.map(({ id }) => id) ?? []; + + return !_.isEqual(_.sortBy(oldIds), _.sortBy(newIds)); + }) + ); + } private mapUser(user: D2ApiUser): User { + const authorities = _(user.userCredentials.userRoles.map(userRole => userRole.authorities)).flatten().uniq().value() return { id: user.id, name: user.displayName, @@ -116,12 +175,13 @@ export class UserD2ApiRepository implements UserRepository { created: user.created, userGroups: user.userGroups, username: user.userCredentials.username, - userRoles: user.userCredentials.userRoles, + userRoles: user.userCredentials.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name})), lastLogin: user.userCredentials.lastLogin, disabled: user.userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, access: user.access, + authorities }; } } diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 904dbb7..e70c985 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -17,9 +17,6 @@ export interface User { lastLogin: string; disabled: boolean; access: AccessPermissions; -} - -export interface UserRole extends NamedRef { authorities: string[]; } @@ -32,11 +29,10 @@ export interface AccessPermissions { manage?: boolean; } -/*export const isSuperAdmin = (user: User): boolean => { - return _.some(user.userRoles, ({ authorities }) => authorities.includes("ALL")); +export const isSuperAdmin = (user: User): boolean => { + return _.some(user.authorities, (authorities) => authorities.includes("ALL")); }; -*/ + export const hasReplicateAuthority = (user: User): boolean => { - return true; - //return _.some(user.userRoles, ({ authorities }) => authorities.includes("F_REPLICATE_USER")); + return _.some(user.authorities, (authorities) => authorities.includes("F_REPLICATE_USER")); }; diff --git a/src/domain/usecases/ListMetadataUseCase.ts b/src/domain/usecases/ListMetadataUseCase.ts index f1de0c9..90a0dcf 100644 --- a/src/domain/usecases/ListMetadataUseCase.ts +++ b/src/domain/usecases/ListMetadataUseCase.ts @@ -15,7 +15,7 @@ export class ListMetadataUseCase implements UseCase { //const { paging = true } = options; return this.metadataRepository.list(type, options, fields); - /* console.log(options) + /* console.log(options) if (paging) { return this.metadataRepository.list(type, options, fields); } else { diff --git a/src/legacy/components/OrgUnitForm.js b/src/legacy/components/OrgUnitForm.js index 860f39f..f45d6c4 100644 --- a/src/legacy/components/OrgUnitForm.js +++ b/src/legacy/components/OrgUnitForm.js @@ -186,7 +186,7 @@ class OrgUnitForm extends React.Component { onUpdateSelection={this.onChange} />
    - +
    diff --git a/src/webapp/components/form/fields/TransferFF.tsx b/src/webapp/components/form/fields/TransferFF.tsx index 4cf0e56..0439514 100644 --- a/src/webapp/components/form/fields/TransferFF.tsx +++ b/src/webapp/components/form/fields/TransferFF.tsx @@ -29,7 +29,7 @@ export const TransferFF = ({ const onChange = useCallback( ({ selected }: { selected: string[] }) => { - input.onChange(selected.map(id => ({ id, name: options.find(item => item.value === id)?.label ?? "", }))); + input.onChange(selected.map(id => ({ id, name: options.find(item => item.value === id)?.label ?? "" }))); }, [input, options] ); diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 2258c6f..8868018 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -55,8 +55,8 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto case "output": return ; */ -// return ; -//model type for dataViewOrganisationUnits ? + // return ; + //model type for dataViewOrganisationUnits ? switch (field) { case "id": case "email": diff --git a/src/webapp/components/user-form/components/OrgUnitFF.tsx b/src/webapp/components/user-form/components/OrgUnitFF.tsx new file mode 100644 index 0000000..a762889 --- /dev/null +++ b/src/webapp/components/user-form/components/OrgUnitFF.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import { TransferOption } from "@dhis2/ui"; +import { OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; +import { NamedRef } from "../../../../domain/entities/Ref"; +import { useAppContext } from "../../../contexts/app-context"; +import { useFuture } from "../../../hooks/useFuture"; +import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; +import { D2ModelSchemas } from "@eyeseetea/d2-api/2.34"; + +export interface OrgUnitFFProps extends TransferFFProps { + modelType: keyof D2ModelSchemas; +} +export const OrgUnitLevelsFF: React.FC> = props => { + const { compositionRoot, api } = useAppContext(); + //buildTransferOptions(objects) + const { data: orgUnitLevels = [] } = useFuture( + () => compositionRoot.metadata.list(props.modelType).map(({ objects }) => buildTransferOptions(objects)), + [] + ); + console.log(orgUnitLevels); + + return ( + + + + + + ); +}; +interface OptionType extends NamedRef { + authorities?: string[]; +} +const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + console.log(options); + return options.map(({ id, name }) => ({ value: id, label: name })); +}; diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx index a622a27..9203604 100644 --- a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx +++ b/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx @@ -6,30 +6,28 @@ import { useFuture } from "../../../hooks/useFuture"; import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; import { D2ModelSchemas } from "@eyeseetea/d2-api/2.34"; -export interface OrgUnitLevelsFFProps extends TransferFFProps{ +export interface OrgUnitLevelsFFProps extends TransferFFProps { modelType: keyof D2ModelSchemas; } export const OrgUnitLevelsFF: React.FC> = props => { const { compositionRoot } = useAppContext(); //buildTransferOptions(objects) const { data: orgUnitLevels = [] } = useFuture( - () => - compositionRoot.metadata.list(props.modelType).map(({objects}) => buildTransferOptions(objects)), + () => compositionRoot.metadata.list(props.modelType).map(({ objects }) => buildTransferOptions(objects)), [] ); - console.log(orgUnitLevels) + console.log(orgUnitLevels); return ( - - + ); }; @@ -37,6 +35,6 @@ interface OptionType extends NamedRef { authorities?: string[]; } const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { - console.log(options) - return options.map(({ id, name}) => ({ value: id, label: name })); + console.log(options); + return options.map(({ id, name }) => ({ value: id, label: name })); }; diff --git a/src/webapp/components/user-form/components/OutputFF.tsx b/src/webapp/components/user-form/components/OutputFF.tsx index a81de09..f54299e 100644 --- a/src/webapp/components/user-form/components/OutputFF.tsx +++ b/src/webapp/components/user-form/components/OutputFF.tsx @@ -40,7 +40,7 @@ export const OutputFF: React.FC = ({ input, optionCo [dataElements, input, optionComboInput] ); - //categoryOptions: [] + //categoryOptions: [] const dataElementItems = _.unionBy( dataElements, [{ value: input.value.id, label: i18n.t("Invalid option") }], @@ -93,4 +93,3 @@ const buildOptions = ( const Row = styled.div` margin: 20px 0; `; - diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 3a704ff..76a8e59 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -3,8 +3,10 @@ import { HashRouter, Route, Switch, Redirect } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; import { UserBulkEditPage, ActionType } from "./user-bulk-edit/UserBulkEditPage"; +import { useAppContext } from "../contexts/app-context"; export const Router: React.FC = React.memo(() => { + const { api } = useAppContext(); return ( diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 97c4cf6..e5b332b 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -147,7 +147,17 @@ export const UserBulkEditPage = () => { ); }; //"userRoles", "userGroups", "organisationUnits", "dataViewOrganisationUnits" -const baseUserColumns = ["id", "firstName", "surname", "email", "disabled", "userRoles", "userGroups", "organisationUnits", "organisationUnits"]; +const baseUserColumns = [ + "id", + "firstName", + "surname", + "email", + "disabled", + "userRoles", + "userGroups", + "organisationUnits", + "organisationUnits", +]; const MaxHeight = styled.div` height: 95%; From 56ff52f8d7df8296196f88967cd2fad1f0a21a8e Mon Sep 17 00:00:00 2001 From: Jocelyn Dunkley Date: Sun, 28 Nov 2021 22:54:02 +0100 Subject: [PATCH 095/192] add user row, cleaned up code --- i18n/en.pot | 10 +- src/data/models/UserModel.ts | 6 +- src/data/repositories/UserD2ApiRepository.ts | 62 +++++------- src/domain/entities/User.ts | 31 ++++-- src/domain/usecases/ListMetadataUseCase.ts | 11 --- src/legacy/List/List.component.js | 2 +- src/types/d2-ui.d.ts | 51 ---------- .../components/form/fields/NumberInputFF.tsx | 17 ---- .../import-summary/ImportSummary.tsx | 14 ++- src/webapp/components/user-form/UserForm.tsx | 93 ++++++++++-------- .../user-form/components/OrgUnitFF.tsx | 53 ----------- .../user-form/components/OutputFF.tsx | 95 ------------------- ...rgUnitLevelsFF.tsx => UserRoleGroupFF.tsx} | 15 +-- src/webapp/components/user-form/utils.ts | 48 +++++----- .../user-list-table/UserListTable.tsx | 17 ++-- src/webapp/pages/Router.tsx | 11 +-- src/webapp/pages/app/App.tsx | 18 ++-- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 76 +++++++-------- 18 files changed, 212 insertions(+), 418 deletions(-) delete mode 100644 src/webapp/components/form/fields/NumberInputFF.tsx delete mode 100644 src/webapp/components/user-form/components/OrgUnitFF.tsx delete mode 100644 src/webapp/components/user-form/components/OutputFF.tsx rename src/webapp/components/user-form/components/{OrgUnitLevelsFF.tsx => UserRoleGroupFF.tsx} (73%) diff --git a/i18n/en.pot b/i18n/en.pot index 35f8aae..9f7270e 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -231,11 +231,7 @@ msgstr "" msgid "Replicate user from table" msgstr "" -<<<<<<< HEAD -msgid "Search by name" -======= msgid "Search by name or username..." ->>>>>>> release/1.0.0 msgstr "" msgid "First name" @@ -269,6 +265,12 @@ msgstr "" msgid "Save" msgstr "" +msgid "Add user" +msgstr "" + +msgid "Please provide a valid email" +msgstr "" + <<<<<<< HEAD msgid "Delete" ======= diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index d77bb73..ae98826 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -20,12 +20,14 @@ export const UserModel: Codec = Schema.object({ email: Schema.nonEmptyString, lastUpdated: Schema.nonEmptyString, created: Schema.nonEmptyString, + apiUrl: Schema.nonEmptyString, userRoles: Schema.array(NamedRefModel), userGroups: Schema.array(NamedRefModel), organisationUnits: Schema.array(NamedRefModel), dataViewOrganisationUnits: Schema.array(NamedRefModel), - lastLogin: Schema.nonEmptyString, + lastLogin: Schema.optional(Schema.nonEmptyString), disabled: Schema.boolean, access: AccessPermissionsModel, - authorities: Schema.array(Schema.nonEmptyString) + authorities: Schema.array(Schema.nonEmptyString), + openId: Schema.optional(Schema.string), }); diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 3db200f..9363e02 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,4 +1,4 @@ -import { D2Api, D2UserSchema, SelectedPick, MetadataResponse, PostOptions, MetadataPayloadBase, D2ApiDefinition } from "@eyeseetea/d2-api/2.34"; +import { D2Api, D2UserSchema, SelectedPick, MetadataResponse } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -11,10 +11,6 @@ import { Instance } from "../entities/Instance"; import { UserModel } from "../models/UserModel"; import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; -interface MetadataPost { - data:Partial>; - options: Partial -} export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -74,7 +70,7 @@ export class UserD2ApiRepository implements UserRepository { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); - const predictorData$ = apiToFuture( + const userData$ = apiToFuture( this.api.models.users.get({ fields, page, @@ -87,16 +83,13 @@ export class UserD2ApiRepository implements UserRepository { order: `${sorting.field}:${sorting.order}`, }) ); - return predictorData$.map(({ objects }) => objects); + return userData$.map(({ objects }) => objects); } - + public save(usersToSave: User[]): FutureData { - console.log(usersToSave) const validations = usersToSave.map(user => UserModel.decode(user)); const users = _.compact(validations.map(either => either.toMaybe().extract())); - console.log(users) const errors = _.compact(validations.map(either => either.leftOrDefault(""))); - console.log(errors) if (errors.length > 0) { return Future.error(errors.join("\n")); @@ -107,32 +100,23 @@ export class UserD2ApiRepository implements UserRepository { }; return this.getFullUsers(listOptions).flatMap(existingUsers => { - console.log(existingUsers) return this.getGroupsToSave(users, existingUsers).flatMap(userGroups => { const usersToSend = existingUsers.map((existingUser, index) => ({ ...existingUser, - organisationUnits: usersToSave[index]?.organisationUnits, - dataViewOrganisationUnits: usersToSave[index]?.dataViewOrganisationUnits, - email: usersToSave[index]?.email, - firstName: usersToSave[index]?.firstName, - surname: usersToSave[index]?.surname, + organisationUnits: users[index]?.organisationUnits, + dataViewOrganisationUnits: users[index]?.dataViewOrganisationUnits, + email: users[index]?.email, + firstName: users[index]?.firstName, + surname: users[index]?.surname, userCredentials: { ...existingUser.userCredentials, - disabled: usersToSave[index]?.disabled, - userRoles: usersToSave[index]?.userRoles, - username: usersToSave[index]?.username, + disabled: users[index]?.disabled, + userRoles: users[index]?.userRoles, + username: users[index]?.username, }, })); - return apiToFuture(this.api.metadata.post({ users: usersToSend, userGroups })).map(data => data); - }) - - /*console.log(usersToSend) - //importStrategy=UPDATE&mergeMode=REPLACE - const payload: MetadataPost = { - data: { users: usersToSend }, - options: { importStrategy: "UPDATE", mergeMode: "REPLACE"} - } - return apiToFuture(this.api.metadata.post({ users: usersToSend })).map(data => data);*/ + return apiToFuture(this.api.metadata.post({ users: usersToSend, userGroups })).map(data => data); + }); }); } private getGroupsToSave(users: User[], existing: User[]) { @@ -167,8 +151,7 @@ export class UserD2ApiRepository implements UserRepository { }) .filter(group => { const newIds = group.users.map(({ id }) => id); - const oldIds = - userGroups.find(({ id }) => id === group.id)?.users.map(({ id }) => id) ?? []; + const oldIds = userGroups.find(({ id }) => id === group.id)?.users.map(({ id }) => id) ?? []; return !_.isEqual(_.sortBy(oldIds), _.sortBy(newIds)); }) @@ -177,26 +160,29 @@ export class UserD2ApiRepository implements UserRepository { private mapUser(user: D2ApiUser): User { const { userCredentials } = user; - const authorities = _(userCredentials.userRoles.map(userRole => userRole.authorities)).flatten().uniq().value() + const authorities = _(userCredentials.userRoles.map(userRole => userRole.authorities)) + .flatten() + .uniq() + .value(); return { id: user.id, name: user.displayName, firstName: user.firstName, surname: user.surname, email: user.email, - lastUpdated: new Date(user.lastUpdated), - created: new Date(user.created), + lastUpdated: user.lastUpdated, + created: user.created, userGroups: user.userGroups, username: user.userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, - userRoles: user.userCredentials.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name})), - lastLogin: userCredentials.lastLogin ? new Date(userCredentials.lastLogin) : undefined, + userRoles: user.userCredentials.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name })), + lastLogin: userCredentials.lastLogin ? userCredentials.lastLogin : undefined, disabled: user.userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, access: user.access, openId: userCredentials.openId, - authorities + authorities, }; } } diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 1404d03..b82a395 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -8,20 +8,39 @@ export interface User { firstName: string; surname: string; email: string; - lastUpdated: Date; - created: Date; + lastUpdated: string; + created: string; apiUrl: string; userRoles: NamedRef[]; userGroups: NamedRef[]; organisationUnits: NamedRef[]; dataViewOrganisationUnits: NamedRef[]; - lastLogin?: Date; + lastLogin?: string; disabled: boolean; access: AccessPermissions; openId?: string; authorities: string[]; } - +export const defaultUser: User = { + id: "", + name: "", + username: "", + firstName: "", + surname: "", + email: "", + lastUpdated: "", + created: "", + apiUrl: "", + userRoles: [{ id: "", name: "" }], + userGroups: [{ id: "", name: "" }], + organisationUnits: [{ id: "", name: "" }], + dataViewOrganisationUnits: [{ id: "", name: "" }], + lastLogin: "", + disabled: false, + access: { read: true, update: true, externalize: true, delete: true, write: true, manage: true }, + openId: "", + authorities: [""], +}; export interface AccessPermissions { read?: boolean; update?: boolean; @@ -32,9 +51,9 @@ export interface AccessPermissions { } export const isSuperAdmin = (user: User): boolean => { - return _.some(user.authorities, (authorities) => authorities.includes("ALL")); + return _.some(user.authorities, authorities => authorities.includes("ALL")); }; export const hasReplicateAuthority = (user: User): boolean => { - return _.some(user.authorities, (authorities) => authorities.includes("F_REPLICATE_USER")); + return _.some(user.authorities, authorities => authorities.includes("F_REPLICATE_USER")); }; diff --git a/src/domain/usecases/ListMetadataUseCase.ts b/src/domain/usecases/ListMetadataUseCase.ts index 90a0dcf..61bbb80 100644 --- a/src/domain/usecases/ListMetadataUseCase.ts +++ b/src/domain/usecases/ListMetadataUseCase.ts @@ -12,17 +12,6 @@ export class ListMetadataUseCase implements UseCase { options: ListOptions & { paging?: boolean } = {}, fields: {} = {} ): FutureData<{ pager: Pager; objects: Metadata[] }> { - //const { paging = true } = options; return this.metadataRepository.list(type, options, fields); - - /* console.log(options) - if (paging) { - return this.metadataRepository.list(type, options, fields); - } else { - return this.metadataRepository.listAll([type], fields, options.filter).map(metadata => ({ - pager: { page: 1, pageCount: 1, pageSize: metadata[type]?.length, total: metadata[type]?.length }, - objects: metadata[type] ?? [], - })); - }*/ } } diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index a19b5f0..347dc41 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -35,7 +35,6 @@ import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; -import { UserBulkEditPage } from "../../webapp/pages/user-bulk-edit/UserBulkEditPage"; const pageSize = 50; const initialSorting = ["name", "asc"]; @@ -412,6 +411,7 @@ export class ListHybrid extends React.Component { loading={this.state.isLoading} openSettings={this._openSettings} filters={this.state.filters?.filters} + maxImportUsers={this.maxImportUsers} > diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 06a1711..07a3b6d 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -177,54 +177,6 @@ declare module "@dhis2/ui" { onFilterChangePicked?: (...args: any[]) => any; }; - export type MultiSelectProps = { - children: React.ReactNode; - className: string; - /** Required if `clearable` prop is `true` */ - clearText: string; - /** Adds a 'clear' option to the menu */ - clearable: boolean; - dataTest: string; - dense: boolean; - disabled: boolean; - empty: React.ReactNode; - error: boolean; - filterPlaceholder: string; - /** Adds a 'filter' field to the menu */ - filterable: boolean; - initialFocus: boolean; - inputMaxHeight: string; - loading: boolean; - loadingText: string; - maxHeight: string; - /** Required if `filterable` prop is `true` */ - noMatchText: string; - placeholder: string; - prefix: string; - selected: string[]; - tabIndex: string; - valid: boolean; - warning: boolean; - onBlur?: (data: { value?: string; name?: string }, event: FocusEvent) => void; - onChange?: (data: { value?: string; name?: string }, event: ChangeEvent) => void; - onFocus?: (data: { value?: string; name?: string }, event: FocusEvent) => void; - }; - - export type MultiSelectFieldFFProps = MultiSelectProps & { - input: FinalFormInput; - meta: FinalFormMeta; - error?: boolean; - loading?: boolean; - options?: { - label?: string; - value?: string; - }[]; - showLoadingStatus?: boolean; - showValidStatus?: boolean; - valid?: boolean; - validationText?: string; - }; - export type SingleSelectFieldProps = { className?: string; clearText?: string | ((...args: any[]) => any); @@ -433,7 +385,6 @@ declare module "@dhis2/ui" { export function Button(props: ButtonProps): React.ReactElement; export function Transfer(props: TransferProps): React.ReactElement; export function MultiSelect(props: MultiSelectProps): React.ReactElement; - export function MultiSelectFieldFF(props: MultiSelectFieldFFProps): React.ReactElement; export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; export function SingleSelectField(props: SingleSelectFieldProps): React.ReactElement; export function SingleSelectOption(props: SingleSelectOptionProps): React.ReactElement; @@ -453,7 +404,6 @@ declare module "@dhis2/ui" { export function composeValidators( ...validators: ((value: unknown) => string | undefined)[] ): (value: unknown) => string | undefined; - export function integer(value: unknown): string | undefined; export function boolean(value: unknown): string | undefined; export function alphaNumeric(value: unknown): string | undefined; export function email(value: unknown): string | undefined; @@ -461,7 +411,6 @@ declare module "@dhis2/ui" { export function string(value: unknown): string | undefined; export function url(value: unknown): string | undefined; export function hasValue(value: unknown): string | undefined; - export function createMinNumber(min: number): (value: unknown) => string | undefined; export function createPattern(pattern: RegExp, message?: string): (value: unknown) => string | undefined; export function createMaxCharacterLength(bound: number): (value: unknown) => string | undefined; export function createMinCharacterLength(bound: number): (value: unknown) => string | undefined; diff --git a/src/webapp/components/form/fields/NumberInputFF.tsx b/src/webapp/components/form/fields/NumberInputFF.tsx deleted file mode 100644 index 63e93cc..0000000 --- a/src/webapp/components/form/fields/NumberInputFF.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { InputField, InputFieldProps } from "@dhis2/ui"; -import { FieldRenderProps } from "react-final-form"; - -export const NumberInputFF: React.FC, "input"> & InputFieldProps> = ({ - input, - ...props -}) => { - return ( - input.onChange(parseInt(value ?? "0"))} - type="number" - /> - ); -}; diff --git a/src/webapp/components/import-summary/ImportSummary.tsx b/src/webapp/components/import-summary/ImportSummary.tsx index 0e787e3..3cb0ce4 100644 --- a/src/webapp/components/import-summary/ImportSummary.tsx +++ b/src/webapp/components/import-summary/ImportSummary.tsx @@ -16,9 +16,7 @@ import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import { useCallback } from "react"; import ReactJson from "react-json-view"; -import { hasReplicateAuthority, User } from "../../../domain/entities/User"; - -//import { MetadataResponse, MetadataResponseStats } from "../../../domain/entities/Metadata"; +import { MetadataResponse, MetadataResponseStats } from "../../../domain/entities/Metadata"; import i18n from "../../../locales"; const useStyles = makeStyles(theme => ({ @@ -55,8 +53,8 @@ export const formatStatusTag = (value: string) => { return {text}; }; -//stats: Array -const buildSummaryTable = (stats: Array) => { + +const buildSummaryTable = (stats: Array) => { return ( @@ -112,7 +110,7 @@ interface ErrorMessage { } interface ImportSummaryProps { - results: any[]; //MetadataResponse + results: MetadataResponse[]; onClose: () => void; } @@ -134,8 +132,8 @@ export const ImportSummary = ({ results, onClose }: ImportSummaryProps) => { > {results.map(({ status, typeReports = [] }, idx) => { - const stats = typeReports.map(({ stats }: { stats: any }) => ({ - type: i18n.t("Predictors"), + const stats = typeReports.map(({ stats }) => ({ + type: i18n.t("Users"), ...stats, })); diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 8868018..5187774 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -1,76 +1,93 @@ import { composeValidators, createMaxCharacterLength, - createMinNumber, + createMinCharacterLength, createPattern, - FieldState, hasValue, InputFieldFF, - integer, - MultiSelectFieldFF, + string, + alphaNumeric, CheckboxFieldFF, } from "@dhis2/ui"; import React from "react"; import i18n from "../../../locales"; import { fullUidRegex } from "../../../utils/uid"; import { FormField } from "../form/fields/FormField"; -import { NumberInputFF } from "../form/fields/NumberInputFF"; import { PreviewInputFF } from "../form/fields/PreviewInputFF"; -import { OrgUnitLevelsFF } from "./components/OrgUnitLevelsFF"; -import { OutputFF } from "./components/OutputFF"; -import { getPredictorFieldName, missingValueStrategy, PredictorFormField, predictorRequiredFields } from "./utils"; +import { UserRoleGroupFF } from "./components/UserRoleGroupFF"; +import { getUserFieldName, UserFormField, userRequiredFields } from "./utils"; +import { OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; +import { useAppContext } from "../../contexts/app-context"; -const useValidations = (field: PredictorFormField): { validation?: (...args: any[]) => any; props?: object } => { +const useValidations = (field: UserFormField): { validation?: (...args: any[]) => any; props?: object } => { switch (field) { case "id": return { validation: createPattern(fullUidRegex, i18n.t("Please provide a valid identifier")) }; - case "description": - case "generator.description": - case "sampleSkipTest.description": - return { validation: createMaxCharacterLength(255) }; - case "sequentialSampleCount": - case "annualSampleCount": - case "sequentialSkipCount": - case "scheduling.sequence": - case "scheduling.variable": - return { validation: composeValidators(integer, createMinNumber(0)) }; + case "firstName": + case "name": + case "surname": + case "apiUrl": + return { + validation: composeValidators(string, createMinCharacterLength(1), createMaxCharacterLength(255)), + }; + case "username": + return { + validation: composeValidators(alphaNumeric, createMinCharacterLength(1), createMaxCharacterLength(255)), + }; + case "email": + return { + validation: createPattern( + /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/, + i18n.t("Please provide a valid email") + ), + }; default: { - const required = predictorRequiredFields.includes(field); + const required = userRequiredFields.includes(field); return { validation: required ? hasValue : undefined }; } } }; -export const RenderPredictorWizardField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { +export const RenderUserWizardField: React.FC<{ row: number; field: UserFormField }> = ({ row, field }) => { const name = `users[${row}].${field}`; + const { api } = useAppContext(); const { validation, props: validationProps = {} } = useValidations(field); const props = { name, - placeholder: getPredictorFieldName(field), + placeholder: getUserFieldName(field), validate: validation, ...validationProps, }; - // console.log(props) - /* - case "output": - return ; -*/ - // return ; - //model type for dataViewOrganisationUnits ? + switch (field) { case "id": case "email": case "firstName": case "surname": + case "name": + case "openId": + case "apiUrl": + case "username": return ; case "userGroups": - return ; + return ; case "userRoles": - return ; + return ; case "organisationUnits": - return ; case "dataViewOrganisationUnits": - return ; + return ( + + ); case "disabled": return ; default: @@ -78,13 +95,13 @@ export const RenderPredictorWizardField: React.FC<{ row: number; field: Predicto } }; -export const RenderPredictorImportField: React.FC<{ row: number; field: PredictorFormField }> = ({ row, field }) => { +export const RenderUserImportField: React.FC<{ row: number; field: UserFormField }> = ({ row, field }) => { const name = `users[${row}].${field}`; + const { validation, props: validationProps = {} } = useValidations(field); - //console.log(field) const props = { name, - placeholder: getPredictorFieldName(field), + placeholder: getUserFieldName(field), validate: validation, ...validationProps, }; @@ -96,10 +113,10 @@ export const RenderPredictorImportField: React.FC<{ row: number; field: Predicto case "dataViewOrganisationUnits": return ( - + ); default: - return ; + return ; } }; diff --git a/src/webapp/components/user-form/components/OrgUnitFF.tsx b/src/webapp/components/user-form/components/OrgUnitFF.tsx deleted file mode 100644 index a762889..0000000 --- a/src/webapp/components/user-form/components/OrgUnitFF.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from "react"; -import { TransferOption } from "@dhis2/ui"; -import { OrgUnitsSelector } from "@eyeseetea/d2-ui-components"; -import { NamedRef } from "../../../../domain/entities/Ref"; -import { useAppContext } from "../../../contexts/app-context"; -import { useFuture } from "../../../hooks/useFuture"; -import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; -import { D2ModelSchemas } from "@eyeseetea/d2-api/2.34"; - -export interface OrgUnitFFProps extends TransferFFProps { - modelType: keyof D2ModelSchemas; -} -export const OrgUnitLevelsFF: React.FC> = props => { - const { compositionRoot, api } = useAppContext(); - //buildTransferOptions(objects) - const { data: orgUnitLevels = [] } = useFuture( - () => compositionRoot.metadata.list(props.modelType).map(({ objects }) => buildTransferOptions(objects)), - [] - ); - console.log(orgUnitLevels); - - return ( - - - - - - ); -}; -interface OptionType extends NamedRef { - authorities?: string[]; -} -const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { - console.log(options); - return options.map(({ id, name }) => ({ value: id, label: name })); -}; diff --git a/src/webapp/components/user-form/components/OutputFF.tsx b/src/webapp/components/user-form/components/OutputFF.tsx deleted file mode 100644 index f54299e..0000000 --- a/src/webapp/components/user-form/components/OutputFF.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { FieldState, SingleSelectField, SingleSelectOption } from "@dhis2/ui"; -import _ from "lodash"; -import React, { useCallback } from "react"; -import { useField } from "react-final-form"; -import styled from "styled-components"; -import { NamedRef } from "../../../../domain/entities/Ref"; -import i18n from "../../../../locales"; -import { useAppContext } from "../../../contexts/app-context"; -import { useFuture } from "../../../hooks/useFuture"; -import { getPredictorFieldName } from "../utils"; - -export const OutputFF: React.FC = ({ input, optionComboField }) => { - const { compositionRoot } = useAppContext(); - const { input: optionComboInput } = useField(optionComboField); - - /*const { data: dataElements = [] } = useFuture( - () => - compositionRoot.metadata - .list( - "dataElements", - { paging: false }, - { id: true, name: true, categoryCombo: { categoryOptionCombos: { id: true, name: true } } } - ) - .map(({ objects }) => buildOptions(objects as unknown as DataElementWithCategoryOptionCombo[])), - [] - );*/ - const dataElements = [{ label: "test1", value: "test1" }]; - - const onChangeDataElement = useCallback( - ({ selected }) => { - const dataElement = dataElements.find(item => item.value === selected); - if (dataElement) { - input.onChange({ id: dataElement.value, name: dataElement.label }); - /*const categoryOption = dataElement.categoryOptions[0]; - optionComboInput.onChange( - categoryOption ? { id: categoryOption.value, name: categoryOption.label } : undefined - );*/ - } - }, - [dataElements, input, optionComboInput] - ); - - //categoryOptions: [] - const dataElementItems = _.unionBy( - dataElements, - [{ value: input.value.id, label: i18n.t("Invalid option") }], - ({ value }) => value - ); - - /*const categoryItems = _.unionBy( - dataElements.find(({ value }) => value === input.value.id)?.categoryOptions, - [{ value: optionComboInput.value.id, label: i18n.t("Invalid option") }], - ({ value }) => value - );*/ - /* - {categoryItems.map(({ value, label }) => ( - - ))} - */ - return ( - - - {dataElementItems.map(({ value, label }) => ( - - ))} - - - ); -}; - -export interface CategoryOptionComboFFProps { - input: any; - meta: FieldState; - optionComboField: string; -} - -type DataElementWithCategoryOptionCombo = { - id: string; - name: string; - categoryCombo: { categoryOptionCombos: { id: string; name: string }[] }; -}; - -const buildOptions = ( - dataElements: DataElementWithCategoryOptionCombo[] -): { label: string; value: string; categoryOptions: { label: string; value: string }[] }[] => { - return dataElements.map(({ id, name, categoryCombo }) => ({ - value: id, - label: name, - categoryOptions: categoryCombo.categoryOptionCombos.map(({ id, name }) => ({ value: id, label: name })), - })); -}; - -const Row = styled.div` - margin: 20px 0; -`; diff --git a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx b/src/webapp/components/user-form/components/UserRoleGroupFF.tsx similarity index 73% rename from src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx rename to src/webapp/components/user-form/components/UserRoleGroupFF.tsx index 9203604..450e503 100644 --- a/src/webapp/components/user-form/components/OrgUnitLevelsFF.tsx +++ b/src/webapp/components/user-form/components/UserRoleGroupFF.tsx @@ -6,17 +6,15 @@ import { useFuture } from "../../../hooks/useFuture"; import { TransferFF, TransferFFProps } from "../../form/fields/TransferFF"; import { D2ModelSchemas } from "@eyeseetea/d2-api/2.34"; -export interface OrgUnitLevelsFFProps extends TransferFFProps { +export interface UserRoleGroupFFProps extends TransferFFProps { modelType: keyof D2ModelSchemas; } -export const OrgUnitLevelsFF: React.FC> = props => { +export const UserRoleGroupFF: React.FC> = props => { const { compositionRoot } = useAppContext(); - //buildTransferOptions(objects) - const { data: orgUnitLevels = [] } = useFuture( + const { data: userRoleGroups = [] } = useFuture( () => compositionRoot.metadata.list(props.modelType).map(({ objects }) => buildTransferOptions(objects)), [] ); - console.log(orgUnitLevels); return ( @@ -26,15 +24,12 @@ export const OrgUnitLevelsFF: React.FC> = filterablePicked selectedWidth="100%" optionsWidth="100%" - options={orgUnitLevels} + options={userRoleGroups} /> ); }; -interface OptionType extends NamedRef { - authorities?: string[]; -} + const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { - console.log(options); return options.map(({ id, name }) => ({ value: id, label: name })); }; diff --git a/src/webapp/components/user-form/utils.ts b/src/webapp/components/user-form/utils.ts index f08208b..87127eb 100644 --- a/src/webapp/components/user-form/utils.ts +++ b/src/webapp/components/user-form/utils.ts @@ -1,18 +1,30 @@ import _ from "lodash"; import i18n from "../../../locales"; -export type PredictorFormField = typeof predictorFormFields[number]; +export type UserFormField = typeof userFormFields[number]; -export const predictorFormFields = ["id", "firstName", "surname", "name", "email", "username", "disabled"]; +export const userFormFields = [ + "id", + "firstName", + "surname", + "name", + "email", + "username", + "disabled", + "openId", + "apiUrl", + "dataViewOrganisationUnits", + "organisationUnits", + "userGroups", + "userRoles", +]; -export const predictorRequiredFields: PredictorFormField[] = ["id", "name"]; +export const userRequiredFields: UserFormField[] = ["id", "name"]; -export const getPredictorName = (field: PredictorFormField) => { +export const getUserName = (field: UserFormField) => { switch (field) { case "id": return i18n.t("Identifier"); - case "code": - return i18n.t("Code"); case "firstName": return i18n.t("First Name"); case "name": @@ -33,25 +45,15 @@ export const getPredictorName = (field: PredictorFormField) => { return i18n.t("Organisation Units"); case "dataViewOrganisationUnits": return i18n.t("Data View Organisation Units"); - case "output": - return i18n.t("Output data element"); - case "outputCombo": - return i18n.t("Output category combo"); - case "organisationUnitLevels": - return i18n.t("Organisation unit levels"); - case "predictorGroups": - return i18n.t("Predictor groups"); + case "openId": + return i18n.t("Open ID"); + case "apiUrl": + return i18n.t("Api URL"); } }; -export const getPredictorFieldName = (field: PredictorFormField) => { - const name = getPredictorName(field); - const required = predictorRequiredFields.includes(field); +export const getUserFieldName = (field: UserFormField) => { + const name = getUserName(field); + const required = userRequiredFields.includes(field); return _.compact([name, required ? "(*)" : undefined]).join(" "); }; - -export const missingValueStrategy = [ - { value: "SKIP_IF_ANY_VALUE_MISSING", label: i18n.t("Skip if any value is missing") }, - { value: "SKIP_IF_ALL_VALUES_MISSING", label: i18n.t("Skip if all values are missing") }, - { value: "NEVER_SKIP", label: i18n.t("Never skip") }, -]; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index c1196d4..e892bc9 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -39,24 +39,26 @@ export const UserListTable: React.FC = props => { const snackbar = useSnackbar(); const history = useHistory(); - const editPredictor = useCallback( + const editUsers = useCallback( (ids: string[]) => { if (ids.length === 1) { - history.push(`/edit/${ids[0]}`); + goToUserEditPage(); } else { const listOptions = { filters: { id: ["in" as ListFilterType, ids] } as ListFilters, }; compositionRoot.users.list(listOptions).run( ({ objects }: { objects: User[] }) => { - console.log(objects); - history.push({ pathname: `/bulk-edit`, state: { users: objects } }); + history.push({ + pathname: `/bulk-edit`, + state: { users: objects, maxImportUsers: props.maxImportUsers }, + }); }, error => snackbar.error(error) ); } }, - [history, compositionRoot, snackbar] + [history, compositionRoot, snackbar, props.maxImportUsers] ); const baseConfig = useMemo((): TableConfig => { @@ -130,7 +132,7 @@ export const UserListTable: React.FC = props => { text: i18n.t("Edit"), icon: edit, multiple: true, - onClick: editPredictor, + onClick: editUsers, isActive: checkAccess(["update"]), }, { @@ -199,7 +201,7 @@ export const UserListTable: React.FC = props => { }, searchBoxLabel: i18n.t("Search by name or username..."), }; - }, [props, enableReplicate]); + }, [props, enableReplicate, editUsers]); const refreshRows = useCallback( ( @@ -307,6 +309,7 @@ function isStateActionVisible(action: string) { export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; filters: ListFilters; + maxImportUsers: number; } function buildEllipsizedList(items: NamedRef[], limit = 3) { diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 1ce8fa6..b22baca 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -1,19 +1,12 @@ import React from "react"; -import { HashRouter, Route, Switch, Redirect } from "react-router-dom"; +import { HashRouter, Route, Switch } from "react-router-dom"; import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; -<<<<<<< HEAD -import { UserBulkEditPage, ActionType } from "./user-bulk-edit/UserBulkEditPage"; -======= ->>>>>>> release/1.0.0 +import { UserBulkEditPage } from "./user-bulk-edit/UserBulkEditPage"; import { useAppContext } from "../contexts/app-context"; export const Router: React.FC = React.memo(() => { const { api } = useAppContext(); -<<<<<<< HEAD -======= - ->>>>>>> release/1.0.0 return ( diff --git a/src/webapp/pages/app/App.tsx b/src/webapp/pages/app/App.tsx index c6571a4..ab917e9 100644 --- a/src/webapp/pages/app/App.tsx +++ b/src/webapp/pages/app/App.tsx @@ -1,5 +1,5 @@ import { HeaderBar } from "@dhis2/ui"; -import { SnackbarProvider } from "@eyeseetea/d2-ui-components"; +import { LoadingProvider, SnackbarProvider } from "@eyeseetea/d2-ui-components"; import { MuiThemeProvider } from "@material-ui/core/styles"; import _ from "lodash"; //@ts-ignore @@ -51,15 +51,17 @@ export const App: React.FC = React.memo(function App({ api, d2, instan - + + -
    - - - -
    +
    + + + +
    - + +
    diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index e5b332b..c6c2547 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -1,6 +1,7 @@ import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; -//import { useLoading } from "@eyeseetea/d2-ui-components"; +import { useLoading } from "@eyeseetea/d2-ui-components"; +import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; import { Paper } from "@material-ui/core"; import { Delete, ViewColumn } from "@material-ui/icons"; import { IconButton } from "material-ui"; @@ -10,39 +11,29 @@ import { Redirect, useLocation } from "react-router"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeGrid as Grid } from "react-window"; import styled from "styled-components"; -import { User } from "../../../domain/entities/User"; -import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; +import { User, defaultUser } from "../../../domain/entities/User"; import i18n from "../../../locales"; import { ColumnSelectorDialog } from "../../components/column-selector-dialog/ColumnSelectorDialog"; import { ImportSummary } from "../../components/import-summary/ImportSummary"; import { PageHeader } from "../../components/page-header/PageHeader"; -import { RenderPredictorImportField } from "../../components/user-form/UserForm"; -import { predictorFormFields, getPredictorFieldName } from "../../components/user-form/utils"; +import { RenderUserImportField } from "../../components/user-form/UserForm"; +import { userFormFields, getUserFieldName } from "../../components/user-form/utils"; import { useAppContext } from "../../contexts/app-context"; import { useGoBack } from "../../hooks/useGoBack"; +import { generateUid } from "../../../utils/uid"; const rowHeight = (index: number) => (index === 0 ? 30 : 70); const columnWidth = (index: number) => (index === 0 ? 50 : 250); -/*export interface PredictorBulkEditPageProps { - type: ActionType; -}*/ - -export interface PredictorBulkEditPageProps { - users: User[]; -} - -export type ActionType = "import" | "bulk-edit"; -//: React.FC { users } export const UserBulkEditPage = () => { const { compositionRoot } = useAppContext(); const goBack = useGoBack(); - //const loading = useLoading(); + const loading = useLoading(); - const location = useLocation<{ users: User[] }>(); - const [users] = React.useState(location.state?.users ?? []); - const [summary, setSummary] = useState(); + const location = useLocation<{ users: User[]; maxImportUsers: number }>(); + const [users, setUsers] = React.useState(location.state?.users ?? []); + const [summary, setSummary] = useState(); const [columns, setColumns] = useState(baseUserColumns); const [columnSelectorOpen, setColumnSelectorOpen] = useState(false); @@ -50,27 +41,32 @@ export const UserBulkEditPage = () => { const onSubmit = useCallback( async ({ users }: { users: User[] }) => { - //loading.show(true, i18n.t("Saving predictors")); + loading.show(true, i18n.t("Saving users")); const { data, error } = await compositionRoot.users.save(users).runAsync(); - console.log(data); - console.log(error); if (error) return error ?? i18n.t("Network error"); - //loading.reset(); + loading.reset(); if (data && data.status === "ERROR") { - setSummary(data); + setSummary([data]); } else { goHome(); } - /*if (_.some(data, foo => foo.status === "ERROR")) { - setSummary(data); - } else { - goHome(); - }*/ - //, loading }, - [compositionRoot, goHome] + [compositionRoot, goHome, loading] ); + + const addRow = useCallback(() => { + const newUser = { + ...defaultUser, + id: generateUid(), + username: "", + password: `District123$`, + }; + + setUsers(users => users.concat(newUser)); + }, []); + const title = i18n.t("Edit users"); + const canAddNewUser = users.length < (location.state?.maxImportUsers || 200); if (users.length === 0) return ; const closeSummary = () => setSummary(undefined); @@ -90,10 +86,10 @@ export const UserBulkEditPage = () => { {columnSelectorOpen && ( setColumnSelectorOpen(false)} /> )} @@ -130,6 +126,12 @@ export const UserBulkEditPage = () => { )} + + + + From ceb2b49bb036717529ab224a477163f39c6a9ee7 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Mon, 29 Nov 2021 10:23:46 +0100 Subject: [PATCH 102/192] Fix save multiple Signed-off-by: Alexis Rico --- i18n/en.pot | 13 +-- i18n/es.po | 11 +-- src/data/models/UserModel.ts | 12 +-- src/data/repositories/UserD2ApiRepository.ts | 96 ++++++++++++------- .../user-list-table/UserListTable.tsx | 38 +++++--- .../pages/user-bulk-edit/UserBulkEditPage.tsx | 25 +++-- 6 files changed, 111 insertions(+), 84 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index c1837d4..e640784 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-28T21:59:31.014Z\n" -"PO-Revision-Date: 2021-11-28T21:59:31.014Z\n" +"POT-Creation-Date: 2021-11-29T09:22:31.420Z\n" +"PO-Revision-Date: 2021-11-29T09:22:31.420Z\n" msgid "Enable users" msgstr "" @@ -155,6 +155,9 @@ msgstr "" msgid "Details" msgstr "" +msgid "Edit" +msgstr "" + msgid "Copy in user" msgstr "" @@ -170,9 +173,6 @@ msgstr "" msgid "Assign groups" msgstr "" -msgid "Edit" -msgstr "" - msgid "Enable" msgstr "" @@ -206,9 +206,6 @@ msgstr "" msgid "Saving users" msgstr "" -msgid "Network error" -msgstr "" - msgid "Edit users" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 6a04935..b65e328 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-28T21:59:31.014Z\n" +"POT-Creation-Date: 2021-11-29T09:22:31.420Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -155,6 +155,9 @@ msgstr "" msgid "Details" msgstr "Detalles" +msgid "Edit" +msgstr "" + msgid "Copy in user" msgstr "" @@ -170,9 +173,6 @@ msgstr "" msgid "Assign groups" msgstr "" -msgid "Edit" -msgstr "" - msgid "Enable" msgstr "" @@ -206,9 +206,6 @@ msgstr "" msgid "Saving users" msgstr "" -msgid "Network error" -msgstr "" - msgid "Edit users" msgstr "" diff --git a/src/data/models/UserModel.ts b/src/data/models/UserModel.ts index 26863cf..86243eb 100644 --- a/src/data/models/UserModel.ts +++ b/src/data/models/UserModel.ts @@ -1,6 +1,6 @@ import { User, AccessPermissions } from "../../domain/entities/User"; import { Codec, Schema } from "../../utils/codec"; -import { D2ApiUser } from "../repositories/UserD2ApiRepository"; +import { ApiUser } from "../repositories/UserD2ApiRepository"; import { NamedRefModel } from "./DHIS2Model"; export const AccessPermissionsModel: Codec = Schema.object({ @@ -12,8 +12,6 @@ export const AccessPermissionsModel: Codec = Schema.object({ manage: Schema.optionalSafe(Schema.boolean, false), }); -const dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"; - export const UserModel: Codec = Schema.object({ id: Schema.nonEmptyString, name: Schema.nonEmptyString, @@ -21,21 +19,21 @@ export const UserModel: Codec = Schema.object({ firstName: Schema.nonEmptyString, surname: Schema.nonEmptyString, email: Schema.string, - lastUpdated: Schema.stringDate(dateFormat), - created: Schema.stringDate(dateFormat), + lastUpdated: Schema.date, + created: Schema.date, apiUrl: Schema.nonEmptyString, userRoles: Schema.array(NamedRefModel), userGroups: Schema.array(NamedRefModel), organisationUnits: Schema.array(NamedRefModel), dataViewOrganisationUnits: Schema.array(NamedRefModel), - lastLogin: Schema.optional(Schema.stringDate(dateFormat)), + lastLogin: Schema.optional(Schema.date), disabled: Schema.boolean, access: AccessPermissionsModel, authorities: Schema.array(Schema.nonEmptyString), openId: Schema.optional(Schema.string), }); -export const ApiUserModel: Codec = Schema.object({ +export const ApiUserModel: Codec = Schema.object({ id: Schema.string, name: Schema.string, firstName: Schema.string, diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index a7c50ca..daf396f 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -1,4 +1,4 @@ -import { D2Api, D2UserSchema, SelectedPick, MetadataResponse } from "@eyeseetea/d2-api/2.34"; +import { D2Api, D2UserSchema, MetadataResponse, SelectedPick } from "@eyeseetea/d2-api/2.34"; import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; @@ -8,8 +8,7 @@ import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; import { Instance } from "../entities/Instance"; -import { ApiUserModel, UserModel } from "../models/UserModel"; -import { ListFilters, ListFilterType } from "../../domain/repositories/UserRepository"; +import { ApiUserModel } from "../models/UserModel"; export class UserD2ApiRepository implements UserRepository { private api: D2Api; @@ -20,7 +19,7 @@ export class UserD2ApiRepository implements UserRepository { @cache() public getCurrent(): FutureData { - return apiToFuture(this.api.currentUser.get({ fields })).map(user => this.mapUser(user)); + return apiToFuture(this.api.currentUser.get({ fields })).map(user => this.toDomainUser(user)); } public list(options: ListOptions): FutureData> { @@ -38,7 +37,7 @@ export class UserD2ApiRepository implements UserRepository { }) ).map(({ objects, pager }) => ({ pager, - objects: objects.map(user => this.mapUser(user)), + objects: objects.map(user => this.toDomainUser(user)), })); } @@ -62,11 +61,11 @@ export class UserD2ApiRepository implements UserRepository { const [user] = objects; if (!user) return Future.error(`User ${id} not found`); - return Future.success(this.mapUser(user)); + return Future.success(this.toDomainUser(user)); }); } - private getFullUsers(options: ListOptions): FutureData { + private getFullUsers(options: ListOptions): FutureData { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); @@ -87,39 +86,42 @@ export class UserD2ApiRepository implements UserRepository { } public save(usersToSave: User[]): FutureData { - const validations = usersToSave.map(user => UserModel.decode(user)); + const validations = usersToSave.map(user => ApiUserModel.decode(this.toApiUser(user))); const users = _.compact(validations.map(either => either.toMaybe().extract())); const errors = _.compact(validations.map(either => either.leftOrDefault(""))); if (errors.length > 0) { return Future.error(errors.join("\n")); } + const userIds = users.map(user => user.id); - const listOptions = { - filters: { id: ["in" as ListFilterType, userIds] } as ListFilters, - }; - return this.getFullUsers(listOptions).flatMap(existingUsers => { + return this.getFullUsers({ filters: { id: ["in", userIds] } }).flatMap(existingUsers => { return this.getGroupsToSave(users, existingUsers).flatMap(userGroups => { - const usersToSend = existingUsers.map((existingUser, index) => ({ - ...existingUser, - organisationUnits: users[index]?.organisationUnits, - dataViewOrganisationUnits: users[index]?.dataViewOrganisationUnits, - email: users[index]?.email, - firstName: users[index]?.firstName, - surname: users[index]?.surname, - userCredentials: { - ...existingUser.userCredentials, - disabled: users[index]?.disabled, - userRoles: users[index]?.userRoles, - username: users[index]?.username, - }, - })); + const usersToSend = existingUsers.map((existingUser, index) => { + const user = users[index]; + + return { + ...existingUser, + organisationUnits: user?.organisationUnits, + dataViewOrganisationUnits: user?.dataViewOrganisationUnits, + email: user?.email, + firstName: user?.firstName, + surname: user?.surname, + userCredentials: { + ...existingUser.userCredentials, + disabled: user?.userCredentials.disabled, + userRoles: user?.userCredentials.userRoles, + username: user?.userCredentials.username, + }, + }; + }); + return apiToFuture(this.api.metadata.post({ users: usersToSend, userGroups })).map(data => data); }); }); } - private getGroupsToSave(users: User[], existing: D2ApiUser[]) { + private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { const userIds = users.map(({ id }) => id); const groupDictionary = _(users) .flatMap(({ id, userGroups }) => userGroups.map(group => ({ id, group }))) @@ -158,34 +160,56 @@ export class UserD2ApiRepository implements UserRepository { ); } - private mapUser(input: D2ApiUser): User { - const { userCredentials, ...user } = ApiUserModel.unsafeDecode(input); + private toDomainUser(input: ApiUser): User { + const { userCredentials, ...user } = input; const authorities = _(userCredentials.userRoles.map(userRole => userRole.authorities)) .flatten() .uniq() .value(); - return UserModel.unsafeDecode({ - ...user, + return { id: user.id, name: user.name, firstName: user.firstName, surname: user.surname, email: user.email, - lastUpdated: user.lastUpdated, - created: user.created, + lastUpdated: new Date(user.lastUpdated), + created: new Date(user.created), userGroups: user.userGroups, username: userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, userRoles: userCredentials.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name })), - lastLogin: userCredentials.lastLogin ? userCredentials.lastLogin : undefined, + lastLogin: userCredentials.lastLogin ? new Date(userCredentials.lastLogin) : undefined, disabled: userCredentials.disabled, organisationUnits: user.organisationUnits, dataViewOrganisationUnits: user.dataViewOrganisationUnits, access: user.access, openId: userCredentials.openId, authorities, - }); + }; + } + + private toApiUser(input: User): ApiUser { + return { + id: input.id, + name: input.name, + firstName: input.firstName, + surname: input.surname, + email: input.email, + lastUpdated: input.lastUpdated.toISOString(), + created: input.created.toISOString(), + userGroups: input.userGroups, + organisationUnits: input.organisationUnits, + dataViewOrganisationUnits: input.dataViewOrganisationUnits, + access: input.access, + userCredentials: { + username: input.username, + userRoles: input.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name, authorities: [] })), + lastLogin: input.lastLogin?.toISOString() ?? "", + disabled: input.disabled, + openId: input.openId ?? "", + }, + }; } } @@ -210,4 +234,4 @@ const fields = { }, } as const; -export type D2ApiUser = SelectedPick; +export type ApiUser = SelectedPick; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 301b5e0..3ee1a36 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -9,12 +9,14 @@ import { TablePagination, TableSorting, useObjectsTable, + useSnackbar, } from "@eyeseetea/d2-ui-components"; import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; import React, { useCallback, useMemo, useState } from "react"; +import { useNavigate } from "react-router-dom"; import { NamedRef } from "../../../domain/entities/Ref"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; import { ListFilters } from "../../../domain/repositories/UserRepository"; @@ -34,11 +36,23 @@ export const UserListTable: React.FC = props => { const [dialogProps, _openDialog] = useState(); const enableReplicate = hasReplicateAuthority(currentUser); + const snackbar = useSnackbar(); + const navigate = useNavigate(); - // TODO: Add bulk edit - const editUsers = useCallback((ids: string[]) => { - goToUserEditPage(ids[0]); - }, []); + const editUsers = useCallback( + (ids: string[]) => { + if (ids.length === 1) { + goToUserEditPage(ids[0]); + return; + } + + compositionRoot.users.list({ filters: { id: ["in", ids] } }).run( + ({ objects }) => navigate(`/bulk-edit`, { state: { users: objects } }), + error => snackbar.error(error) + ); + }, + [navigate, compositionRoot, snackbar] + ); const baseConfig = useMemo((): TableConfig => { return { @@ -65,6 +79,14 @@ export const UserListTable: React.FC = props => { multiple: false, primary: true, }, + { + name: "edit", + text: i18n.t("Edit"), + icon: edit, + multiple: true, + onClick: editUsers, + isActive: checkAccess(["update"]), + }, { name: "copy_in_user", text: i18n.t("Copy in user"), @@ -106,14 +128,6 @@ export const UserListTable: React.FC = props => { onClick: users => userGroupsAssignmentDialogStore.setState({ users, open: true }), isActive: checkAccess(["update"]), }, - { - name: "edit", - text: i18n.t("Edit"), - icon: edit, - multiple: false, - onClick: editUsers, - isActive: checkAccess(["update"]), - }, { name: "enable", text: i18n.t("Enable"), diff --git a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx index 6baaf58..e28e8ad 100644 --- a/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx +++ b/src/webapp/pages/user-bulk-edit/UserBulkEditPage.tsx @@ -1,6 +1,6 @@ import { Button, ButtonStrip, CenteredContent, NoticeBox } from "@dhis2/ui"; import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; -import { useLoading } from "@eyeseetea/d2-ui-components"; +import { useLoading, useSnackbar } from "@eyeseetea/d2-ui-components"; import { Paper } from "@material-ui/core"; import { Delete, ViewColumn } from "@material-ui/icons"; import { IconButton } from "material-ui"; @@ -28,6 +28,7 @@ export const UserBulkEditPage = () => { const { compositionRoot } = useAppContext(); const goBack = useGoBack(); const loading = useLoading(); + const snackbar = useSnackbar(); const location = useLocation(); const { users: locationUsers = [] } = location.state as { users: User[] }; @@ -42,16 +43,22 @@ export const UserBulkEditPage = () => { const onSubmit = useCallback( async ({ users }: { users: User[] }) => { loading.show(true, i18n.t("Saving users")); + const { data, error } = await compositionRoot.users.save(users).runAsync(); - if (error) return error ?? i18n.t("Network error"); loading.reset(); + + if (error) { + snackbar.error(error); + return error; + } + if (data && data.status === "ERROR") { setSummary([data]); } else { goHome(); } }, - [compositionRoot, goHome, loading] + [compositionRoot, snackbar, goHome, loading] ); const addRow = useCallback(() => { @@ -148,17 +155,7 @@ export const UserBulkEditPage = () => { ); }; -const baseUserColumns = [ - "id", - "firstName", - "surname", - "email", - "disabled", - "userRoles", - "userGroups", - "organisationUnits", - "dataViewOrganisationUnits", -]; +const baseUserColumns = ["firstName", "surname", "email", "userRoles", "userGroups", "organisationUnits"]; const MaxHeight = styled.div` height: 95%; From 8a6c4804247cbd8f8655e7cb20c19bb8d31f35a2 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Mon, 29 Nov 2021 10:24:07 +0100 Subject: [PATCH 103/192] Bump beta version Signed-off-by: Alexis Rico --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c8a9ab..6baf053 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "user-extended-app", "description": "DHIS2 Extended User app", - "version": "1.0.0-alpha.1", + "version": "1.0.0-alpha.2", "license": "GPL-3.0", "author": "EyeSeeTea team", "homepage": ".", From 8e70e1a12463d0ef45a1794f1ca8ff3a3cf5f423 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Mon, 29 Nov 2021 10:25:25 +0100 Subject: [PATCH 104/192] Prettify code Signed-off-by: Alexis Rico --- src/data/repositories/UserD2ApiRepository.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index daf396f..97271b5 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -121,6 +121,7 @@ export class UserD2ApiRepository implements UserRepository { }); }); } + private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { const userIds = users.map(({ id }) => id); const groupDictionary = _(users) From b17485adda68d775325884ddde65d8228d03a7fb Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Mon, 29 Nov 2021 15:38:47 +0100 Subject: [PATCH 105/192] Clean-up old rx code for layout Signed-off-by: Alexis Rico --- package.json | 2 +- src/data/repositories/UserD2ApiRepository.ts | 2 +- src/index.tsx | 2 +- src/legacy/App/appStateStore.js | 88 --------------- src/legacy/LegacyApp.jsx | 26 ----- src/legacy/List/List.component.js | 105 +++--------------- src/legacy/List/list.store.js | 26 ----- .../components/ImportExport.component.js | 6 - .../components/TableLayout.component.js | 92 --------------- .../user-list-table/UserListTable.tsx | 2 + src/webapp/pages/Router.tsx | 2 +- yarn.lock | 8 +- 12 files changed, 26 insertions(+), 335 deletions(-) delete mode 100644 src/legacy/components/TableLayout.component.js diff --git a/package.json b/package.json index 6baf053..4f93268 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dhis2/d2-i18n-generate": "1.2.0", "@dhis2/ui": "7.8.1", "@eyeseetea/d2-api": "1.9.3", - "@eyeseetea/d2-ui-components": "2.6.9-beta.5", + "@eyeseetea/d2-ui-components": "2.6.9-beta.8", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", "@types/react-virtualized-auto-sizer": "1.0.1", diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 97271b5..d489ffa 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -121,7 +121,7 @@ export class UserD2ApiRepository implements UserRepository { }); }); } - + private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { const userIds = users.map(({ id }) => id); const groupDictionary = _(users) diff --git a/src/index.tsx b/src/index.tsx index 80825b7..d5621b7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -76,7 +76,7 @@ async function main() { initDeprecatedI18n(d2, userSettings); ReactDOM.render( - + , document.getElementById("root") diff --git a/src/legacy/App/appStateStore.js b/src/legacy/App/appStateStore.js index e6cd168..5e694f9 100644 --- a/src/legacy/App/appStateStore.js +++ b/src/legacy/App/appStateStore.js @@ -1,48 +1,12 @@ import Store from "d2-ui/lib/store/Store"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import isObject from "d2-utilizr/lib/isObject"; import { getInstance } from "d2/lib/d2"; import "rxjs/add/operator/distinctUntilChanged"; import "rxjs/add/operator/filter"; import "rxjs/add/operator/map"; import snackActions from "../Snackbar/snack.actions"; -const sideBarConfig = {}; - const appState = Store.create(); -function isInPredefinedList(predefinedList) { - return function isInPredefinedListFunc(name) { - return predefinedList.indexOf(name) >= 0; - }; -} - -async function loadSideBarState() { - const d2 = await getInstance(); - const modelDefinitionNames = d2.models.mapThroughDefinitions(definition => definition.name); - - return Object.keys(sideBarConfig) - .map(sideBarCategory => ({ - name: sideBarCategory, - items: sideBarConfig[sideBarCategory].items.filter(isInPredefinedList(modelDefinitionNames)).map(key => ({ - key, - label: d2.i18n.getTranslation(camelCaseToUnderscores(key)), - })), - })) - .reduce( - (acc, sideBarCategory) => { - acc[sideBarCategory.name] = sideBarCategory.items; // eslint-disable-line no-param-reassign - return acc; - }, - { - mainSections: Object.keys(sideBarConfig).map(sideBarCategory => ({ - key: sideBarCategory, - label: d2.i18n.getTranslation(camelCaseToUnderscores(sideBarCategory)), - })), - } - ); -} - // d2/src/current-user/CurrentUser.js#getOrganisationUnits + children[shortName] const orgUnitListOptions = { fields: ":all,shortName,displayName,path,children[id,shortName,displayName,path,children::isNotEmpty]", @@ -81,21 +45,6 @@ async function getCurrentUserOrganisationUnits(disableCache = false) { return organisationUnitsCollection; } -async function loadSelectedOrganisationUnitState() { - if (appState.state && appState.state.selectedOrganisationUnit) { - return appState.state.selectedOrganisationUnit; - } - - const organisationUnitsCollection = await getCurrentUserOrganisationUnits(); - - return organisationUnitsCollection.toArray().reduce((selectedOU, orgUnit) => { - if (!selectedOU.path || selectedOU.path.length > orgUnit.path.length) { - return orgUnit; - } - return selectedOU; - }, {}); -} - export async function reloadUserOrganisationUnits() { const userOrganisationUnits = await getCurrentUserOrganisationUnits(true); @@ -105,45 +54,8 @@ export async function reloadUserOrganisationUnits() { }); } -export async function initAppState(startState, disableCache) { - const [sideBar, selectedOrganisationUnit, userOrganisationUnits] = await Promise.all([ - loadSideBarState(), - loadSelectedOrganisationUnitState(), - getCurrentUserOrganisationUnits(disableCache), - ]); - - const loadedState = { - selectedOrganisationUnit, - sideBar, - mainSections: sideBar.mainSections, - userOrganisationUnits, - hierarchy: { - selectedLeft: [], - selectedRight: [], - isProcessing: false, - leftRoots: userOrganisationUnits.toArray(), - rightRoots: userOrganisationUnits.toArray(), - }, - }; - - const completeInitState = Object.keys(startState).reduce((newAppState, stateKey) => { - if (newAppState[stateKey]) { - if (isObject(newAppState[stateKey])) { - newAppState[stateKey] = Object.assign({}, newAppState[stateKey], startState[stateKey]); // eslint-disable-line no-param-reassign - } else { - newAppState[stateKey] = startState[stateKey]; // eslint-disable-line no-param-reassign - } - } - return newAppState; - }, loadedState); - - appState.setState(completeInitState); -} - export default appState; export function setAppState(newPartialState) { appState.setState(Object.assign({}, appState.state, newPartialState)); } - -export const currentSubSection$ = appState.map(state => state.sideBar.currentSubSection).distinctUntilChanged(); diff --git a/src/legacy/LegacyApp.jsx b/src/legacy/LegacyApp.jsx index 0b8150f..ae243a5 100644 --- a/src/legacy/LegacyApp.jsx +++ b/src/legacy/LegacyApp.jsx @@ -1,31 +1,5 @@ -import { useEffect, useState } from "react"; import App from "./App/App.component"; -import { initAppState } from "./App/appStateStore"; - -const params = { groupName: "userSection", modelType: "user" }; export const LegacyAppWrapper = props => { - const [loading, setLoading] = useState(true); - - useEffect(() => { - loadList({ params }, () => setLoading(false)); - }, []); - - if (loading) return null; - return {props.children}; }; - -function initState({ params }) { - initAppState({ - sideBar: { - currentSection: params.groupName, - currentSubSection: params.modelType, - }, - }); -} - -function loadList({ params }, callback) { - initState({ params }); - callback(); -} diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 297203e..30cca9a 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -1,7 +1,4 @@ import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; -import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; -import isIterable from "d2-utilizr/lib/isIterable"; -import _ from "lodash"; import set from "lodash/fp/set"; import log from "loglevel"; import IconButton from "material-ui/IconButton"; @@ -17,7 +14,6 @@ import ImportTable from "../components/ImportTable.component"; import ReplicateUserFromTable from "../components/ReplicateUserFromTable.component"; import ReplicateUserFromTemplate from "../components/ReplicateUserFromTemplate.component"; import SettingsDialog from "../components/SettingsDialog.component"; -import TableLayout from "../components/TableLayout.component"; import UserGroupsDialog from "../components/UserGroupsDialog.component"; import UserRolesDialog from "../components/UserRolesDialog.component"; import Settings from "../models/settings"; @@ -28,25 +24,15 @@ import copyInUserStore from "./copyInUser.store"; import deleteUserStore from "./deleteUser.store"; import enableStore from "./enable.store"; import Filters from "./Filters.component"; -import listActions from "./list.actions"; -import listStore from "./list.store"; import orgUnitDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; import userGroupsAssignmentDialogStore from "./userGroups.store"; import userRolesAssignmentDialogStore from "./userRoles.store"; -const pageSize = 50; - const initialSorting = ["name", "asc"]; export class ListHybrid extends React.Component { - static propTypes = { - params: PropTypes.shape({ - modelType: PropTypes.string.isRequired, - }), - }; - static contextTypes = { d2: PropTypes.object.isRequired, }; @@ -83,7 +69,6 @@ export class ListHybrid extends React.Component { this.state = { listFilterOptions: {}, - dataRows: null, filters: {}, pager: { total: 0, @@ -91,7 +76,7 @@ export class ListHybrid extends React.Component { isLoading: true, sorting: initialSorting, settingsVisible: false, - layoutSettingsVisible: false, + visibleColumns: [], sharing: { model: null, open: false, @@ -134,20 +119,10 @@ export class ListHybrid extends React.Component { this.observerDisposables = []; Settings.build(this.context.d2).then(settings => { - const sourceStoreDisposable = listStore.subscribe(listStoreValue => { - if (!isIterable(listStoreValue.list)) { - return; // Received value is not iterable, keep waiting - } - - this.setState({ - dataRows: listStoreValue.list, - pager: listStoreValue.pager, - tableColumns: listStoreValue.tableColumns, - settings: this.state.settings || settings, - isLoading: false, - }); + this.setState({ + settings: this.state.settings || settings, + isLoading: false, }); - this.registerDisposable(sourceStoreDisposable); }); const orgUnitAssignmentStoreDisposable = orgUnitDialogStore.subscribe(orgunitassignmentState => { @@ -251,28 +226,11 @@ export class ListHybrid extends React.Component { }); }; - filterList = ({ page = 1 } = {}) => { + filterList = () => { const order = this.state.sorting ? this.state.sorting[0] + ":i" + this.state.sorting[1] : null; const { filters } = this.state; - const options = { - modelType: this.props.params.modelType, - order: order, - ...filters, - }; - - const paginatedOptions = { - ...options, - paging: true, - page: page, - pageSize: pageSize, - }; - - listActions.filter(paginatedOptions).subscribe( - () => {}, - error => log.error(error) - ); - this.setState({ isLoading: true, listFilterOptions: options }); + this.setState({ isLoading: true, listFilterOptions: { order: order, ...filters } }); }; convertObjsToMenuItems = objs => { @@ -328,21 +286,8 @@ export class ListHybrid extends React.Component { }); }; - _openLayoutSettings = () => { - this.setState({ layoutSettingsVisible: true }); - }; - - _closeLayoutSettings = () => { - this.setState({ layoutSettingsVisible: false }); - }; - - _setLayoutSettings = selectedColumns => { - const newSettings = this.state.settings.set({ visibleTableColumns: selectedColumns }); - this.setState({ settings: newSettings }); - }; - - _saveLayoutSettings = () => { - this.state.settings.save().then(this._closeLayoutSettings); + _updateVisibleColumns = visibleColumns => { + this.setState({ visibleColumns }); }; _openImportTable = importResult => { @@ -381,7 +326,6 @@ export class ListHybrid extends React.Component { _removeUsersCancel = () => this.setState({ removeUsers: { open: false } }); render() { - if (!this.state.dataRows) return null; const { d2 } = this.context; const { @@ -392,34 +336,27 @@ export class ListHybrid extends React.Component { copyUsers, removeUsers, disableUsers, + importUsers, + settings, + settingsVisible, } = this.state; - const { importUsers } = this.state; - const { settings, settingsVisible, layoutSettingsVisible, tableColumns } = this.state; - const { styles } = this; - const allColumns = tableColumns.map(c => ({ - text: this.getTranslation(camelCaseToUnderscores(c.name)), - value: c.name, - })); - - const visibleColumns = _(tableColumns).keyBy("name").at(settings.get("visibleTableColumns")).compact().value(); - return (
    -
    -
    +
    +
    - {this.state.dataRows.length || this.state.isLoading ? null :
    No results found
    }
    @@ -511,6 +447,7 @@ export class ListHybrid extends React.Component { saveText={"Confirm"} /> ) : null} + {assignUserGroups.open ? ( ) : null} - {layoutSettingsVisible && ( - c.name)} - onChange={this._setLayoutSettings} - onSave={this._saveLayoutSettings} - onClose={this._closeLayoutSettings} - /> - )} - {settingsVisible && } {replicateUser.open ? this.getReplicateDialog(replicateUser) : null} diff --git a/src/legacy/List/list.store.js b/src/legacy/List/list.store.js index 2e478f8..5827029 100644 --- a/src/legacy/List/list.store.js +++ b/src/legacy/List/list.store.js @@ -1,7 +1,6 @@ import Store from "d2-ui/lib/store/Store"; import { getInstance as getD2 } from "d2/lib/d2"; import { Observable, Subject } from "rx"; -import appState from "../App/appStateStore"; import { getUserList } from "../models/userList"; export const columns = [ @@ -19,12 +18,6 @@ export const columns = [ { name: "disabled", sortable: false }, ]; -const columnObservable = appState - .filter(appState => appState.sideBar && appState.sideBar.currentSubSection) - .map(appState => appState.sideBar.currentSubSection) - .distinctUntilChanged() - .map(() => columns); - export default Store.create({ listSourceSubject: new Subject(), listRolesSubject: new Subject(), @@ -32,25 +25,6 @@ export default Store.create({ listOrgUnitsSubject: new Subject(), initialise() { - this.listSourceSubject - .concatAll() - .combineLatest(columnObservable) - .subscribe(([usersResponse, columns]) => { - this.setState({ - tableColumns: columns, - pager: usersResponse.pager, - list: usersResponse.users.map(user => ({ - ...user, - ...(!user.userCredentials - ? {} - : { - username: user.userCredentials.username, - lastLogin: user.userCredentials.lastLogin, - userRoles: user.userCredentials.userRoles, - }), - })), - }); - }); return this; }, diff --git a/src/legacy/components/ImportExport.component.js b/src/legacy/components/ImportExport.component.js index ea524cd..91fc4cf 100644 --- a/src/legacy/components/ImportExport.component.js +++ b/src/legacy/components/ImportExport.component.js @@ -23,12 +23,6 @@ class ImportExport extends React.Component { onImport: PropTypes.func.isRequired, maxUsers: PropTypes.number.isRequired, settings: PropTypes.object.isRequired, - allColumns: PropTypes.arrayOf( - PropTypes.shape({ - text: PropTypes.string.isRequired, - value: PropTypes.string.isRequired, - }) - ).isRequired, }; state = { isMenuOpen: false, anchorEl: null, isProcessing: false }; diff --git a/src/legacy/components/TableLayout.component.js b/src/legacy/components/TableLayout.component.js deleted file mode 100644 index 842fb6a..0000000 --- a/src/legacy/components/TableLayout.component.js +++ /dev/null @@ -1,92 +0,0 @@ -import _ from "lodash"; -import PropTypes from "prop-types"; -import React from "react"; -import MultiSelect from "./MultiSelect.component"; -import snackActions from "../Snackbar/snack.actions"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; - -class TableLayout extends React.Component { - constructor(props, context) { - super(props, context); - this.getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); - this.initialSelected = props.selected; - } - - styles = { - wrapper: { - width: "inherit", - position: "relative", - }, - dialog: { - minWidth: "40%", - }, - body: { - marginBottom: 15, - }, - cancelButton: { - marginRight: 16, - }, - }; - - cancel = () => { - this.onChange(this.initialSelected); - this.props.onClose(); - }; - - onChange = selected => { - this.props.onChange(selected); - }; - - save = () => { - const { selected } = this.props; - - if (_(selected).isEmpty()) { - snackActions.show({ message: this.getTranslation("table_layout_at_least_one_column") }); - } else { - this.props.onSave(); - } - }; - - render() { - const { options, selected } = this.props; - const title = this.getTranslation("layout_settings"); - - return ( -
    - - - -
    - ); - } -} - -TableLayout.propTypes = { - selected: PropTypes.arrayOf(PropTypes.string).isRequired, - options: PropTypes.arrayOf(PropTypes.object).isRequired, - onChange: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, - onSave: PropTypes.func.isRequired, -}; - -TableLayout.contextTypes = { - d2: PropTypes.any, -}; - -export default TableLayout; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 3ee1a36..d357c20 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -193,6 +193,7 @@ export const UserListTable: React.FC = props => { pageSizeInitialValue: 25, }, searchBoxLabel: i18n.t("Search by name or username..."), + onReorderColumns: props.onChangeVisibleColumns, }; }, [props, enableReplicate, editUsers]); @@ -302,6 +303,7 @@ function isStateActionVisible(action: string) { export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; filters: ListFilters; + onChangeVisibleColumns: (columns: string[]) => void; } function buildEllipsizedList(items: NamedRef[], limit = 3) { diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index ee6fa90..52fddd1 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -16,7 +16,7 @@ export const Router: React.FC = React.memo(() => { path="/" element={ - + } /> diff --git a/yarn.lock b/yarn.lock index 49a7f98..e0f563a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2902,10 +2902,10 @@ react "^16.12.0" yargs "^14.0.0" -"@eyeseetea/d2-ui-components@2.6.9-beta.5": - version "2.6.9-beta.5" - resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.9-beta.5.tgz#540544cf1748f6084ae63fea0a5633498f57df79" - integrity sha512-u+iVmDdWajPFijBsOpx6pg6mkPXsl/NSEKl5PZQp9WHQYMxSJIfOckg3jc0fXOf9ziUjD2F5jFTNIcitS8M6FA== +"@eyeseetea/d2-ui-components@2.6.9-beta.8": + version "2.6.9-beta.8" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.9-beta.8.tgz#846069b17bb70f19ed4d5a36cec95c50682cb4fb" + integrity sha512-aNzcPos2aRV8faLjAg3CbdGBbFLublGCArNeXoLYo5rUDJadoqutpHpXraw0kz4WyIV0mMCTlclNkmSDWDyguw== dependencies: "@date-io/core" "1.3.6" "@date-io/moment" "1.0.2" From 076e847bf52eb12c9a80ff5995ae8e51f5cc3158 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 30 Nov 2021 08:22:51 +0100 Subject: [PATCH 106/192] Fix feedback tool Signed-off-by: Alexis Rico --- public/app-config/app-config-default.json | 27 ----------------------- public/app-config/app-config-nrc.json | 27 ----------------------- public/app-config/app-config-who.json | 27 ----------------------- public/app-config/app-config.example.json | 27 ----------------------- src/app-config.ts | 6 ++--- 5 files changed, 3 insertions(+), 111 deletions(-) delete mode 100644 public/app-config/app-config-default.json delete mode 100644 public/app-config/app-config-nrc.json delete mode 100644 public/app-config/app-config-who.json delete mode 100644 public/app-config/app-config.example.json diff --git a/public/app-config/app-config-default.json b/public/app-config/app-config-default.json deleted file mode 100644 index 951c24f..0000000 --- a/public/app-config/app-config-default.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appKey": "User-Extended-App", - "appearance": { - "header": { - "showTitle": true, - "styles": { - "background": "#276696" - } - }, - "showShareButton": true - }, - "feedback": { - "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], - "createIssue": true, - "sendToDhis2UserGroups": [], - "issues": { - "repository": "EyeSeeTea/user-extended-app-blessed", - "title": "[User feedback] {title}", - "body": "## dhis2\n\nUsername: {username}\n\n{body}" - }, - "snapshots": { - "repository": "EyeSeeTeaBotTest/snapshots", - "branch": "master" - }, - "feedbackOptions": {} - } -} diff --git a/public/app-config/app-config-nrc.json b/public/app-config/app-config-nrc.json deleted file mode 100644 index 6e69f04..0000000 --- a/public/app-config/app-config-nrc.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appKey": "User-Extended-App", - "appearance": { - "header": { - "showTitle": true, - "styles": { - "background": "#3c3c3c" - } - }, - "showShareButton": false - }, - "feedback": { - "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], - "createIssue": false, - "sendToDhis2UserGroups": ["GL_GlobalAdministrator", "GL_LocalindicatorAdmin"], - "issues": { - "repository": "EyeSeeTea/user-extended-app-blessed", - "title": "[User feedback] {title}", - "body": "## dhis2\n\nUsername: {username}\n\n{body}" - }, - "snapshots": { - "repository": "EyeSeeTeaBotTest/snapshots", - "branch": "master" - }, - "feedbackOptions": {} - } -} diff --git a/public/app-config/app-config-who.json b/public/app-config/app-config-who.json deleted file mode 100644 index dbcdd98..0000000 --- a/public/app-config/app-config-who.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appKey": "User-Extended-App", - "appearance": { - "header": { - "showTitle": true, - "styles": { - "background": "#276696" - } - }, - "showShareButton": false - }, - "feedback": { - "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], - "createIssue": true, - "sendToDhis2UserGroups": [], - "issues": { - "repository": "EyeSeeTea/user-extended-app-blessed", - "title": "[User feedback] {title}", - "body": "## dhis2\n\nUsername: {username}\n\n{body}" - }, - "snapshots": { - "repository": "EyeSeeTeaBotTest/snapshots", - "branch": "master" - }, - "feedbackOptions": {} - } -} diff --git a/public/app-config/app-config.example.json b/public/app-config/app-config.example.json deleted file mode 100644 index f2b226f..0000000 --- a/public/app-config/app-config.example.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "appKey": "User-Extended-App", - "appearance": { - "header": { - "showTitle": true, - "styles": { - "background": "#3c3c3c" - } - }, - "showShareButton": true - }, - "feedback": { - "token": ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], - "createIssue": true, - "sendToDhis2UserGroups": ["Administrators"], - "issues": { - "repository": "tokland/feedback-test", - "title": "[User feedback] {title}", - "body": "## dhis2\n\nUsername: {username}\n\n{body}" - }, - "snapshots": { - "repository": "EyeSeeTeaBotTest/snapshots", - "branch": "master" - }, - "feedbackOptions": {} - } -} diff --git a/src/app-config.ts b/src/app-config.ts index fc4c755..cefa8e0 100644 --- a/src/app-config.ts +++ b/src/app-config.ts @@ -1,14 +1,14 @@ export const appConfig: AppConfig = { appKey: "user-extended-app", appearance: { - showShareButton: true, + showShareButton: false, }, feedback: { token: ["03242fc6b0c5a48582", "2e6b8d3e8337b5a0b95fe2"], createIssue: true, - sendToDhis2UserGroups: ["Administrators"], + sendToDhis2UserGroups: [], issues: { - repository: "EyeSeeTea/user-extended-app", + repository: "EyeSeeTea/user-extended-app-blessed", title: "[User feedback] {title}", body: "## dhis2\n\nUsername: {username}\n\n{body}", }, From 5f248327df58330bbf6e913b2b04e2a494c97b92 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 30 Nov 2021 08:23:10 +0100 Subject: [PATCH 107/192] Increase import limit Signed-off-by: Alexis Rico --- src/legacy/List/List.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 701dd7d..4f66cfd 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -51,7 +51,7 @@ export class ListHybrid extends React.Component { d2: PropTypes.object.isRequired, }; - maxImportUsers = 200; + maxImportUsers = 500; styles = { dataTableWrap: { From 8ee5be0cd99617b9df3bc726acd8e69c56b9cc14 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 30 Nov 2021 08:23:43 +0100 Subject: [PATCH 108/192] Show loading spinner in multi assignment Signed-off-by: Alexis Rico --- .../BatchModelsMultiSelect.component.js | 93 +++++++++---------- 1 file changed, 43 insertions(+), 50 deletions(-) diff --git a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js index c85791f..6d6734f 100644 --- a/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js +++ b/src/legacy/components/batch-models-multi-select/BatchModelsMultiSelect.component.js @@ -98,38 +98,22 @@ export default class BatchModelsMultiSelectComponent extends React.Component { save = () => { const { parents, allChildren, selectedIds, updateStrategy } = this.state; + this.setState({ state: "loading" }); this.props.model .save(parents, allChildren, selectedIds, updateStrategy) .then(() => this.close(this.props.onSuccess)) .catch(() => this.close(this.props.onError)); }; + onChange(selectedIds) { this.setState({ selectedIds }); } - render = () => { - switch (this.state.state) { - case "loading": - return ( -
    - -
    - ); - case "error": - return
    {this.state.error}
    ; - case "ready": - return this.renderForm(); - default: - throw new Error(`Unknown state: ${this.state.state}`); - } - }; - onFilterTextChange(event) { this.setState({ filterText: event.target.value }); } - //eslint-disable-next-line - render = () => { + render() { const isLoading = this.state.state === "loading"; const { parents, allChildren, filterText, selectedIds } = this.state; const title = this.props.getTitle(parents, allChildren); @@ -138,39 +122,48 @@ export default class BatchModelsMultiSelectComponent extends React.Component { .map(obj => ({ value: obj.id, text: obj.name })) .value(); - return ( - - + switch (this.state.state) { + case "loading": + return ; + case "error": + return
    {this.state.error}
    ; + case "ready": + return ( + + - {this.renderStrategyToggle()} + {this.renderStrategyToggle()} -
    - -
    -
    - ); - }; +
    + +
    +
    + ); + default: + throw new Error(`Unknown state: ${this.state.state}`); + } + } } BatchModelsMultiSelectComponent.propTypes = { From 7f1d00228e024de16ac49d04d651c61bf9d30a0a Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 30 Nov 2021 08:23:52 +0100 Subject: [PATCH 109/192] Fix org unit root gathering Signed-off-by: Alexis Rico --- src/legacy/utils/dhis2Helpers.js | 33 ++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/legacy/utils/dhis2Helpers.js b/src/legacy/utils/dhis2Helpers.js index 5eee228..5d8612f 100644 --- a/src/legacy/utils/dhis2Helpers.js +++ b/src/legacy/utils/dhis2Helpers.js @@ -1,13 +1,34 @@ import _ from "lodash"; import _m from "./lodash-mixins"; +import { getInstance } from "d2/lib/d2"; -import appStateStore from "../App/appStateStore"; +const orgUnitListOptions = { + fields: ":all,shortName,displayName,path,children[id,shortName,displayName,path,children::isNotEmpty]", + paging: false, +}; + +async function getOrgUnitsRoots(disableCache = false) { + if (!disableCache && getOrgUnitsRoots.currentUserOrganisationUnits) { + return getOrgUnitsRoots.currentUserOrganisationUnits; + } + + const d2 = await getInstance(); + const organisationUnitsCollection = await d2.currentUser.getOrganisationUnits(orgUnitListOptions); + + if (d2.currentUser.authorities.has("ALL") && !organisationUnitsCollection.size) { + const rootLevelOrgUnits = await d2.models.organisationUnits.list({ + ...orgUnitListOptions, + level: 1, + }); + + getOrgUnitsRoots.currentUserOrganisationUnits = rootLevelOrgUnits.toArray(); + + return rootLevelOrgUnits; + } + + getOrgUnitsRoots.currentUserOrganisationUnits = organisationUnitsCollection.toArray(); -function getOrgUnitsRoots() { - return appStateStore - .map(appState => appState.userOrganisationUnits.toArray()) - .first() - .toPromise(); + return organisationUnitsCollection.toArray(); } async function mapPromise(inputValues, mapper) { From bbf99b5dfb65e905c394f5da88c2ebd0eac15011 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 30 Nov 2021 08:25:53 +0100 Subject: [PATCH 110/192] Bump version Signed-off-by: Alexis Rico --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f93268..0c2e717 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "user-extended-app", "description": "DHIS2 Extended User app", - "version": "1.0.0-alpha.2", + "version": "1.0.0-alpha.3", "license": "GPL-3.0", "author": "EyeSeeTea team", "homepage": ".", From 82f96374180862cd42af933fa9cb0b309f840180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 2 Dec 2021 01:25:29 +1300 Subject: [PATCH 111/192] swiched to ConfirmationDialog --- .../components/ImportTable.component.js | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index f58272f..34b485f 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -1,3 +1,4 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@material-ui/core"; import Validators from "d2-ui/lib/forms/Validators"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; @@ -5,7 +6,6 @@ import { generateUid } from "d2/lib/uid"; import { OrderedMap } from "immutable"; import _ from "lodash"; import Chip from "material-ui/Chip"; -import Dialog from "material-ui/Dialog/Dialog"; import FlatButton from "material-ui/FlatButton/FlatButton"; import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; @@ -682,26 +682,20 @@ class ImportTable extends React.Component { render() { const { onRequestClose } = this.props; - const { infoDialog, users, isLoading, existingUsernames, allowOverwrite, areUsersValid, isImporting } = - this.state; + const { infoDialog, isLoading, isImporting } = this.state; const { multipleSelector, orgUnitRoots } = this.state; - - const duplicatedUsernamesExist = this.getDuplicatedUsernamesExist(users, existingUsernames); - const showProcessButton = !users.isEmpty() && areUsersValid; - const actions = this.getActionsByState(allowOverwrite, duplicatedUsernamesExist, showProcessButton); const dialogTitle = this.renderDialogTitle(); return ( - {isImporting && } @@ -727,7 +721,7 @@ class ImportTable extends React.Component { response={infoDialog.response} /> )} - + ); } } From e6f723694eac86c2df5a39382546480858860a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 2 Dec 2021 21:02:54 +1300 Subject: [PATCH 112/192] replaced Dialog for ConfirmationDialog in MultipleSelector --- .../components/MultipleSelector.component.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/legacy/components/MultipleSelector.component.js b/src/legacy/components/MultipleSelector.component.js index 8a6e9a6..b415cb5 100644 --- a/src/legacy/components/MultipleSelector.component.js +++ b/src/legacy/components/MultipleSelector.component.js @@ -1,6 +1,6 @@ +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import React from "react"; import PropTypes from "prop-types"; -import Dialog from "material-ui/Dialog"; import FlatButton from "material-ui/FlatButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import OrgUnitForm from "./OrgUnitForm"; @@ -13,7 +13,6 @@ class MultipleSelector extends React.Component { super(props, context); this.getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); - this.dialogButtons = this.getDialogButtons(); this.state = { selected: props.selected, @@ -130,17 +129,18 @@ class MultipleSelector extends React.Component { const title = this.getTranslation(this.titleByField[field]); return ( - {this.renderForm()} - + ); } } From 724f1caa5fa909da5ee362cf67bc0359f9cc8c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Thu, 2 Dec 2021 21:13:16 +1300 Subject: [PATCH 113/192] removed unused code --- .../components/MultipleSelector.component.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/legacy/components/MultipleSelector.component.js b/src/legacy/components/MultipleSelector.component.js index b415cb5..ed3a529 100644 --- a/src/legacy/components/MultipleSelector.component.js +++ b/src/legacy/components/MultipleSelector.component.js @@ -1,8 +1,6 @@ import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import React from "react"; import PropTypes from "prop-types"; -import FlatButton from "material-ui/FlatButton"; -import RaisedButton from "material-ui/RaisedButton/RaisedButton"; import OrgUnitForm from "./OrgUnitForm"; import _ from "lodash"; @@ -54,20 +52,6 @@ class MultipleSelector extends React.Component { this.props.onClose(); }; - getDialogButtons = () => { - return ( - - - , - , - - ); - }; - titleByField = { userGroups: "assign_groups", userRoles: "assign_roles", From 049093ce92869ade642d03ca8836e990012bbcd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 3 Dec 2021 21:43:07 +1300 Subject: [PATCH 114/192] removed unused code --- .../components/ImportTable.component.js | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index 34b485f..8e95e92 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -6,7 +6,6 @@ import { generateUid } from "d2/lib/uid"; import { OrderedMap } from "immutable"; import _ from "lodash"; import Chip from "material-ui/Chip"; -import FlatButton from "material-ui/FlatButton/FlatButton"; import FontIcon from "material-ui/FontIcon"; import IconButton from "material-ui/IconButton"; import RaisedButton from "material-ui/RaisedButton/RaisedButton"; @@ -123,7 +122,6 @@ class ImportTable extends React.Component { (...args) => this.onUpdateFormStatus(userId, ...args) ); - this.getActionsByState = memoize(this.getActionsByState.bind(this)); this.getOnTextFieldClicked = memoize( (...args) => () => @@ -175,26 +173,6 @@ class ImportTable extends React.Component { }); }; - getActionsByState = (allowOverwrite, showOverwriteToggle, showProcessButton) => { - const { onRequestClose, actionText, templateUser } = this.props; - - return ( - - {showOverwriteToggle && !templateUser && ( - - )} - - - - ); - }; - getUser = userId => { const { users } = this.state; const user = users.get(userId); @@ -676,10 +654,6 @@ class ImportTable extends React.Component { ); }; - getDuplicatedUsernamesExist = (users, existingUsernames) => { - return users.valueSeq().some(user => existingUsernames.has(user.username)); - }; - render() { const { onRequestClose } = this.props; const { infoDialog, isLoading, isImporting } = this.state; From bcccbe38ced699e9c4f4ead5a1d09bec3ab1f94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Proa=C3=B1o=20Valencia?= Date: Fri, 3 Dec 2021 22:32:35 +1300 Subject: [PATCH 115/192] fixed missing toggle and disableSave functionality --- .../components/ImportTable.component.js | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index 8e95e92..8aceb0f 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -655,21 +655,31 @@ class ImportTable extends React.Component { }; render() { - const { onRequestClose } = this.props; - const { infoDialog, isLoading, isImporting } = this.state; - const { multipleSelector, orgUnitRoots } = this.state; - const dialogTitle = this.renderDialogTitle(); + const { onRequestClose, actionText, templateUser } = this.props; + const { + infoDialog, + users, + isLoading, + existingUsernames, + allowOverwrite, + areUsersValid, + isImporting, + multipleSelector, + orgUnitRoots, + } = this.state; + const showOverwriteToggle = users.valueSeq().some(user => existingUsernames.has(user.username)); return ( {isImporting && } @@ -695,6 +705,16 @@ class ImportTable extends React.Component { response={infoDialog.response} /> )} + + {showOverwriteToggle && !templateUser && ( + + )} ); } From d2b3206519e0415de6169879ccd87a30a33c7876 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 7 Dec 2021 10:38:57 +0100 Subject: [PATCH 116/192] Fix translations Signed-off-by: Alexis Rico --- i18n/en.pot | 28 +++++++++++++--- i18n/es.po | 28 +++++++++++++--- .../components/ImportTable.component.js | 2 +- src/legacy/components/InfoDialog.js | 9 ++--- .../ReplicateUserFromTable.component.js | 15 ++++----- .../ReplicateUserFromTemplate.component.js | 33 +++++++++---------- 6 files changed, 75 insertions(+), 40 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index e640784..19dfa31 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-11-29T09:22:31.420Z\n" -"PO-Revision-Date: 2021-11-29T09:22:31.420Z\n" +"POT-Creation-Date: 2021-12-07T09:36:35.426Z\n" +"PO-Revision-Date: 2021-12-07T09:36:35.426Z\n" msgid "Enable users" msgstr "" @@ -17,6 +17,27 @@ msgstr "" msgid "Remove users" msgstr "" +msgid "Copy to clipboard" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "User {{user}} replicated successfully {{n}} times" +msgstr "" + +msgid "Replicate {{user}}" +msgstr "" + +msgid "Replicate" +msgstr "" + +msgid "Value should be between {{min}} and {{max}}" +msgstr "" + +msgid "Username. Example for two users: admin.$index -> admin.1, admin.2" +msgstr "" + msgid "Replicate error" msgstr "" @@ -26,9 +47,6 @@ msgstr "" msgid "Columns to show in table" msgstr "" -msgid "Close" -msgstr "" - msgid "Column" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index b65e328..3ea1e14 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-11-29T09:22:31.420Z\n" +"POT-Creation-Date: 2021-12-07T09:36:35.426Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +17,29 @@ msgstr "" msgid "Remove users" msgstr "Eliminar usuarios" +msgid "Copy to clipboard" +msgstr "" + +msgid "Close" +msgstr "" + +msgid "User {{user}} replicated successfully {{n}} times" +msgstr "" + +#, fuzzy +msgid "Replicate {{user}}" +msgstr "Replicar error" + +#, fuzzy +msgid "Replicate" +msgstr "Replicar error" + +msgid "Value should be between {{min}} and {{max}}" +msgstr "" + +msgid "Username. Example for two users: admin.$index -> admin.1, admin.2" +msgstr "" + msgid "Replicate error" msgstr "Replicar error" @@ -26,9 +49,6 @@ msgstr "" msgid "Columns to show in table" msgstr "" -msgid "Close" -msgstr "" - msgid "Column" msgstr "" diff --git a/src/legacy/components/ImportTable.component.js b/src/legacy/components/ImportTable.component.js index 8aceb0f..6988bd8 100644 --- a/src/legacy/components/ImportTable.component.js +++ b/src/legacy/components/ImportTable.component.js @@ -677,7 +677,7 @@ class ImportTable extends React.Component { fullWidth={true} cancelText={this.t("close")} onCancel={onRequestClose} - saveText={this.t(actionText)} + saveText={actionText} onSave={this.onSave} disableSave={users.isEmpty() || !areUsersValid} > diff --git a/src/legacy/components/InfoDialog.js b/src/legacy/components/InfoDialog.js index 5dc4370..510ff80 100644 --- a/src/legacy/components/InfoDialog.js +++ b/src/legacy/components/InfoDialog.js @@ -2,6 +2,7 @@ import React from "react"; import _ from "lodash"; import PropTypes from "prop-types"; import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import i18n from "../../locales"; const styles = { contents: { @@ -13,9 +14,9 @@ function prettyJson(obj) { return obj ? JSON.stringify(obj, null, 2) : null; } -const InfoDialog = ({ t, title, onClose, response }) => { +const InfoDialog = ({ title, onClose, response }) => { const details = _([ - t("metadata_error_description"), + i18n.t("There was an error while posting metadata. Those are the details:"), response.error || "Unknown error", prettyJson(response.payload), prettyJson(response.response), @@ -33,8 +34,8 @@ const InfoDialog = ({ t, title, onClose, response }) => { onSave={() => { navigator.clipboard.writeText(details); }} - saveText={t("copy_to_clipboard")} - cancelText={t("close")} + saveText={i18n.t("Copy to clipboard")} + cancelText={i18n.t("Close")} >
    {details}
    diff --git a/src/legacy/components/ReplicateUserFromTable.component.js b/src/legacy/components/ReplicateUserFromTable.component.js index e3e7b6d..52a54d0 100644 --- a/src/legacy/components/ReplicateUserFromTable.component.js +++ b/src/legacy/components/ReplicateUserFromTable.component.js @@ -1,5 +1,6 @@ import PropTypes from "prop-types"; import React from "react"; +import i18n from "../../locales"; import LoadingMask from "../loading-mask/LoadingMask.component"; import User from "../models/user"; import snackActions from "../Snackbar/snack.actions"; @@ -16,14 +17,10 @@ class ReplicateUserFromTable extends React.Component { "dataViewOrganisationUnits", ]; - constructor(props, context) { + constructor(props) { super(props); - const { d2 } = context; - this.t = d2.i18n.getTranslation.bind(d2.i18n); - this.state = { - userToReplicate: null, - }; + this.state = { userToReplicate: null }; } componentDidMount = async () => { @@ -37,7 +34,7 @@ class ReplicateUserFromTable extends React.Component { const response = await userToReplicate.replicateFromPlainFields(users); if (response.success) { - const message = this.t("replicate_successful", { + const message = i18n.t("User {{user}} replicated successfully {{n}} times", { user: userToReplicate.displayName, n: users.length, }); @@ -51,7 +48,7 @@ class ReplicateUserFromTable extends React.Component { render() { const { onRequestClose } = this.props; const { userToReplicate } = this.state; - const title = this.t("replicate_user_title", { + const title = i18n.t("Replicate {{user}}", { user: userToReplicate ? `${userToReplicate.displayName} (${userToReplicate.username})` : "", }); @@ -63,7 +60,7 @@ class ReplicateUserFromTable extends React.Component { onSave={this.replicateUsers} maxUsers={100} templateUser={userToReplicate} - actionText={this.t("replicate")} + actionText={i18n.t("Replicate")} onRequestClose={onRequestClose} columns={this.columns} settings={this.props.settings} diff --git a/src/legacy/components/ReplicateUserFromTemplate.component.js b/src/legacy/components/ReplicateUserFromTemplate.component.js index 74f4ca3..c89c9d9 100644 --- a/src/legacy/components/ReplicateUserFromTemplate.component.js +++ b/src/legacy/components/ReplicateUserFromTemplate.component.js @@ -1,20 +1,19 @@ -import React from "react"; -import PropTypes from "prop-types"; -import _ from "lodash"; -import TextField from "material-ui/TextField/TextField"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import FormBuilder from "d2-ui/lib/forms/FormBuilder.component"; import Validators from "d2-ui/lib/forms/Validators"; import camelCaseToUnderscores from "d2-utilizr/lib/camelCaseToUnderscores"; - -import { toBuilderValidator, validateValues, validateUsername, validatePassword } from "../utils/validators"; +import _ from "lodash"; +import TextField from "material-ui/TextField/TextField"; +import PropTypes from "prop-types"; +import React from "react"; +import i18n from "../../locales"; +import LoadingMask from "../loading-mask/LoadingMask.component"; import User from "../models/user"; import { getExistingUsers } from "../models/userHelpers"; -import { getFromTemplate } from "../utils/template"; import snackActions from "../Snackbar/snack.actions"; +import { getFromTemplate } from "../utils/template"; +import { toBuilderValidator, validatePassword, validateUsername, validateValues } from "../utils/validators"; import InfoDialog from "./InfoDialog"; -import LoadingMask from "../loading-mask/LoadingMask.component"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; -import i18n from "../../locales"; class ReplicateUserFromTemplate extends React.Component { maxUsers = 100; @@ -77,7 +76,7 @@ class ReplicateUserFromTemplate extends React.Component { }, withinInterval: (min, max) => ({ validator: value => value && value >= min && value <= max, - message: this.getTranslation("validate_interval_error_message", { min, max }), + message: i18n.t("Value should be between {{min}} and {{max}}", { min, max }), }), isValidUsername: toBuilderValidator( usernameTemplate => { @@ -127,7 +126,7 @@ class ReplicateUserFromTemplate extends React.Component { const response = await userToReplicate.replicateFromTemplate(usersToCreate, username, password); if (response.success) { - const message = this.getTranslation("replicate_successful", { + const message = i18n.t("User {{user}} replicated successfully {{n}} times", { user: userToReplicate.displayName, n: usersToCreate, }); @@ -141,10 +140,9 @@ class ReplicateUserFromTemplate extends React.Component { render() { const { onRequestClose } = this.props; const { infoDialog, userToReplicate, usersToCreate, username, password, isValid, validate } = this.state; - const title = this.getTranslation("replicate_user_title", { + const title = i18n.t("Replicate {{user}}", { user: userToReplicate ? `${userToReplicate.displayName} (${userToReplicate.username})` : "", }); - const t = this.getTranslation; const fields = [ this.getTextField("usersToCreate", "number", usersToCreate, { @@ -152,7 +150,9 @@ class ReplicateUserFromTemplate extends React.Component { }), this.getTextField("username", "string", username, { validators: [this.validators.isValidUsername], - label: this.getTranslation("username_replicate_field"), + label: i18n.t("Username. Example for two users: admin.$index -> admin.1, admin.2", { + nsSeparator: false, + }), }), this.getTextField("password", "string", password, { validators: [this.validators.isValidPassword], @@ -166,7 +166,7 @@ class ReplicateUserFromTemplate extends React.Component { maxWidth={"md"} fullWidth={true} onSave={this.onSave} - saveText={t("replicate")} + saveText={i18n.t("Replicate")} onCancel={onRequestClose} disableSave={!isValid} > @@ -174,7 +174,6 @@ class ReplicateUserFromTemplate extends React.Component { {infoDialog ? ( Date: Tue, 7 Dec 2021 10:39:59 +0100 Subject: [PATCH 117/192] Update es translations Signed-off-by: Alexis Rico --- i18n/es.po | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/i18n/es.po b/i18n/es.po index 3ea1e14..7fdedb7 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -26,13 +26,11 @@ msgstr "" msgid "User {{user}} replicated successfully {{n}} times" msgstr "" -#, fuzzy msgid "Replicate {{user}}" -msgstr "Replicar error" +msgstr "Replicar {{user}}" -#, fuzzy msgid "Replicate" -msgstr "Replicar error" +msgstr "Replicar" msgid "Value should be between {{min}} and {{max}}" msgstr "" From 8b569849cc5b48b0bb8946fc377d6c17511e2c84 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 8 Dec 2021 22:46:28 +0100 Subject: [PATCH 118/192] Update d2-ui-components Signed-off-by: Alexis Rico --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0c2e717..8130229 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dhis2/d2-i18n-generate": "1.2.0", "@dhis2/ui": "7.8.1", "@eyeseetea/d2-api": "1.9.3", - "@eyeseetea/d2-ui-components": "2.6.9-beta.8", + "@eyeseetea/d2-ui-components": "2.6.9", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", "@types/react-virtualized-auto-sizer": "1.0.1", diff --git a/yarn.lock b/yarn.lock index e0f563a..1c01fa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2902,10 +2902,10 @@ react "^16.12.0" yargs "^14.0.0" -"@eyeseetea/d2-ui-components@2.6.9-beta.8": - version "2.6.9-beta.8" - resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.9-beta.8.tgz#846069b17bb70f19ed4d5a36cec95c50682cb4fb" - integrity sha512-aNzcPos2aRV8faLjAg3CbdGBbFLublGCArNeXoLYo5rUDJadoqutpHpXraw0kz4WyIV0mMCTlclNkmSDWDyguw== +"@eyeseetea/d2-ui-components@2.6.9": + version "2.6.9" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.9.tgz#a434999ed87a5e468f3f63399cf7b0194e602a73" + integrity sha512-hBB55R8cL8L0YLVlKx80tqBc9j17cJpfLiXg0//y7vbBRNgp5xjbcNh3/GwvXaqPncyEmt4SZMqJFUFCPQ3mcg== dependencies: "@date-io/core" "1.3.6" "@date-io/moment" "1.0.2" From 328803aecf396a50af548ef592bef390dbeb8df6 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 14 Dec 2021 11:07:13 +0100 Subject: [PATCH 119/192] Add storage example Signed-off-by: Alexis Rico --- .../clients/storage/DataStoreStorageClient.ts | 42 +++++++++ src/data/clients/storage/Namespaces.ts | 12 +++ src/data/clients/storage/StorageClient.ts | 90 +++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 src/data/clients/storage/DataStoreStorageClient.ts create mode 100644 src/data/clients/storage/Namespaces.ts create mode 100644 src/data/clients/storage/StorageClient.ts diff --git a/src/data/clients/storage/DataStoreStorageClient.ts b/src/data/clients/storage/DataStoreStorageClient.ts new file mode 100644 index 0000000..6c9bc04 --- /dev/null +++ b/src/data/clients/storage/DataStoreStorageClient.ts @@ -0,0 +1,42 @@ +import { D2Api, DataStore } from "../../../types/d2-api"; +import { getD2APiFromInstance } from "../../../utils/d2-api"; +import { Instance } from "../../entities/Instance"; +import { dataStoreNamespace } from "./Namespaces"; +import { StorageClient } from "./StorageClient"; + +export class DataStoreStorageClient extends StorageClient { + private api: D2Api; + private dataStore: DataStore; + + constructor(type: "user" | "global", instance: Instance) { + super(); + this.api = getD2APiFromInstance(instance); + this.dataStore = + type === "user" ? this.api.userDataStore(dataStoreNamespace) : this.api.dataStore(dataStoreNamespace); + } + + public async getObject(key: string): Promise { + const value = await this.dataStore.get(key).getData(); + return value; + } + + public async getOrCreateObject(key: string, defaultValue: T): Promise { + const value = await this.getObject(key); + if (!value) await this.saveObject(key, defaultValue); + return value ?? defaultValue; + } + + public async saveObject(key: string, value: T): Promise { + await this.dataStore.save(key, value).getData(); + } + + public async removeObject(key: string): Promise { + try { + await this.dataStore.delete(key).getData(); + } catch (error: any) { + if (!error.response || error.response.status !== 404) { + throw error; + } + } + } +} diff --git a/src/data/clients/storage/Namespaces.ts b/src/data/clients/storage/Namespaces.ts new file mode 100644 index 0000000..17e35e6 --- /dev/null +++ b/src/data/clients/storage/Namespaces.ts @@ -0,0 +1,12 @@ +export const dataStoreNamespace = "user-extended-app"; +export const constantPrefix = "User Extended App Storage"; + +export type Namespace = typeof Namespaces[keyof typeof Namespaces]; + +export const Namespaces = { + CONFIG: "config", +}; + +export const NamespaceProperties: Record = { + [Namespaces.CONFIG]: [], +}; diff --git a/src/data/clients/storage/StorageClient.ts b/src/data/clients/storage/StorageClient.ts new file mode 100644 index 0000000..ef23acd --- /dev/null +++ b/src/data/clients/storage/StorageClient.ts @@ -0,0 +1,90 @@ +import _ from "lodash"; +import { Ref } from "../../../domain/entities/Ref"; +import { Namespace, NamespaceProperties } from "./Namespaces"; + +export abstract class StorageClient { + // Object operations + public abstract getObject(key: string): Promise; + public abstract getOrCreateObject(key: string, defaultValue: T): Promise; + public abstract saveObject(key: string, value: T): Promise; + public abstract removeObject(key: string): Promise; + + public async listObjectsInCollection(key: string): Promise { + return (await this.getObject(key)) ?? []; + } + + public async getObjectInCollection(key: string, id: string): Promise { + const rawData = (await this.getObject(key)) ?? []; + const baseElement = _.find(rawData, element => element.id === id); + if (!baseElement) return undefined; + + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + const advancedElement = (await this.getObject(`${key}-${id}`)) ?? {}; + return { ...baseElement, ...advancedElement } as T; + } + + return baseElement; + } + + public async saveObjectsInCollection(key: Namespace, elements: T[]): Promise { + const oldData: Ref[] = (await this.getObject(key)) ?? []; + const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); + + // Save base elements directly into collection: model + const advancedProperties = NamespaceProperties[key] ?? []; + const baseElements = elements.map(element => _.omit(element, advancedProperties)); + + await this.saveObject(key, [...cleanData, ...baseElements]); + + // Save advanced properties to its own key: model-id + if (advancedProperties.length > 0) { + for (const element of elements) { + const advancedElement = _.pick(element, advancedProperties); + await this.saveObject(`${key}-${element.id}`, advancedElement); + } + } + } + + public async saveObjectInCollection(key: Namespace, element: T): Promise { + const advancedProperties = NamespaceProperties[key] ?? []; + const baseElement = _.omit(element, advancedProperties); + + const oldData: Ref[] = (await this.getObject(key)) ?? []; + const foundIndex = _.findIndex(oldData, item => item.id === element.id); + const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; + + // Save base element directly into collection: model + await this.saveObject(key, [...oldData.slice(0, arrayIndex), baseElement, ...oldData.slice(arrayIndex + 1)]); + + // Save advanced properties to its own key: model-id + if (advancedProperties.length > 0) { + const advancedElement = _.pick(element, advancedProperties); + await this.saveObject(`${key}-${element.id}`, advancedElement); + } + } + + public async removeObjectInCollection(key: string, id: string): Promise { + const oldData: Ref[] = (await this.getObject(key)) ?? []; + const newData = _.reject(oldData, { id }); + await this.saveObject(key, newData); + + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + await this.removeObject(`${key}-${id}`); + } + } + + public async removeObjectsInCollection(key: string, ids: string[]): Promise { + const oldData: Ref[] = (await this.getObject(key)) ?? []; + const newData = _.reject(oldData, ({ id }) => ids.includes(id)); + await this.saveObject(key, newData); + + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + for (const id of ids) { + await this.removeObject(`${key}-${id}`); + } + } + } +} From 565f3d92e6251937b8cc5e0c444ae2929ba44f9d Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Tue, 21 Dec 2021 12:16:31 +0100 Subject: [PATCH 120/192] [User-Extended] Storage client to futures --- .../clients/storage/DataStoreStorageClient.ts | 45 ++---- src/data/clients/storage/StorageClient.ts | 140 ++++++++---------- 2 files changed, 73 insertions(+), 112 deletions(-) diff --git a/src/data/clients/storage/DataStoreStorageClient.ts b/src/data/clients/storage/DataStoreStorageClient.ts index 6c9bc04..d602be4 100644 --- a/src/data/clients/storage/DataStoreStorageClient.ts +++ b/src/data/clients/storage/DataStoreStorageClient.ts @@ -1,42 +1,25 @@ +import { Future, FutureData } from "../../../domain/entities/Future"; import { D2Api, DataStore } from "../../../types/d2-api"; import { getD2APiFromInstance } from "../../../utils/d2-api"; +import { apiToFuture } from "../../../utils/futures"; import { Instance } from "../../entities/Instance"; import { dataStoreNamespace } from "./Namespaces"; import { StorageClient } from "./StorageClient"; export class DataStoreStorageClient extends StorageClient { - private api: D2Api; - private dataStore: DataStore; + private api:D2Api; + private dataStore:DataStore; - constructor(type: "user" | "global", instance: Instance) { + constructor(type:"user"|"global",instance:Instance){ super(); - this.api = getD2APiFromInstance(instance); - this.dataStore = - type === "user" ? this.api.userDataStore(dataStoreNamespace) : this.api.dataStore(dataStoreNamespace); - } + this.api=getD2APiFromInstance(instance); + this.dataStore=type==="user"?this.api.userDataStore(dataStoreNamespace):this.api.dataStore(dataStoreNamespace);} - public async getObject(key: string): Promise { - const value = await this.dataStore.get(key).getData(); - return value; - } - - public async getOrCreateObject(key: string, defaultValue: T): Promise { - const value = await this.getObject(key); - if (!value) await this.saveObject(key, defaultValue); - return value ?? defaultValue; - } - - public async saveObject(key: string, value: T): Promise { - await this.dataStore.save(key, value).getData(); - } - - public async removeObject(key: string): Promise { - try { - await this.dataStore.delete(key).getData(); - } catch (error: any) { - if (!error.response || error.response.status !== 404) { - throw error; - } - } - } + public getObject(key:string):FutureData{return apiToFuture(this.dataStore.get(key));} + public getOrCreateObject(key:string,defaultValue:T):FutureData { + return this.getObject(key).flatMap(value=>{ + if(!value) return this.saveObject(key,defaultValue).map(()=>defaultValue) + return Future.success(value)});} + public saveObject(key:string,value:T):FutureData {return apiToFuture(this.dataStore.save(key,value));} + public removeObject(key:string):FutureData {return apiToFuture(this.dataStore.delete(key)).map(()=>{});} } diff --git a/src/data/clients/storage/StorageClient.ts b/src/data/clients/storage/StorageClient.ts index ef23acd..be4802f 100644 --- a/src/data/clients/storage/StorageClient.ts +++ b/src/data/clients/storage/StorageClient.ts @@ -1,90 +1,68 @@ import _ from "lodash"; +import { Future, FutureData } from "../../../domain/entities/Future"; import { Ref } from "../../../domain/entities/Ref"; import { Namespace, NamespaceProperties } from "./Namespaces"; export abstract class StorageClient { - // Object operations - public abstract getObject(key: string): Promise; - public abstract getOrCreateObject(key: string, defaultValue: T): Promise; - public abstract saveObject(key: string, value: T): Promise; - public abstract removeObject(key: string): Promise; - - public async listObjectsInCollection(key: string): Promise { - return (await this.getObject(key)) ?? []; - } - - public async getObjectInCollection(key: string, id: string): Promise { - const rawData = (await this.getObject(key)) ?? []; - const baseElement = _.find(rawData, element => element.id === id); - if (!baseElement) return undefined; - - const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) { - const advancedElement = (await this.getObject(`${key}-${id}`)) ?? {}; - return { ...baseElement, ...advancedElement } as T; - } - - return baseElement; - } - - public async saveObjectsInCollection(key: Namespace, elements: T[]): Promise { - const oldData: Ref[] = (await this.getObject(key)) ?? []; - const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); - - // Save base elements directly into collection: model - const advancedProperties = NamespaceProperties[key] ?? []; - const baseElements = elements.map(element => _.omit(element, advancedProperties)); - - await this.saveObject(key, [...cleanData, ...baseElements]); - + // Object operations + public abstract getObject(key:string):FutureData; + public abstract getOrCreateObject(key:string,defaultValue:T):FutureData; + public abstract saveObject(key:string,value:T):FutureData; + public abstract removeObject(key:string):FutureData; + + public listObjectsInCollection(key:string):FutureData{ + return this.getObject(key).map(value=>value??[])} + + public getObjectInCollection(key:string,id:string):FutureData { + return this.getObject(key).map(value=>value??[]).flatMap(rawData=>{ + const baseElement=_.find(rawData,element=>element.id===id); + if (!baseElement) return Future.success(undefined); + const advancedProperties=NamespaceProperties[key]??[]; + if(advancedProperties.length>0) { + return this.getObject(`${key}-${id}`).map(value=>{ + if(!value) return baseElement; + return {...baseElement,...value} as T;})} + return Future.success(baseElement);});} + + public saveObjectsInCollection(key:Namespace,elements:T[]):FutureData { + const advancedProperties=NamespaceProperties[key]??[]; + const baseElements=elements.map(element=>_.omit(element,advancedProperties)); + return this.getObject(key).map(value=>(value??[])).map(oldData=>{ + const cleanData=oldData.filter(item=>!elements.some(element=>item.id===element.id)); + // Save base elements directly into collection: model + this.saveObject(key,[...cleanData,...baseElements]).map(()=>{ // Save advanced properties to its own key: model-id - if (advancedProperties.length > 0) { - for (const element of elements) { - const advancedElement = _.pick(element, advancedProperties); - await this.saveObject(`${key}-${element.id}`, advancedElement); - } - } - } - - public async saveObjectInCollection(key: Namespace, element: T): Promise { - const advancedProperties = NamespaceProperties[key] ?? []; - const baseElement = _.omit(element, advancedProperties); - - const oldData: Ref[] = (await this.getObject(key)) ?? []; - const foundIndex = _.findIndex(oldData, item => item.id === element.id); - const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; - - // Save base element directly into collection: model - await this.saveObject(key, [...oldData.slice(0, arrayIndex), baseElement, ...oldData.slice(arrayIndex + 1)]); - + if(advancedProperties.length>0){ + for(const element of elements){ + const advancedElement=_.pick(element,advancedProperties); + this.saveObject(`${key}-${element.id}`,advancedElement);}}});});} + + public saveObjectInCollection(key:Namespace,element:T):FutureData { + const advancedProperties=NamespaceProperties[key]??[]; + const baseElement=_.omit(element,advancedProperties); + return this.getObject(key).map(value=>(value??[])).map(oldData=>{ + const foundIndex=_.findIndex(oldData,item=>item.id===element.id); + const arrayIndex=foundIndex===-1?oldData.length:foundIndex; + // Save base element directly into collection: model + this.saveObject(key,[...oldData.slice(0,arrayIndex),baseElement,...oldData.slice(arrayIndex+1)]).map(()=>{ // Save advanced properties to its own key: model-id - if (advancedProperties.length > 0) { - const advancedElement = _.pick(element, advancedProperties); - await this.saveObject(`${key}-${element.id}`, advancedElement); - } - } - - public async removeObjectInCollection(key: string, id: string): Promise { - const oldData: Ref[] = (await this.getObject(key)) ?? []; - const newData = _.reject(oldData, { id }); - await this.saveObject(key, newData); - - const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) { - await this.removeObject(`${key}-${id}`); - } - } - - public async removeObjectsInCollection(key: string, ids: string[]): Promise { - const oldData: Ref[] = (await this.getObject(key)) ?? []; - const newData = _.reject(oldData, ({ id }) => ids.includes(id)); - await this.saveObject(key, newData); + if(advancedProperties.length>0) { + const advancedElement=_.pick(element,advancedProperties); + this.saveObject(`${key}-${element.id}`,advancedElement);}});});} + + public removeObjectInCollection(key:string,id:string):FutureData { + return this.getObject(key).map(value=>(value??[])).map(oldData=>{ + const newData=_.reject(oldData,{id}); + this.saveObject(key,newData).map(()=>{ + const advancedProperties=NamespaceProperties[key]??[]; + if(advancedProperties.length>0) this.removeObject(`${key}-${id}`);})});} + + public removeObjectsInCollection(key:string,ids:string[]):FutureData { + return this.getObject(key).map(value=>(value??[])).map(oldData=>{ + const newData=_.reject(oldData,({id})=>ids.includes(id)); + this.saveObject(key,newData).map(()=>{ + const advancedProperties=NamespaceProperties[key]??[]; + if(advancedProperties.length>0) + for(const id of ids) this.removeObject(`${key}-${id}`);})});} - const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) { - for (const id of ids) { - await this.removeObject(`${key}-${id}`); - } - } - } } From b4bc6edd35607af71732e35852eecb507a51a789 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Tue, 21 Dec 2021 13:01:11 +0100 Subject: [PATCH 121/192] Prettier --- .../clients/storage/DataStoreStorageClient.ts | 34 +++-- src/data/clients/storage/StorageClient.ts | 142 +++++++++++------- 2 files changed, 109 insertions(+), 67 deletions(-) diff --git a/src/data/clients/storage/DataStoreStorageClient.ts b/src/data/clients/storage/DataStoreStorageClient.ts index d602be4..1d7f001 100644 --- a/src/data/clients/storage/DataStoreStorageClient.ts +++ b/src/data/clients/storage/DataStoreStorageClient.ts @@ -7,19 +7,29 @@ import { dataStoreNamespace } from "./Namespaces"; import { StorageClient } from "./StorageClient"; export class DataStoreStorageClient extends StorageClient { - private api:D2Api; - private dataStore:DataStore; + private api: D2Api; + private dataStore: DataStore; - constructor(type:"user"|"global",instance:Instance){ + constructor(type: "user" | "global", instance: Instance) { super(); - this.api=getD2APiFromInstance(instance); - this.dataStore=type==="user"?this.api.userDataStore(dataStoreNamespace):this.api.dataStore(dataStoreNamespace);} + this.api = getD2APiFromInstance(instance); + this.dataStore = + type === "user" ? this.api.userDataStore(dataStoreNamespace) : this.api.dataStore(dataStoreNamespace); + } - public getObject(key:string):FutureData{return apiToFuture(this.dataStore.get(key));} - public getOrCreateObject(key:string,defaultValue:T):FutureData { - return this.getObject(key).flatMap(value=>{ - if(!value) return this.saveObject(key,defaultValue).map(()=>defaultValue) - return Future.success(value)});} - public saveObject(key:string,value:T):FutureData {return apiToFuture(this.dataStore.save(key,value));} - public removeObject(key:string):FutureData {return apiToFuture(this.dataStore.delete(key)).map(()=>{});} + public getObject(key: string): FutureData { + return apiToFuture(this.dataStore.get(key)); + } + public getOrCreateObject(key: string, defaultValue: T): FutureData { + return this.getObject(key).flatMap(value => { + if (!value) return this.saveObject(key, defaultValue).map(() => defaultValue); + return Future.success(value); + }); + } + public saveObject(key: string, value: T): FutureData { + return apiToFuture(this.dataStore.save(key, value)); + } + public removeObject(key: string): FutureData { + return apiToFuture(this.dataStore.delete(key)).map(() => {}); + } } diff --git a/src/data/clients/storage/StorageClient.ts b/src/data/clients/storage/StorageClient.ts index be4802f..e2b05d3 100644 --- a/src/data/clients/storage/StorageClient.ts +++ b/src/data/clients/storage/StorageClient.ts @@ -4,65 +4,97 @@ import { Ref } from "../../../domain/entities/Ref"; import { Namespace, NamespaceProperties } from "./Namespaces"; export abstract class StorageClient { - // Object operations - public abstract getObject(key:string):FutureData; - public abstract getOrCreateObject(key:string,defaultValue:T):FutureData; - public abstract saveObject(key:string,value:T):FutureData; - public abstract removeObject(key:string):FutureData; + // Object operations + public abstract getObject(key: string): FutureData; + public abstract getOrCreateObject(key: string, defaultValue: T): FutureData; + public abstract saveObject(key: string, value: T): FutureData; + public abstract removeObject(key: string): FutureData; - public listObjectsInCollection(key:string):FutureData{ - return this.getObject(key).map(value=>value??[])} + public listObjectsInCollection(key: string): FutureData { + return this.getObject(key).map(value => value ?? []); + } - public getObjectInCollection(key:string,id:string):FutureData { - return this.getObject(key).map(value=>value??[]).flatMap(rawData=>{ - const baseElement=_.find(rawData,element=>element.id===id); - if (!baseElement) return Future.success(undefined); - const advancedProperties=NamespaceProperties[key]??[]; - if(advancedProperties.length>0) { - return this.getObject(`${key}-${id}`).map(value=>{ - if(!value) return baseElement; - return {...baseElement,...value} as T;})} - return Future.success(baseElement);});} + public getObjectInCollection(key: string, id: string): FutureData { + return this.getObject(key) + .map(value => value ?? []) + .flatMap(rawData => { + const baseElement = _.find(rawData, element => element.id === id); + if (!baseElement) return Future.success(undefined); + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + return this.getObject(`${key}-${id}`).map(value => { + if (!value) return baseElement; + return { ...baseElement, ...value } as T; + }); + } + return Future.success(baseElement); + }); + } - public saveObjectsInCollection(key:Namespace,elements:T[]):FutureData { - const advancedProperties=NamespaceProperties[key]??[]; - const baseElements=elements.map(element=>_.omit(element,advancedProperties)); - return this.getObject(key).map(value=>(value??[])).map(oldData=>{ - const cleanData=oldData.filter(item=>!elements.some(element=>item.id===element.id)); - // Save base elements directly into collection: model - this.saveObject(key,[...cleanData,...baseElements]).map(()=>{ - // Save advanced properties to its own key: model-id - if(advancedProperties.length>0){ - for(const element of elements){ - const advancedElement=_.pick(element,advancedProperties); - this.saveObject(`${key}-${element.id}`,advancedElement);}}});});} + public saveObjectsInCollection(key: Namespace, elements: T[]): FutureData { + const advancedProperties = NamespaceProperties[key] ?? []; + const baseElements = elements.map(element => _.omit(element, advancedProperties)); + return this.getObject(key) + .map(value => (value ?? [])) + .map(oldData => { + const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); + // Save base elements directly into collection: model + this.saveObject(key, [...cleanData, ...baseElements]).map(() => { + // Save advanced properties to its own key: model-id + if (advancedProperties.length > 0) { + for (const element of elements) { + const advancedElement = _.pick(element, advancedProperties); + this.saveObject(`${key}-${element.id}`, advancedElement); + } + } + }); + }); + } - public saveObjectInCollection(key:Namespace,element:T):FutureData { - const advancedProperties=NamespaceProperties[key]??[]; - const baseElement=_.omit(element,advancedProperties); - return this.getObject(key).map(value=>(value??[])).map(oldData=>{ - const foundIndex=_.findIndex(oldData,item=>item.id===element.id); - const arrayIndex=foundIndex===-1?oldData.length:foundIndex; - // Save base element directly into collection: model - this.saveObject(key,[...oldData.slice(0,arrayIndex),baseElement,...oldData.slice(arrayIndex+1)]).map(()=>{ - // Save advanced properties to its own key: model-id - if(advancedProperties.length>0) { - const advancedElement=_.pick(element,advancedProperties); - this.saveObject(`${key}-${element.id}`,advancedElement);}});});} + public saveObjectInCollection(key: Namespace, element: T): FutureData { + const advancedProperties = NamespaceProperties[key] ?? []; + const baseElement = _.omit(element, advancedProperties); + return this.getObject(key) + .map(value => (value ?? [])) + .map(oldData => { + const foundIndex = _.findIndex(oldData, item => item.id === element.id); + const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; + // Save base element directly into collection: model + this.saveObject(key, [ + ...oldData.slice(0, arrayIndex), + baseElement, + ...oldData.slice(arrayIndex + 1), + ]).map(() => { + // Save advanced properties to its own key: model-id + if (advancedProperties.length > 0) { + const advancedElement = _.pick(element, advancedProperties); + this.saveObject(`${key}-${element.id}`, advancedElement); + } + }); + }); + } - public removeObjectInCollection(key:string,id:string):FutureData { - return this.getObject(key).map(value=>(value??[])).map(oldData=>{ - const newData=_.reject(oldData,{id}); - this.saveObject(key,newData).map(()=>{ - const advancedProperties=NamespaceProperties[key]??[]; - if(advancedProperties.length>0) this.removeObject(`${key}-${id}`);})});} - - public removeObjectsInCollection(key:string,ids:string[]):FutureData { - return this.getObject(key).map(value=>(value??[])).map(oldData=>{ - const newData=_.reject(oldData,({id})=>ids.includes(id)); - this.saveObject(key,newData).map(()=>{ - const advancedProperties=NamespaceProperties[key]??[]; - if(advancedProperties.length>0) - for(const id of ids) this.removeObject(`${key}-${id}`);})});} + public removeObjectInCollection(key: string, id: string): FutureData { + return this.getObject(key) + .map(value => (value ?? [])) + .map(oldData => { + const newData = _.reject(oldData, { id }); + this.saveObject(key, newData).map(() => { + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) this.removeObject(`${key}-${id}`); + }); + }); + } + public removeObjectsInCollection(key: string, ids: string[]): FutureData { + return this.getObject(key) + .map(value => (value ?? [])) + .map(oldData => { + const newData = _.reject(oldData, ({ id }) => ids.includes(id)); + this.saveObject(key, newData).map(() => { + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) for (const id of ids) this.removeObject(`${key}-${id}`); + }); + }); + } } From efd499881ea71bc26c370dd7e31425fea589cd64 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Thu, 23 Dec 2021 13:16:21 +0100 Subject: [PATCH 122/192] Fix warnings lint --- .../clients/storage/DataStoreStorageClient.ts | 5 +++- src/data/clients/storage/StorageClient.ts | 28 +++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/data/clients/storage/DataStoreStorageClient.ts b/src/data/clients/storage/DataStoreStorageClient.ts index 1d7f001..7e770ac 100644 --- a/src/data/clients/storage/DataStoreStorageClient.ts +++ b/src/data/clients/storage/DataStoreStorageClient.ts @@ -20,16 +20,19 @@ export class DataStoreStorageClient extends StorageClient { public getObject(key: string): FutureData { return apiToFuture(this.dataStore.get(key)); } + public getOrCreateObject(key: string, defaultValue: T): FutureData { return this.getObject(key).flatMap(value => { if (!value) return this.saveObject(key, defaultValue).map(() => defaultValue); return Future.success(value); }); } + public saveObject(key: string, value: T): FutureData { return apiToFuture(this.dataStore.save(key, value)); } + public removeObject(key: string): FutureData { - return apiToFuture(this.dataStore.delete(key)).map(() => {}); + return apiToFuture(this.dataStore.delete(key)).map(() => undefined); } } diff --git a/src/data/clients/storage/StorageClient.ts b/src/data/clients/storage/StorageClient.ts index e2b05d3..560e27a 100644 --- a/src/data/clients/storage/StorageClient.ts +++ b/src/data/clients/storage/StorageClient.ts @@ -35,11 +35,11 @@ export abstract class StorageClient { const advancedProperties = NamespaceProperties[key] ?? []; const baseElements = elements.map(element => _.omit(element, advancedProperties)); return this.getObject(key) - .map(value => (value ?? [])) - .map(oldData => { + .map(value => value ?? []) + .flatMap((oldData: Ref[]) => { const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); // Save base elements directly into collection: model - this.saveObject(key, [...cleanData, ...baseElements]).map(() => { + return this.saveObject(key, [...cleanData, ...baseElements]).map(() => { // Save advanced properties to its own key: model-id if (advancedProperties.length > 0) { for (const element of elements) { @@ -47,6 +47,7 @@ export abstract class StorageClient { this.saveObject(`${key}-${element.id}`, advancedElement); } } + return undefined; }); }); } @@ -55,12 +56,12 @@ export abstract class StorageClient { const advancedProperties = NamespaceProperties[key] ?? []; const baseElement = _.omit(element, advancedProperties); return this.getObject(key) - .map(value => (value ?? [])) - .map(oldData => { + .map(value => value ?? []) + .flatMap((oldData: Ref[]) => { const foundIndex = _.findIndex(oldData, item => item.id === element.id); const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; // Save base element directly into collection: model - this.saveObject(key, [ + return this.saveObject(key, [ ...oldData.slice(0, arrayIndex), baseElement, ...oldData.slice(arrayIndex + 1), @@ -70,30 +71,33 @@ export abstract class StorageClient { const advancedElement = _.pick(element, advancedProperties); this.saveObject(`${key}-${element.id}`, advancedElement); } + return undefined; }); }); } public removeObjectInCollection(key: string, id: string): FutureData { return this.getObject(key) - .map(value => (value ?? [])) - .map(oldData => { + .map(value => (value ?? []) as Ref[]) + .flatMap(oldData => { const newData = _.reject(oldData, { id }); - this.saveObject(key, newData).map(() => { + return this.saveObject(key, newData).map(() => { const advancedProperties = NamespaceProperties[key] ?? []; if (advancedProperties.length > 0) this.removeObject(`${key}-${id}`); + return undefined; }); }); } public removeObjectsInCollection(key: string, ids: string[]): FutureData { return this.getObject(key) - .map(value => (value ?? [])) - .map(oldData => { + .map(value => value ?? []) + .flatMap(oldData => { const newData = _.reject(oldData, ({ id }) => ids.includes(id)); - this.saveObject(key, newData).map(() => { + return this.saveObject(key, newData).map(() => { const advancedProperties = NamespaceProperties[key] ?? []; if (advancedProperties.length > 0) for (const id of ids) this.removeObject(`${key}-${id}`); + return undefined; }); }); } From 02e160ce898884143797db3c80885548b0e4304d Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Tue, 18 Jan 2022 11:57:40 +0100 Subject: [PATCH 123/192] Created UserRolesSelector component and added GetUsersByIdUseCase --- src/CompositionRoot.ts | 2 + src/data/repositories/UserD2ApiRepository.ts | 6 ++ src/domain/repositories/UserRepository.ts | 1 + src/domain/usecases/GetUsersByIdUseCase.ts | 12 ++++ src/legacy/List/List.component.js | 31 ++++++--- .../UserGroupsSelector.tsx | 37 +++++++++++ .../user-roles-selector/UserRolesSelector.tsx | 63 +++++++++++++++++++ 7 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 src/domain/usecases/GetUsersByIdUseCase.ts create mode 100644 src/webapp/components/user-groups-selector/UserGroupsSelector.tsx create mode 100644 src/webapp/components/user-roles-selector/UserRolesSelector.tsx diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 591af64..3f746f5 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -5,6 +5,7 @@ import { UserD2ApiRepository } from "./data/repositories/UserD2ApiRepository"; import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; +import { GetUsersByIdUseCase } from "./domain/usecases/GetUsersByIdUseCase"; import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; @@ -24,6 +25,7 @@ export function getCompositionRoot(instance: Instance) { list: new ListUsersUseCase(userRepository), listAllIds: new ListAllUserIdsUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), + getAll: new GetUsersByIdUseCase(userRepository), save: new SaveUsersUseCase(userRepository), }), metadata: getExecute({ diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index d489ffa..747a104 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -65,6 +65,12 @@ export class UserD2ApiRepository implements UserRepository { }); } + public getByIds(ids: string[]): FutureData { + return apiToFuture(this.api.models.users.get({ fields, filter: { id: { in: ids } } })).flatMap(({ objects }) => { + return Future.success(objects.map(user=>this.toDomainUser(user))); + }); + } + private getFullUsers(options: ListOptions): FutureData { const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 1d36b98..efe98ae 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -8,6 +8,7 @@ export interface UserRepository { list(options: ListOptions): FutureData>; listAllIds(options: ListOptions): FutureData; getById(id: string): FutureData; + getByIds(ids: string[]): FutureData; save(users: User[]): FutureData; } diff --git a/src/domain/usecases/GetUsersByIdUseCase.ts b/src/domain/usecases/GetUsersByIdUseCase.ts new file mode 100644 index 0000000..d391453 --- /dev/null +++ b/src/domain/usecases/GetUsersByIdUseCase.ts @@ -0,0 +1,12 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { User } from "../entities/User"; +import { UserRepository } from "../repositories/UserRepository"; + +export class GetUsersByIdUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute(ids: string[]): FutureData { + return this.userRepository.getByIds(ids); + } +} diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index beefae5..fe40950 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -8,6 +8,7 @@ import PropTypes from "prop-types"; import React from "react"; import i18n from "../../locales"; import { UserListTable } from "../../webapp/components/user-list-table/UserListTable"; +import { UserRolesSelector } from "../../webapp/components/user-roles-selector/UserRolesSelector"; import CopyInUserDialog from "../components/CopyInUserDialog.component"; import ImportExport from "../components/ImportExport.component"; import ImportTable from "../components/ImportTable.component"; @@ -417,13 +418,34 @@ export class ListHybrid extends React.Component { /> ) : null} - {assignUserRoles.open ? ( + {/*{assignUserRoles.open ? ( userRolesAssignmentDialogStore.setState({ open: false })} /> ) : null} + {assignUserGroups.open ? ( + userGroupsAssignmentDialogStore.setState({ open: false })} + /> + ) : null}*/} + + {assignUserRoles.open ? ( + userRolesAssignmentDialogStore.setState({ open: false })} + /> + ) : null} + + {assignUserGroups.open ? ( + userGroupsAssignmentDialogStore.setState({ open: false })} + /> + ) : null} + {copyUsers.open ? ( ) : null} - {assignUserGroups.open ? ( - userGroupsAssignmentDialogStore.setState({ open: false })} - /> - ) : null} - {settingsVisible && } {replicateUser.open ? this.getReplicateDialog(replicateUser) : null} diff --git a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx new file mode 100644 index 0000000..8118395 --- /dev/null +++ b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx @@ -0,0 +1,37 @@ +import { Transfer, TransferProps } from "@dhis2/ui"; +import { useState } from "react"; + +interface UserRolesSelectorProps { + +} + +export const UserRolesSelector = ({ ...args }: UserRolesSelectorProps) => { + const [selected, setSelected] = useState(["username","firstName","surname","email","dataViewOrganisationUnits","lastLogin","disabled","created"]); + const onChange = (payload:{ selected: string[] }) => setSelected(payload.selected) + + return +}; diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx new file mode 100644 index 0000000..bae2b44 --- /dev/null +++ b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx @@ -0,0 +1,63 @@ +import { Transfer } from "@dhis2/ui"; +import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; +import { useState } from "react"; +import { Future } from "../../../domain/entities/Future"; +import { User } from "../../../domain/entities/User"; +import i18n from "../../../locales"; +import { useAppContext } from "../../contexts/app-context"; + +export interface UserRolesSelectorProps { + users:User[]; + onCancel:()=>void; +} + +export const UserRolesSelector: React.FC = props => { + const { compositionRoot } = useAppContext(); + const [selected, setSelected] = useState(["username","firstName","surname","email","dataViewOrganisationUnits","lastLogin","disabled","created"]); + + console.log(compositionRoot.users.getCurrent()); + + const onChange = (payload:{ selected: string[] }) => setSelected(payload.selected) + const userRoles=[ + {label: "Username", value: "username"}, + {label: "First name", value: "firstName"}, + {label: "Surname", value: "surname"}, + {label: "Email", value: "email"}, + {label: "Open ID", value: "openId"}, + {label: "Created", value: "created"}, + {label: "Last updated", value: "lastUpdated"}, + {label: "API URL", value: "apiUrl"}, + {label: "Roles", value: "userRoles"}, + {label: "Groups", value: "userGroups"}, + {label: "Organisation units", value: "organisationUnits"}, + {label: "Data view organisation units", value: "dataViewOrganisationUnits"}, + {label: "Last login", value: "lastLogin"}, + {label: "Disabled", value: "disabled"}]; + + return ( + {/*todo*/}} + > + + )}; + + const getPayload=():void=>{} + + const getTitle=(users:User[]):string=>{ + const usernames = users && users.map(user => user.username); + return i18n.t("Assign roles") + users[0]?.username; + } From 5080aa406bc5194853655a788b63b1057af34081 Mon Sep 17 00:00:00 2001 From: idelcano Date: Tue, 1 Feb 2022 10:59:51 +0100 Subject: [PATCH 124/192] udate favicon --- public/favicon.ico | Bin 4286 -> 4286 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 1712927cdd231c01c91bfc06f8052078a7c2f320..ca3f04a9c0c54c3684931f4f2d0bc6e13549d5c0 100644 GIT binary patch literal 4286 zcmbu@duWzb9Ki8sd#BS}xc0}I)oe!ABBZF)q-jR1yImmbk8Y9|D2NqNf~~cx1k~N-{hId7iQc-a7#2!!eUkjscPLl^$SX0)Oiw_`g({9mZI z;dCs-kN6Xv7>j`e4RFUXn1~+`;`~m18}>wP;offAwqi$gZzJ{NFhG=j&GyNp`<2zF zQf@(rG1PJsV<%^GIlp<6#@QD+32}#U?<}~tbKx0!u76;taYKLiX&Gi<9@;Ps=2h_# ztm7!W3&-}rGxZF^T>D!(M>lq6bD0xIpfvsj+SX=$_BYmG#;qYnV?XhIZ|;J*?mR!k z^Xtv72Qznneay%3uDBO>U<8Wmx8gPCU>7{|JFyi1_YB@(j&}GQp6eAT#-?6@gW-4P zRk(&O`0if?$Mm3`bL60N>9Z#B;=T&-fk8hwCUlX2-3@)ffx=I%W(y;F+I<8{j_rocAMr4=GQ;diV@2D8`N}wxb%4qBQ<}w8i^2 zoaV%z)q42jM=L z8=oWO*aYgX$9CWKTam_!pCM}-Mfn6uV~1;Fq~8`w_whN@!8yHlZN6Ww^F=hlXY_j$ z=6IaCapLe{?G3bl9Q6%jLg~AD2rBUajO*S$4ELZNy|BMI^FF@MuEQK3a6KOV#dog? zCH=!VOW$kb_$_}5*J3j6fzPo5p})`ZDQ3eQ`3mOdZ!nMlaR%A7bDJk&j?&V1`EYm! zkKslf4|9DUeE;3+wdlav@Lj2e&-n_R)8{-C#XYc&(Rdc6al^H_;n_LoVmyQ~SPFB_ zeycGB_A3hks5}20n1@<`G?(l{Jvfv47YH#!`5A4eMg9D4uEIntg1PP5oj0AUB(`UE zH^TR66ZOkbfwZe7hQqmE!Un8|zmv|uFofr;1ZO(LHCB8wt-#>9}zJ~eSo3!3v z+_)|4=h-@Ei0|CL!aWUbuF<;XcI?cqZQF)Z5Kld*x?@m}PB^!}U0mx0Sb}bZXV^jg zUbwf5Va_;a4H_}1m~kh^!2R;P7vggG{juHLH#b6j-}A%ZJ@ev1w4oX1M?CeA>W+o) zn`O*>D8MtGi{jZ*FOK=IV12tz?du&;-PW5Vsh%Wh$tOuJR!EXc=PBpE6OiPTFHe?q rSCy%`;lKTJ2P_r~hDLvbYG=ce)pGb> zJ&sU?6ymxv7&w{tu#MGehR7jyCoXMDF4AFNkqqs!_uXG{JrudXsG;1cDg}$u;;*=0X@|+>diJvgXWY9U#horK6 zE8A1dM^IWk7DWZ4tM><8x~ftEQ9>YggmOqHpi*QoLE7Xtb?C7&Er!+*BuM}#+>iFc z>f31l(1rl+eE9p!MWWCTqPVpf`qgh!gK40>+lcs*T)0FATKQ=uGUS|1fuA=)dj_e| z-1nU+>aY3KeScr4K|qy7yZsmqanNsO1eI#%w<@#0jqO6c^u@gdgwrH^mI zDTD);Z3|HUs*W`-1^V3i39h__n75gr-95q$Mi!rqnW|&hkmw6v!5VOd-Ut$LAypn> zWe@rWe`3X6XDo>!uvEaITdKcY=tMpbOb*v@w@GPbQrz)gRFm&;{)_j|aNtTb)`{F{ z_AY(htm0na~9{7zsmpJ_~?lVOjXhuGq9>@SPLKGja}j7T&$O3fIO4gu-W=uHXCbo1atEL0c?-|0A`lQ`~Uy| From 984b93f3163157eb0892af641ce99317a5d08bab Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Thu, 3 Feb 2022 23:40:56 +0100 Subject: [PATCH 125/192] Show roles and corresponding title --- src/CompositionRoot.ts | 2 +- src/data/repositories/UserD2ApiRepository.ts | 8 +- src/legacy/List/List.component.js | 2 +- .../user-roles-selector/UserRolesSelector.tsx | 137 ++++++++++-------- src/webapp/utils/list.ts | 8 + 5 files changed, 89 insertions(+), 68 deletions(-) create mode 100644 src/webapp/utils/list.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 3f746f5..f51166f 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -25,7 +25,7 @@ export function getCompositionRoot(instance: Instance) { list: new ListUsersUseCase(userRepository), listAllIds: new ListAllUserIdsUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), - getAll: new GetUsersByIdUseCase(userRepository), + getMany: new GetUsersByIdUseCase(userRepository), save: new SaveUsersUseCase(userRepository), }), metadata: getExecute({ diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 747a104..456d24d 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -66,9 +66,11 @@ export class UserD2ApiRepository implements UserRepository { } public getByIds(ids: string[]): FutureData { - return apiToFuture(this.api.models.users.get({ fields, filter: { id: { in: ids } } })).flatMap(({ objects }) => { - return Future.success(objects.map(user=>this.toDomainUser(user))); - }); + return apiToFuture(this.api.models.users.get({ fields, filter: { id: { in: ids } } })).flatMap( + ({ objects }) => { + return Future.success(objects.map(user => this.toDomainUser(user))); + } + ); } private getFullUsers(options: ListOptions): FutureData { diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index fe40950..086860f 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -434,7 +434,7 @@ export class ListHybrid extends React.Component { {assignUserRoles.open ? ( userRolesAssignmentDialogStore.setState({ open: false })} /> ) : null} diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx index bae2b44..8f7b83c 100644 --- a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx +++ b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx @@ -1,63 +1,74 @@ -import { Transfer } from "@dhis2/ui"; -import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; -import { useState } from "react"; -import { Future } from "../../../domain/entities/Future"; -import { User } from "../../../domain/entities/User"; -import i18n from "../../../locales"; -import { useAppContext } from "../../contexts/app-context"; - -export interface UserRolesSelectorProps { - users:User[]; - onCancel:()=>void; -} - -export const UserRolesSelector: React.FC = props => { - const { compositionRoot } = useAppContext(); - const [selected, setSelected] = useState(["username","firstName","surname","email","dataViewOrganisationUnits","lastLogin","disabled","created"]); - - console.log(compositionRoot.users.getCurrent()); - - const onChange = (payload:{ selected: string[] }) => setSelected(payload.selected) - const userRoles=[ - {label: "Username", value: "username"}, - {label: "First name", value: "firstName"}, - {label: "Surname", value: "surname"}, - {label: "Email", value: "email"}, - {label: "Open ID", value: "openId"}, - {label: "Created", value: "created"}, - {label: "Last updated", value: "lastUpdated"}, - {label: "API URL", value: "apiUrl"}, - {label: "Roles", value: "userRoles"}, - {label: "Groups", value: "userGroups"}, - {label: "Organisation units", value: "organisationUnits"}, - {label: "Data view organisation units", value: "dataViewOrganisationUnits"}, - {label: "Last login", value: "lastLogin"}, - {label: "Disabled", value: "disabled"}]; - - return ( - {/*todo*/}} - > - - )}; - - const getPayload=():void=>{} - - const getTitle=(users:User[]):string=>{ - const usernames = users && users.map(user => user.username); - return i18n.t("Assign roles") + users[0]?.username; - } +import { Transfer, TransferOption } from "@dhis2/ui"; +import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; +import _, { intersection } from "lodash"; +import { useState, useEffect } from "react"; +import { NamedRef } from "../../../domain/entities/Ref"; +import { User } from "../../../domain/entities/User"; +import i18n from "../../../locales"; +import { useAppContext } from "../../contexts/app-context"; +import { ellipsizedList } from "../../utils/list"; + +export interface UserRolesSelectorProps { + ids: string[]; + onCancel: () => void; +} + +export const UserRolesSelector: React.FC = props => { + const snackbar = useSnackbar(); + const { compositionRoot } = useAppContext(); + const [users, setUsers] = useState([] as User[]); + const [userRoles, setUserRoles] = useState([] as TransferOption[]); + const [selectedRoles, setSelectedRoles] = useState([""]); + const { ids } = props; + useEffect(() => { + compositionRoot.metadata + .list("userRoles") + .map(({ objects }) => buildTransferOptions(objects)) + .run( + roles => setUserRoles(roles), + error => snackbar.error(error) + ); + compositionRoot.users.getMany(ids).run( + users => { + setUsers(users); + setSelectedRoles(_.intersection(...users.map(user => user.userRoles.map(({ id }) => id)))); + }, + error => snackbar.error(error) + ); + }, [ids]); + + const onChange = (payload: { selected: string[] }) => setSelectedRoles(payload.selected); + + return ( + { + //todo + }} + > + + + ); +}; + +const getTitle = (users: User[]): string => { + const usernames = users && users.map(user => user.username); + return i18n.t("Assign roles: ") + (usernames ? ellipsizedList(usernames) : "..."); +}; + +const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + return options.map(({ id, name }) => ({ value: id, label: name })); +}; diff --git a/src/webapp/utils/list.ts b/src/webapp/utils/list.ts new file mode 100644 index 0000000..070d938 --- /dev/null +++ b/src/webapp/utils/list.ts @@ -0,0 +1,8 @@ +import i18n from "@eyeseetea/d2-ui-components/locales"; +import _ from "lodash"; + +export function ellipsizedList(items: string[], limit = 3): string { + const overflow = items.length - limit; + const hasOverflow = overflow > 0; + return _.take(items, limit).join(", ") + (hasOverflow ? i18n.t(" and {{overflow}} more...", { overflow }) : ""); +} From 1fa0bde4d063d3900d779f4242bd34d7484b9c0e Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Fri, 4 Feb 2022 00:24:39 +0100 Subject: [PATCH 126/192] Add Segmented Control to types --- src/types/d2-ui.d.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 07a3b6d..7383c99 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -177,6 +177,18 @@ declare module "@dhis2/ui" { onFilterChangePicked?: (...args: any[]) => any; }; + export type SegmentedControlOption = { + label: string; + value: string; + disabled?: boolean; + }; + + export type SegmentedControlProps = { + options: SegmentedControlOption[]; + selected: string; + onChange: (data: { value?: string }, event: ChangeEvent) => void; + }; + export type SingleSelectFieldProps = { className?: string; clearText?: string | ((...args: any[]) => any); @@ -385,6 +397,7 @@ declare module "@dhis2/ui" { export function Button(props: ButtonProps): React.ReactElement; export function Transfer(props: TransferProps): React.ReactElement; export function MultiSelect(props: MultiSelectProps): React.ReactElement; + export function SegmentedControl(props: SegmentedControlProps): React.ReactElement; export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; export function SingleSelectField(props: SingleSelectFieldProps): React.ReactElement; export function SingleSelectOption(props: SingleSelectOptionProps): React.ReactElement; From 781455fc24525976a9bc50de542656951e993e85 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Fri, 4 Feb 2022 01:41:38 +0100 Subject: [PATCH 127/192] Add Segmented Control (Toggle) for update strategy --- i18n/en.pot | 7 ++- i18n/es.po | 5 +- .../user-roles-selector/UserRolesSelector.tsx | 63 ++++++++++++++----- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 19dfa31..e4cb722 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2021-12-07T09:36:35.426Z\n" -"PO-Revision-Date: 2021-12-07T09:36:35.426Z\n" +"POT-Creation-Date: 2022-02-03T22:41:15.395Z\n" +"PO-Revision-Date: 2022-02-03T22:41:15.395Z\n" msgid "Enable users" msgstr "" @@ -241,3 +241,6 @@ msgstr "" msgid "Delete" msgstr "" + +msgid " and {{overflow}} more..." +msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 7fdedb7..32ecab0 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2021-12-07T09:36:35.426Z\n" +"POT-Creation-Date: 2022-02-03T22:41:15.395Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -241,3 +241,6 @@ msgstr "" msgid "Delete" msgstr "" + +msgid " and {{overflow}} more..." +msgstr "" diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx index 8f7b83c..966100f 100644 --- a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx +++ b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx @@ -1,44 +1,55 @@ -import { Transfer, TransferOption } from "@dhis2/ui"; -import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; -import _, { intersection } from "lodash"; import { useState, useEffect } from "react"; +import { Transfer, TransferOption, SegmentedControl } from "@dhis2/ui"; +import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; import { NamedRef } from "../../../domain/entities/Ref"; import { User } from "../../../domain/entities/User"; -import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; import { ellipsizedList } from "../../utils/list"; +import i18n from "../../../locales"; +import styled from "styled-components"; +import _ from "lodash"; -export interface UserRolesSelectorProps { - ids: string[]; - onCancel: () => void; -} +const updateStrategy = ["merge" as const, "replace" as const]; + +export type UpdateStrategy = typeof updateStrategy[number]; export const UserRolesSelector: React.FC = props => { const snackbar = useSnackbar(); const { compositionRoot } = useAppContext(); + const { ids } = props; const [users, setUsers] = useState([] as User[]); const [userRoles, setUserRoles] = useState([] as TransferOption[]); const [selectedRoles, setSelectedRoles] = useState([""]); - const { ids } = props; + const [updateStrategy, setUpdateStrategy] = useState("merge"); + const updateStrategies = [ + { + label: i18n.t("Merge"), + value: "merge", + }, + { + label: i18n.t("Replace"), + value: "replace", + }, + ]; + useEffect(() => { compositionRoot.metadata .list("userRoles") .map(({ objects }) => buildTransferOptions(objects)) .run( roles => setUserRoles(roles), - error => snackbar.error(error) + error => snackbar.error(i18n.t("Error loading roles: ") + error) ); compositionRoot.users.getMany(ids).run( users => { setUsers(users); setSelectedRoles(_.intersection(...users.map(user => user.userRoles.map(({ id }) => id)))); + setUpdateStrategy(users.length > 1 ? "merge" : "replace"); }, - error => snackbar.error(error) + error => snackbar.error(i18n.t("Error loading users: ") + error) ); }, [ids]); - const onChange = (payload: { selected: string[] }) => setSelectedRoles(payload.selected); - return ( = props => { //todo }} > + + + setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} + /> + setSelectedRoles(payload.selected)} filterable={true} filterablePicked={true} selectedWidth="100%" @@ -72,3 +91,19 @@ const getTitle = (users: User[]): string => { const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { return options.map(({ id, name }) => ({ value: id, label: name })); }; + +const Container = styled.div` + display: flex; + justify-content: right; + margin-bottom: 16px; + align-items: center; +`; + +const Label = styled.span` + margin-right: 16px; +`; + +export interface UserRolesSelectorProps { + ids: string[]; + onCancel: () => void; +} From 4ceffe433aeaa19fbf8f5f9a30b759576065fe02 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Fri, 4 Feb 2022 13:00:50 +0100 Subject: [PATCH 128/192] Update onSave --- i18n/en.pot | 10 ++- i18n/es.po | 9 +- src/legacy/List/List.component.js | 1 + .../user-roles-selector/UserRolesSelector.tsx | 90 +++++++++++++++---- 4 files changed, 91 insertions(+), 19 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index e4cb722..b45d2af 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2022-02-03T22:41:15.395Z\n" -"PO-Revision-Date: 2022-02-03T22:41:15.395Z\n" +"POT-Creation-Date: 2022-02-04T00:41:55.247Z\n" +"PO-Revision-Date: 2022-02-04T00:41:55.247Z\n" msgid "Enable users" msgstr "" @@ -221,6 +221,12 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" +msgid "Merge" +msgstr "" + +msgid "Replace" +msgstr "" + msgid "Saving users" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 32ecab0..93ead36 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-02-03T22:41:15.395Z\n" +"POT-Creation-Date: 2022-02-04T00:41:55.247Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -221,6 +221,13 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" +msgid "Merge" +msgstr "" + +#, fuzzy +msgid "Replace" +msgstr "Replicar" + msgid "Saving users" msgstr "" diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 086860f..81ed298 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -436,6 +436,7 @@ export class ListHybrid extends React.Component { userRolesAssignmentDialogStore.setState({ open: false })} + onSave={() => userRolesAssignmentDialogStore.setState({ open: false })} /> ) : null} diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx index 966100f..86c2eeb 100644 --- a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx +++ b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx @@ -1,27 +1,32 @@ import { useState, useEffect } from "react"; -import { Transfer, TransferOption, SegmentedControl } from "@dhis2/ui"; +import { Transfer, TransferOption, SegmentedControl, SegmentedControlOption } from "@dhis2/ui"; import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; import { NamedRef } from "../../../domain/entities/Ref"; import { User } from "../../../domain/entities/User"; import { useAppContext } from "../../contexts/app-context"; import { ellipsizedList } from "../../utils/list"; +import { Metadata } from "../../../domain/entities/Metadata"; import i18n from "../../../locales"; import styled from "styled-components"; -import _ from "lodash"; +import _, { update } from "lodash"; const updateStrategy = ["merge" as const, "replace" as const]; export type UpdateStrategy = typeof updateStrategy[number]; export const UserRolesSelector: React.FC = props => { - const snackbar = useSnackbar(); - const { compositionRoot } = useAppContext(); - const { ids } = props; - const [users, setUsers] = useState([] as User[]); - const [userRoles, setUserRoles] = useState([] as TransferOption[]); - const [selectedRoles, setSelectedRoles] = useState([""]); - const [updateStrategy, setUpdateStrategy] = useState("merge"); - const updateStrategies = [ + const oneUserOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + disabled: true, + }, + { + label: i18n.t("Replace"), + value: "replace", + }, + ]; + const defaultOptions: SegmentedControlOption[] = [ { label: i18n.t("Merge"), value: "merge", @@ -32,12 +37,25 @@ export const UserRolesSelector: React.FC = props => { }, ]; + const snackbar = useSnackbar(); + const { compositionRoot } = useAppContext(); + const { ids, onCancel, onSave } = props; + const [users, setUsers] = useState([] as User[]); + const [userRoles, setUserRoles] = useState([] as Metadata[]); + const [transferOptions, setTransferOptions] = useState([] as TransferOption[]); + const [selectedRoles, setSelectedRoles] = useState([""]); + const [updateStrategy, setUpdateStrategy] = useState("merge"); + const [segmentedControlOptions, setSegmentedControlOptions] = useState(defaultOptions); + useEffect(() => { compositionRoot.metadata .list("userRoles") - .map(({ objects }) => buildTransferOptions(objects)) + .map(({ objects }) => objects) .run( - roles => setUserRoles(roles), + roles => { + setUserRoles(roles); + setTransferOptions(buildTransferOptions(roles)); + }, error => snackbar.error(i18n.t("Error loading roles: ") + error) ); compositionRoot.users.getMany(ids).run( @@ -45,6 +63,7 @@ export const UserRolesSelector: React.FC = props => { setUsers(users); setSelectedRoles(_.intersection(...users.map(user => user.userRoles.map(({ id }) => id)))); setUpdateStrategy(users.length > 1 ? "merge" : "replace"); + setSegmentedControlOptions(users.length > 1 ? defaultOptions : oneUserOptions); }, error => snackbar.error(i18n.t("Error loading users: ") + error) ); @@ -54,23 +73,61 @@ export const UserRolesSelector: React.FC = props => { { - //todo + if (users.length > 0) { + switch (updateStrategy) { + case "replace": + setUsers( + users.map(user => { + user.userRoles = userRoles.filter(role => selectedRoles.includes(role.id)); + return user; + }) + ); + break; + case "merge": + { + const removedRoles = _.intersection( + ...users.map(user => user.userRoles.map(({ id }) => id)) + ).filter(id => !selectedRoles.includes(id)); + setUsers( + users.map(user => { + user.userRoles = _.union( + user.userRoles.filter(role => !removedRoles.includes(role.id)), + userRoles.filter(role => selectedRoles.includes(role.id)) + ); + return user; + }) + ); + } + break; + default: + snackbar.error(i18n.t("Unknown strategy: ") + updateStrategy); + break; + } + compositionRoot.users.save(users).run( + () => { + snackbar.success(i18n.t("User roles assigned.")); + setUsers([]); + onSave(); + }, + error => snackbar.error(i18n.t("Error assigning user roles: ") + error) + ); + } else onCancel(); }} > setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} /> setSelectedRoles(payload.selected)} filterable={true} @@ -106,4 +163,5 @@ const Label = styled.span` export interface UserRolesSelectorProps { ids: string[]; onCancel: () => void; + onSave: () => void; } From 01e99f0df6a3bde05d98a67ac8c22be0a7fd9e71 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Fri, 4 Feb 2022 14:05:34 +0100 Subject: [PATCH 129/192] First commit for pull request draft --- src/webapp/pages/user-edit/UserEditPage.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/webapp/pages/user-edit/UserEditPage.tsx diff --git a/src/webapp/pages/user-edit/UserEditPage.tsx b/src/webapp/pages/user-edit/UserEditPage.tsx new file mode 100644 index 0000000..e69de29 From 89c6baaf51af1267563cbdffc04a2def363eaaa2 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Mon, 7 Feb 2022 10:31:09 +0100 Subject: [PATCH 130/192] Wait for nested promises Signed-off-by: Alexis Rico --- .../clients/storage/DataStoreStorageClient.ts | 2 +- src/data/clients/storage/StorageClient.ts | 133 ++++++++++-------- 2 files changed, 72 insertions(+), 63 deletions(-) diff --git a/src/data/clients/storage/DataStoreStorageClient.ts b/src/data/clients/storage/DataStoreStorageClient.ts index 7e770ac..6e8fc2b 100644 --- a/src/data/clients/storage/DataStoreStorageClient.ts +++ b/src/data/clients/storage/DataStoreStorageClient.ts @@ -29,7 +29,7 @@ export class DataStoreStorageClient extends StorageClient { } public saveObject(key: string, value: T): FutureData { - return apiToFuture(this.dataStore.save(key, value)); + return apiToFuture(this.dataStore.save(key, value)).map(() => undefined); } public removeObject(key: string): FutureData { diff --git a/src/data/clients/storage/StorageClient.ts b/src/data/clients/storage/StorageClient.ts index 560e27a..c79deb3 100644 --- a/src/data/clients/storage/StorageClient.ts +++ b/src/data/clients/storage/StorageClient.ts @@ -15,90 +15,99 @@ export abstract class StorageClient { } public getObjectInCollection(key: string, id: string): FutureData { - return this.getObject(key) - .map(value => value ?? []) - .flatMap(rawData => { - const baseElement = _.find(rawData, element => element.id === id); - if (!baseElement) return Future.success(undefined); - const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) { - return this.getObject(`${key}-${id}`).map(value => { - if (!value) return baseElement; - return { ...baseElement, ...value } as T; - }); - } - return Future.success(baseElement); - }); + return this.getObject(key).flatMap((rawData = []) => { + const baseElement = _.find(rawData, element => element.id === id); + if (!baseElement) return Future.success(undefined); + + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + return this.getObject(`${key}-${id}`).map(value => { + if (!value) return baseElement; + return { ...baseElement, ...value } as T; + }); + } + return Future.success(baseElement); + }); } public saveObjectsInCollection(key: Namespace, elements: T[]): FutureData { const advancedProperties = NamespaceProperties[key] ?? []; const baseElements = elements.map(element => _.omit(element, advancedProperties)); - return this.getObject(key) - .map(value => value ?? []) - .flatMap((oldData: Ref[]) => { - const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); - // Save base elements directly into collection: model - return this.saveObject(key, [...cleanData, ...baseElements]).map(() => { + + return this.getObject(key).flatMap((oldData = []) => { + const cleanData = oldData.filter(item => !elements.some(element => item.id === element.id)); + + // Save base elements directly into collection: model + return this.saveObject(key, [...cleanData, ...baseElements]) + .flatMap(() => { // Save advanced properties to its own key: model-id if (advancedProperties.length > 0) { - for (const element of elements) { + return Future.futureMap(elements, element => { const advancedElement = _.pick(element, advancedProperties); - this.saveObject(`${key}-${element.id}`, advancedElement); - } + return this.saveObject(`${key}-${element.id}`, advancedElement); + }); } - return undefined; - }); - }); + + return Future.success(undefined); + }) + .map(() => undefined); + }); } public saveObjectInCollection(key: Namespace, element: T): FutureData { const advancedProperties = NamespaceProperties[key] ?? []; const baseElement = _.omit(element, advancedProperties); - return this.getObject(key) - .map(value => value ?? []) - .flatMap((oldData: Ref[]) => { - const foundIndex = _.findIndex(oldData, item => item.id === element.id); - const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; - // Save base element directly into collection: model - return this.saveObject(key, [ - ...oldData.slice(0, arrayIndex), - baseElement, - ...oldData.slice(arrayIndex + 1), - ]).map(() => { - // Save advanced properties to its own key: model-id - if (advancedProperties.length > 0) { - const advancedElement = _.pick(element, advancedProperties); - this.saveObject(`${key}-${element.id}`, advancedElement); - } - return undefined; - }); + + return this.getObject(key).flatMap((oldData = []) => { + const foundIndex = _.findIndex(oldData, item => item.id === element.id); + const arrayIndex = foundIndex === -1 ? oldData.length : foundIndex; + + // Save base element directly into collection: model + return this.saveObject(key, [ + ...oldData.slice(0, arrayIndex), + baseElement, + ...oldData.slice(arrayIndex + 1), + ]).flatMap(() => { + // Save advanced properties to its own key: model-id + if (advancedProperties.length > 0) { + const advancedElement = _.pick(element, advancedProperties); + return this.saveObject(`${key}-${element.id}`, advancedElement); + } + + return Future.success(undefined); }); + }); } public removeObjectInCollection(key: string, id: string): FutureData { - return this.getObject(key) - .map(value => (value ?? []) as Ref[]) - .flatMap(oldData => { - const newData = _.reject(oldData, { id }); - return this.saveObject(key, newData).map(() => { - const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) this.removeObject(`${key}-${id}`); - return undefined; - }); + return this.getObject(key).flatMap((oldData = []) => { + const newData = _.reject(oldData, { id }); + + return this.saveObject(key, newData).flatMap(() => { + const advancedProperties = NamespaceProperties[key] ?? []; + if (advancedProperties.length > 0) { + return this.removeObject(`${key}-${id}`); + } + + return Future.success(undefined); }); + }); } public removeObjectsInCollection(key: string, ids: string[]): FutureData { - return this.getObject(key) - .map(value => value ?? []) - .flatMap(oldData => { - const newData = _.reject(oldData, ({ id }) => ids.includes(id)); - return this.saveObject(key, newData).map(() => { + return this.getObject(key).flatMap((oldData = []) => { + const newData = _.reject(oldData, ({ id }) => ids.includes(id)); + + return this.saveObject(key, newData) + .flatMap(() => { const advancedProperties = NamespaceProperties[key] ?? []; - if (advancedProperties.length > 0) for (const id of ids) this.removeObject(`${key}-${id}`); - return undefined; - }); - }); + if (advancedProperties.length > 0) { + return Future.futureMap(ids, id => this.removeObject(`${key}-${id}`)); + } + + return Future.success(undefined); + }) + .map(() => undefined); + }); } } From c958124a9d3e4350e49a005938dfe5c20111d094 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Mon, 7 Feb 2022 16:05:11 +0100 Subject: [PATCH 131/192] Add UpdateUsersRoles and UpdateUsersGroups use cases --- src/CompositionRoot.ts | 4 ++++ .../usecases/UpdateUsersGroupsUseCase.ts | 18 ++++++++++++++++++ src/domain/usecases/UpdateUsersRolesUseCase.ts | 18 ++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/domain/usecases/UpdateUsersGroupsUseCase.ts create mode 100644 src/domain/usecases/UpdateUsersRolesUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index f51166f..8b74f47 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -10,6 +10,8 @@ import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; +import { UpdateUsersRolesUseCase } from "./domain/usecases/UpdateUsersRolesUseCase"; +import { UpdateUsersGroupsUseCase } from "./domain/usecases/UpdateUsersGroupsUseCase"; export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); @@ -27,6 +29,8 @@ export function getCompositionRoot(instance: Instance) { get: new GetUserByIdUseCase(userRepository), getMany: new GetUsersByIdUseCase(userRepository), save: new SaveUsersUseCase(userRepository), + updateRoles: new UpdateUsersRolesUseCase(userRepository), + updateGroups: new UpdateUsersGroupsUseCase(userRepository), }), metadata: getExecute({ list: new ListMetadataUseCase(metadataRepository), diff --git a/src/domain/usecases/UpdateUsersGroupsUseCase.ts b/src/domain/usecases/UpdateUsersGroupsUseCase.ts new file mode 100644 index 0000000..ff47523 --- /dev/null +++ b/src/domain/usecases/UpdateUsersGroupsUseCase.ts @@ -0,0 +1,18 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { User } from "../entities/User"; +import { NamedRef } from "../entities/Ref"; +import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; +import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; + +export class UpdateUsersGroupsUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute( + usersToUpdate: User[], + groupsToUpdate: NamedRef[], + updateStrategy: UpdateStrategy + ): FutureData { + return this.userRepository.updateGroups(usersToUpdate, groupsToUpdate, updateStrategy); + } +} diff --git a/src/domain/usecases/UpdateUsersRolesUseCase.ts b/src/domain/usecases/UpdateUsersRolesUseCase.ts new file mode 100644 index 0000000..892fbc0 --- /dev/null +++ b/src/domain/usecases/UpdateUsersRolesUseCase.ts @@ -0,0 +1,18 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { User } from "../entities/User"; +import { NamedRef } from "../entities/Ref"; +import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; +import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; + +export class UpdateUsersRolesUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute( + usersToUpdate: User[], + rolesToUpdate: NamedRef[], + updateStrategy: UpdateStrategy + ): FutureData { + return this.userRepository.updateRoles(usersToUpdate, rolesToUpdate, updateStrategy); + } +} From f83a7f9f8239fa89aaef6d75cbab2498f3b64f08 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Mon, 7 Feb 2022 16:06:48 +0100 Subject: [PATCH 132/192] Implement UpdateUsersRoles/Groups use cases --- src/data/repositories/UserD2ApiRepository.ts | 51 +++++++++++++++++++- src/domain/repositories/UserRepository.ts | 4 ++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 456d24d..f098ab8 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -2,8 +2,9 @@ import { D2Api, D2UserSchema, MetadataResponse, SelectedPick } from "@eyeseetea/ import _ from "lodash"; import { Future, FutureData } from "../../domain/entities/Future"; import { PaginatedResponse } from "../../domain/entities/PaginatedResponse"; +import { NamedRef } from "../../domain/entities/Ref"; import { User } from "../../domain/entities/User"; -import { ListOptions, UserRepository } from "../../domain/repositories/UserRepository"; +import { ListOptions, UpdateStrategy, UserRepository } from "../../domain/repositories/UserRepository"; import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; @@ -130,6 +131,54 @@ export class UserD2ApiRepository implements UserRepository { }); } + public updateRoles( + usersToUpdate: User[], + rolesToUpdate: NamedRef[], + updateStrategy: UpdateStrategy + ): FutureData { + const commonRoles = _.intersectionBy( + ...usersToUpdate.map(user => user.userRoles.map(role => role)), + ({ id }) => id + ); + return this.save( + usersToUpdate.map(user => { + if (usersToUpdate.length > 1 && updateStrategy == "merge") { + return { + ...user, + userRoles: _.uniqBy( + [..._.differenceBy(user.userRoles, commonRoles, ({ id }) => id), ...rolesToUpdate], + ({ id }) => id + ), + }; + } else return { ...user, userRoles: rolesToUpdate }; + }) + ); + } + + public updateGroups( + usersToUpdate: User[], + groupsToUpdate: NamedRef[], + updateStrategy: UpdateStrategy + ): FutureData { + const commonGroups = _.intersectionBy( + ...usersToUpdate.map(user => user.userGroups.map(group => group)), + ({ id }) => id + ); + return this.save( + usersToUpdate.map(user => { + if (usersToUpdate.length > 1 && updateStrategy == "merge") { + return { + ...user, + userGroups: _.uniqBy( + [..._.differenceBy(user.userGroups, commonGroups, ({ id }) => id), ...groupsToUpdate], + ({ id }) => id + ), + }; + } else return { ...user, userGroups: groupsToUpdate }; + }) + ); + } + private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { const userIds = users.map(({ id }) => id); const groupDictionary = _(users) diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index efe98ae..f964adf 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -1,6 +1,7 @@ import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; import { FutureData } from "../entities/Future"; import { PaginatedResponse } from "../entities/PaginatedResponse"; +import { NamedRef } from "../entities/Ref"; import { User } from "../entities/User"; export interface UserRepository { @@ -10,6 +11,8 @@ export interface UserRepository { getById(id: string): FutureData; getByIds(ids: string[]): FutureData; save(users: User[]): FutureData; + updateRoles(users: User[], roles: NamedRef[], updateStrategy: UpdateStrategy): FutureData; + updateGroups(users: User[], groups: NamedRef[], updateStrategy: UpdateStrategy): FutureData; } export interface ListOptions { @@ -22,3 +25,4 @@ export interface ListOptions { export type ListFilterType = "in" | "eq"; export type ListFilters = Record; +export type UpdateStrategy = "replace" | "merge"; From dcdc3eab4434d49295851bf8820a1afce2233af6 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Mon, 7 Feb 2022 16:08:20 +0100 Subject: [PATCH 133/192] Add UserGroupSelector and fix onSave --- src/legacy/List/List.component.js | 22 +-- .../UserGroupsSelector.tsx | 179 ++++++++++++++---- .../user-roles-selector/UserRolesSelector.tsx | 61 ++---- 3 files changed, 164 insertions(+), 98 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 81ed298..91b20f6 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -9,14 +9,13 @@ import React from "react"; import i18n from "../../locales"; import { UserListTable } from "../../webapp/components/user-list-table/UserListTable"; import { UserRolesSelector } from "../../webapp/components/user-roles-selector/UserRolesSelector"; +import { UserGroupsSelector } from "../../webapp/components/user-groups-selector/UserGroupsSelector"; import CopyInUserDialog from "../components/CopyInUserDialog.component"; import ImportExport from "../components/ImportExport.component"; import ImportTable from "../components/ImportTable.component"; import ReplicateUserFromTable from "../components/ReplicateUserFromTable.component"; import ReplicateUserFromTemplate from "../components/ReplicateUserFromTemplate.component"; import SettingsDialog from "../components/SettingsDialog.component"; -import UserGroupsDialog from "../components/UserGroupsDialog.component"; -import UserRolesDialog from "../components/UserRolesDialog.component"; import Settings from "../models/settings"; import { getExistingUsers, saveUsers, updateUsers } from "../models/userHelpers"; import snackActions from "../Snackbar/snack.actions"; @@ -418,20 +417,6 @@ export class ListHybrid extends React.Component { /> ) : null} - {/*{assignUserRoles.open ? ( - userRolesAssignmentDialogStore.setState({ open: false })} - /> - ) : null} - - {assignUserGroups.open ? ( - userGroupsAssignmentDialogStore.setState({ open: false })} - /> - ) : null}*/} - {assignUserRoles.open ? ( userGroupsAssignmentDialogStore.setState({ open: false })} + onSave={() => userGroupsAssignmentDialogStore.setState({ open: false })} /> ) : null} diff --git a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx index 8118395..3041f67 100644 --- a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx +++ b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx @@ -1,37 +1,142 @@ -import { Transfer, TransferProps } from "@dhis2/ui"; -import { useState } from "react"; - -interface UserRolesSelectorProps { - -} - -export const UserRolesSelector = ({ ...args }: UserRolesSelectorProps) => { - const [selected, setSelected] = useState(["username","firstName","surname","email","dataViewOrganisationUnits","lastLogin","disabled","created"]); - const onChange = (payload:{ selected: string[] }) => setSelected(payload.selected) - - return -}; +import { useState, useEffect } from "react"; +import { Transfer, TransferOption, SegmentedControl, SegmentedControlOption } from "@dhis2/ui"; +import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; +import { NamedRef } from "../../../domain/entities/Ref"; +import { User } from "../../../domain/entities/User"; +import { Metadata } from "../../../domain/entities/Metadata"; +import { UpdateStrategy } from "../../../domain/repositories/UserRepository"; +import { useAppContext } from "../../contexts/app-context"; +import { ellipsizedList } from "../../utils/list"; +import i18n from "../../../locales"; +import styled from "styled-components"; +import _ from "lodash"; + +export const UserGroupsSelector: React.FC = props => { + const oneUserOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + disabled: true, + }, + { + label: i18n.t("Replace"), + value: "replace", + }, + ]; + const defaultOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + }, + { + label: i18n.t("Replace"), + value: "replace", + }, + ]; + + const snackbar = useSnackbar(); + const { compositionRoot } = useAppContext(); + const { ids, onCancel, onSave } = props; + const [users, setUsers] = useState([] as User[]); + const [userGroups, setUserGroups] = useState([] as Metadata[]); + const [transferOptions, setTransferOptions] = useState([] as TransferOption[]); + const [selectedGroups, setSelectedGroups] = useState([""]); + const [updateStrategy, setUpdateStrategy] = useState("merge"); + const [segmentedControlOptions, setSegmentedControlOptions] = useState(defaultOptions); + + useEffect(() => { + compositionRoot.metadata + .list("userGroups") + .map(({ objects }) => objects) + .run( + groups => { + setUserGroups(groups); + setTransferOptions(buildTransferOptions(groups)); + }, + error => snackbar.error(i18n.t("Error loading groups: ") + error) + ); + compositionRoot.users.getMany(ids).run( + users => { + setUsers(users); + setSelectedGroups(_.intersection(...users.map(user => user.userGroups.map(({ id }) => id)))); + setUpdateStrategy(users.length > 1 ? "merge" : "replace"); + setSegmentedControlOptions(users.length > 1 ? defaultOptions : oneUserOptions); + }, + error => snackbar.error(i18n.t("Error loading users: ") + error) + ); + }, [ids]); + + return ( + { + if (users.length > 0) { + compositionRoot.users + .updateGroups( + users, + userGroups.filter(group => selectedGroups.includes(group.id)), + updateStrategy + ) + .run( + () => { + snackbar.success(i18n.t("User groups assigned.")); + onSave(); + }, + error => snackbar.error(i18n.t("Error assigning user groups: ") + error) + ); + } else onCancel(); + }} + > + + + setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} + /> + + setSelectedGroups(payload.selected)} + filterable={true} + filterablePicked={true} + filterPlaceholder={i18n.t("Search group")} + filterPlaceholderPicked={i18n.t("Search group")} + selectedWidth="100%" + optionsWidth="100%" + height="400px" + /> + + ); +}; + +const getTitle = (users: User[]): string => { + const usernames = users && users.map(user => user.username); + return i18n.t("Assign groups: ") + (usernames ? ellipsizedList(usernames) : "..."); +}; + +const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + return options.map(({ id, name }) => ({ value: id, label: name })); +}; + +const Container = styled.div` + display: flex; + justify-content: right; + margin-bottom: 16px; + align-items: center; +`; + +const Label = styled.span` + margin-right: 16px; +`; + +export interface UserGroupsSelectorProps { + ids: string[]; + onCancel: () => void; + onSave: () => void; +} diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx index 86c2eeb..544949f 100644 --- a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx +++ b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx @@ -3,16 +3,13 @@ import { Transfer, TransferOption, SegmentedControl, SegmentedControlOption } fr import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; import { NamedRef } from "../../../domain/entities/Ref"; import { User } from "../../../domain/entities/User"; +import { Metadata } from "../../../domain/entities/Metadata"; +import { UpdateStrategy } from "../../../domain/repositories/UserRepository"; import { useAppContext } from "../../contexts/app-context"; import { ellipsizedList } from "../../utils/list"; -import { Metadata } from "../../../domain/entities/Metadata"; import i18n from "../../../locales"; import styled from "styled-components"; -import _, { update } from "lodash"; - -const updateStrategy = ["merge" as const, "replace" as const]; - -export type UpdateStrategy = typeof updateStrategy[number]; +import _ from "lodash"; export const UserRolesSelector: React.FC = props => { const oneUserOptions: SegmentedControlOption[] = [ @@ -78,43 +75,19 @@ export const UserRolesSelector: React.FC = props => { fullWidth={true} onSave={() => { if (users.length > 0) { - switch (updateStrategy) { - case "replace": - setUsers( - users.map(user => { - user.userRoles = userRoles.filter(role => selectedRoles.includes(role.id)); - return user; - }) - ); - break; - case "merge": - { - const removedRoles = _.intersection( - ...users.map(user => user.userRoles.map(({ id }) => id)) - ).filter(id => !selectedRoles.includes(id)); - setUsers( - users.map(user => { - user.userRoles = _.union( - user.userRoles.filter(role => !removedRoles.includes(role.id)), - userRoles.filter(role => selectedRoles.includes(role.id)) - ); - return user; - }) - ); - } - break; - default: - snackbar.error(i18n.t("Unknown strategy: ") + updateStrategy); - break; - } - compositionRoot.users.save(users).run( - () => { - snackbar.success(i18n.t("User roles assigned.")); - setUsers([]); - onSave(); - }, - error => snackbar.error(i18n.t("Error assigning user roles: ") + error) - ); + compositionRoot.users + .updateRoles( + users, + userRoles.filter(role => selectedRoles.includes(role.id)), + updateStrategy + ) + .run( + () => { + snackbar.success(i18n.t("User roles assigned.")); + onSave(); + }, + error => snackbar.error(i18n.t("Error assigning user roles: ") + error) + ); } else onCancel(); }} > @@ -132,6 +105,8 @@ export const UserRolesSelector: React.FC = props => { onChange={(payload: { selected: string[] }) => setSelectedRoles(payload.selected)} filterable={true} filterablePicked={true} + filterPlaceholder={i18n.t("Search role")} + filterPlaceholderPicked={i18n.t("Search role")} selectedWidth="100%" optionsWidth="100%" height="400px" From 89afa09c151a985b0d528e2676db208a76c59230 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Tue, 8 Feb 2022 12:44:12 +0100 Subject: [PATCH 134/192] Fix warnings --- src/data/repositories/UserD2ApiRepository.ts | 4 +- .../UserGroupsSelector.tsx | 46 +++++++++---------- .../user-roles-selector/UserRolesSelector.tsx | 46 +++++++++---------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index f098ab8..f0a0535 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -142,7 +142,7 @@ export class UserD2ApiRepository implements UserRepository { ); return this.save( usersToUpdate.map(user => { - if (usersToUpdate.length > 1 && updateStrategy == "merge") { + if (usersToUpdate.length > 1 && updateStrategy === "merge") { return { ...user, userRoles: _.uniqBy( @@ -166,7 +166,7 @@ export class UserD2ApiRepository implements UserRepository { ); return this.save( usersToUpdate.map(user => { - if (usersToUpdate.length > 1 && updateStrategy == "merge") { + if (usersToUpdate.length > 1 && updateStrategy === "merge") { return { ...user, userGroups: _.uniqBy( diff --git a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx index 3041f67..04a391b 100644 --- a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx +++ b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx @@ -11,29 +11,29 @@ import i18n from "../../../locales"; import styled from "styled-components"; import _ from "lodash"; -export const UserGroupsSelector: React.FC = props => { - const oneUserOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - disabled: true, - }, - { - label: i18n.t("Replace"), - value: "replace", - }, - ]; - const defaultOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - }, - { - label: i18n.t("Replace"), - value: "replace", - }, - ]; +const oneUserOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + disabled: true, + }, + { + label: i18n.t("Replace"), + value: "replace", + }, +]; +const defaultOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + }, + { + label: i18n.t("Replace"), + value: "replace", + }, +]; +export const UserGroupsSelector: React.FC = props => { const snackbar = useSnackbar(); const { compositionRoot } = useAppContext(); const { ids, onCancel, onSave } = props; @@ -64,7 +64,7 @@ export const UserGroupsSelector: React.FC = props => { }, error => snackbar.error(i18n.t("Error loading users: ") + error) ); - }, [ids]); + }, [ids, compositionRoot.metadata, compositionRoot.users, snackbar]); return ( = props => { - const oneUserOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - disabled: true, - }, - { - label: i18n.t("Replace"), - value: "replace", - }, - ]; - const defaultOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - }, - { - label: i18n.t("Replace"), - value: "replace", - }, - ]; +const oneUserOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + disabled: true, + }, + { + label: i18n.t("Replace"), + value: "replace", + }, +]; +const defaultOptions: SegmentedControlOption[] = [ + { + label: i18n.t("Merge"), + value: "merge", + }, + { + label: i18n.t("Replace"), + value: "replace", + }, +]; +export const UserRolesSelector: React.FC = props => { const snackbar = useSnackbar(); const { compositionRoot } = useAppContext(); const { ids, onCancel, onSave } = props; @@ -64,7 +64,7 @@ export const UserRolesSelector: React.FC = props => { }, error => snackbar.error(i18n.t("Error loading users: ") + error) ); - }, [ids]); + }, [ids, compositionRoot.metadata, compositionRoot.users, snackbar]); return ( Date: Tue, 8 Feb 2022 22:30:56 +0100 Subject: [PATCH 135/192] Code review Signed-off-by: Alexis Rico --- i18n/en.pot | 16 +- i18n/es.po | 14 +- src/CompositionRoot.ts | 8 +- src/data/repositories/UserD2ApiRepository.ts | 82 +++------- src/domain/entities/User.ts | 1 + src/domain/repositories/UserRepository.ts | 5 +- src/domain/usecases/GetUserByIdUseCase.ts | 12 -- ...ByIdUseCase.ts => GetUsersByIdsUseCase.ts} | 2 +- .../usecases/UpdateUsersGroupsUseCase.ts | 11 +- .../usecases/UpdateUsersRolesUseCase.ts | 11 +- src/legacy/List/List.component.js | 40 ----- src/legacy/List/userGroups.store.js | 3 - src/legacy/List/userRoles.store.js | 3 - .../components/MultipleSelector.component.js | 19 +-- .../components/UserGroupsDialog.component.js | 73 --------- .../components/UserRolesDialog.component.js | 53 ------- .../MultiSelectorDialog.tsx | 127 ++++++++++++++++ .../UserGroupsSelector.tsx | 142 ------------------ .../user-list-table/UserListTable.tsx | 28 ++-- .../user-roles-selector/UserRolesSelector.tsx | 142 ------------------ 20 files changed, 212 insertions(+), 580 deletions(-) delete mode 100644 src/domain/usecases/GetUserByIdUseCase.ts rename src/domain/usecases/{GetUsersByIdUseCase.ts => GetUsersByIdsUseCase.ts} (87%) delete mode 100644 src/legacy/List/userGroups.store.js delete mode 100644 src/legacy/List/userRoles.store.js delete mode 100644 src/legacy/components/UserGroupsDialog.component.js delete mode 100644 src/legacy/components/UserRolesDialog.component.js create mode 100644 src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx delete mode 100644 src/webapp/components/user-groups-selector/UserGroupsSelector.tsx delete mode 100644 src/webapp/components/user-roles-selector/UserRolesSelector.tsx diff --git a/i18n/en.pot b/i18n/en.pot index b45d2af..eba31a7 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2022-02-04T00:41:55.247Z\n" -"PO-Revision-Date: 2022-02-04T00:41:55.247Z\n" +"POT-Creation-Date: 2022-02-08T21:24:30.377Z\n" +"PO-Revision-Date: 2022-02-08T21:24:30.377Z\n" msgid "Enable users" msgstr "" @@ -221,12 +221,24 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" +msgid "Update strategy: " +msgstr "" + msgid "Merge" msgstr "" msgid "Replace" msgstr "" +msgid "Search" +msgstr "" + +msgid "Assign roles to {{usernames}}" +msgstr "" + +msgid "Assign groups to {{usernames}}" +msgstr "" + msgid "Saving users" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 93ead36..0a4f098 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-02-04T00:41:55.247Z\n" +"POT-Creation-Date: 2022-02-08T21:24:30.377Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -221,6 +221,9 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" +msgid "Update strategy: " +msgstr "" + msgid "Merge" msgstr "" @@ -228,6 +231,15 @@ msgstr "" msgid "Replace" msgstr "Replicar" +msgid "Search" +msgstr "" + +msgid "Assign roles to {{usernames}}" +msgstr "" + +msgid "Assign groups to {{usernames}}" +msgstr "" + msgid "Saving users" msgstr "" diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 8b74f47..fcf14e2 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -4,14 +4,13 @@ import { MetadataD2ApiRepository } from "./data/repositories/MetadataD2ApiReposi import { UserD2ApiRepository } from "./data/repositories/UserD2ApiRepository"; import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; -import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; -import { GetUsersByIdUseCase } from "./domain/usecases/GetUsersByIdUseCase"; +import { GetUsersByIdsUseCase } from "./domain/usecases/GetUsersByIdsUseCase"; import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; -import { UpdateUsersRolesUseCase } from "./domain/usecases/UpdateUsersRolesUseCase"; import { UpdateUsersGroupsUseCase } from "./domain/usecases/UpdateUsersGroupsUseCase"; +import { UpdateUsersRolesUseCase } from "./domain/usecases/UpdateUsersRolesUseCase"; export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); @@ -26,8 +25,7 @@ export function getCompositionRoot(instance: Instance) { getCurrent: new GetCurrentUserUseCase(userRepository), list: new ListUsersUseCase(userRepository), listAllIds: new ListAllUserIdsUseCase(userRepository), - get: new GetUserByIdUseCase(userRepository), - getMany: new GetUsersByIdUseCase(userRepository), + get: new GetUsersByIdsUseCase(userRepository), save: new SaveUsersUseCase(userRepository), updateRoles: new UpdateUsersRolesUseCase(userRepository), updateGroups: new UpdateUsersGroupsUseCase(userRepository), diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index f0a0535..20cfd72 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -57,20 +57,9 @@ export class UserD2ApiRepository implements UserRepository { ).map(({ objects }) => objects.map(user => user.id)); } - public getById(id: string): FutureData { - return apiToFuture(this.api.models.users.get({ fields, filter: { id: { eq: id } } })).flatMap(({ objects }) => { - const [user] = objects; - if (!user) return Future.error(`User ${id} not found`); - - return Future.success(this.toDomainUser(user)); - }); - } - public getByIds(ids: string[]): FutureData { - return apiToFuture(this.api.models.users.get({ fields, filter: { id: { in: ids } } })).flatMap( - ({ objects }) => { - return Future.success(objects.map(user => this.toDomainUser(user))); - } + return apiToFuture(this.api.models.users.get({ fields, filter: { id: { in: ids } } })).flatMap(({ objects }) => + Future.success(objects.map(user => this.toDomainUser(user))) ); } @@ -131,52 +120,31 @@ export class UserD2ApiRepository implements UserRepository { }); } - public updateRoles( - usersToUpdate: User[], - rolesToUpdate: NamedRef[], - updateStrategy: UpdateStrategy - ): FutureData { - const commonRoles = _.intersectionBy( - ...usersToUpdate.map(user => user.userRoles.map(role => role)), - ({ id }) => id - ); - return this.save( - usersToUpdate.map(user => { - if (usersToUpdate.length > 1 && updateStrategy === "merge") { - return { - ...user, - userRoles: _.uniqBy( - [..._.differenceBy(user.userRoles, commonRoles, ({ id }) => id), ...rolesToUpdate], - ({ id }) => id - ), - }; - } else return { ...user, userRoles: rolesToUpdate }; - }) - ); + public updateRoles(ids: string[], update: NamedRef[], strategy: UpdateStrategy): FutureData { + return this.getByIds(ids).flatMap(storedUsers => { + const users = storedUsers.map(user => { + return { + ...user, + userRoles: strategy === "merge" ? _.uniqBy([...user.userRoles, ...update], ({ id }) => id) : update, + }; + }); + + return this.save(users); + }); } - public updateGroups( - usersToUpdate: User[], - groupsToUpdate: NamedRef[], - updateStrategy: UpdateStrategy - ): FutureData { - const commonGroups = _.intersectionBy( - ...usersToUpdate.map(user => user.userGroups.map(group => group)), - ({ id }) => id - ); - return this.save( - usersToUpdate.map(user => { - if (usersToUpdate.length > 1 && updateStrategy === "merge") { - return { - ...user, - userGroups: _.uniqBy( - [..._.differenceBy(user.userGroups, commonGroups, ({ id }) => id), ...groupsToUpdate], - ({ id }) => id - ), - }; - } else return { ...user, userGroups: groupsToUpdate }; - }) - ); + public updateGroups(ids: string[], update: NamedRef[], strategy: UpdateStrategy): FutureData { + return this.getByIds(ids).flatMap(storedUsers => { + const users = storedUsers.map(user => { + return { + ...user, + userGroups: + strategy === "merge" ? _.uniqBy([...user.userGroups, ...update], ({ id }) => id) : update, + }; + }); + + return this.save(users); + }); } private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { diff --git a/src/domain/entities/User.ts b/src/domain/entities/User.ts index 61c5545..ab86eea 100644 --- a/src/domain/entities/User.ts +++ b/src/domain/entities/User.ts @@ -21,6 +21,7 @@ export interface User { openId?: string; authorities: string[]; } + export const defaultUser: User = { id: "", name: "", diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index f964adf..1331909 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -8,11 +8,10 @@ export interface UserRepository { getCurrent(): FutureData; list(options: ListOptions): FutureData>; listAllIds(options: ListOptions): FutureData; - getById(id: string): FutureData; getByIds(ids: string[]): FutureData; save(users: User[]): FutureData; - updateRoles(users: User[], roles: NamedRef[], updateStrategy: UpdateStrategy): FutureData; - updateGroups(users: User[], groups: NamedRef[], updateStrategy: UpdateStrategy): FutureData; + updateRoles(ids: string[], update: NamedRef[], strategy: UpdateStrategy): FutureData; + updateGroups(ids: string[], update: NamedRef[], strategy: UpdateStrategy): FutureData; } export interface ListOptions { diff --git a/src/domain/usecases/GetUserByIdUseCase.ts b/src/domain/usecases/GetUserByIdUseCase.ts deleted file mode 100644 index 12c69b5..0000000 --- a/src/domain/usecases/GetUserByIdUseCase.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { UseCase } from "../../CompositionRoot"; -import { FutureData } from "../entities/Future"; -import { User } from "../entities/User"; -import { UserRepository } from "../repositories/UserRepository"; - -export class GetUserByIdUseCase implements UseCase { - constructor(private userRepository: UserRepository) {} - - public execute(id: string): FutureData { - return this.userRepository.getById(id); - } -} diff --git a/src/domain/usecases/GetUsersByIdUseCase.ts b/src/domain/usecases/GetUsersByIdsUseCase.ts similarity index 87% rename from src/domain/usecases/GetUsersByIdUseCase.ts rename to src/domain/usecases/GetUsersByIdsUseCase.ts index d391453..3456fda 100644 --- a/src/domain/usecases/GetUsersByIdUseCase.ts +++ b/src/domain/usecases/GetUsersByIdsUseCase.ts @@ -3,7 +3,7 @@ import { FutureData } from "../entities/Future"; import { User } from "../entities/User"; import { UserRepository } from "../repositories/UserRepository"; -export class GetUsersByIdUseCase implements UseCase { +export class GetUsersByIdsUseCase implements UseCase { constructor(private userRepository: UserRepository) {} public execute(ids: string[]): FutureData { diff --git a/src/domain/usecases/UpdateUsersGroupsUseCase.ts b/src/domain/usecases/UpdateUsersGroupsUseCase.ts index ff47523..d78dcfc 100644 --- a/src/domain/usecases/UpdateUsersGroupsUseCase.ts +++ b/src/domain/usecases/UpdateUsersGroupsUseCase.ts @@ -1,18 +1,13 @@ import { UseCase } from "../../CompositionRoot"; import { FutureData } from "../entities/Future"; -import { User } from "../entities/User"; +import { MetadataResponse } from "../entities/Metadata"; import { NamedRef } from "../entities/Ref"; import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; -import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; export class UpdateUsersGroupsUseCase implements UseCase { constructor(private userRepository: UserRepository) {} - public execute( - usersToUpdate: User[], - groupsToUpdate: NamedRef[], - updateStrategy: UpdateStrategy - ): FutureData { - return this.userRepository.updateGroups(usersToUpdate, groupsToUpdate, updateStrategy); + public execute(ids: string[], groups: NamedRef[], strategy: UpdateStrategy): FutureData { + return this.userRepository.updateGroups(ids, groups, strategy); } } diff --git a/src/domain/usecases/UpdateUsersRolesUseCase.ts b/src/domain/usecases/UpdateUsersRolesUseCase.ts index 892fbc0..0656acb 100644 --- a/src/domain/usecases/UpdateUsersRolesUseCase.ts +++ b/src/domain/usecases/UpdateUsersRolesUseCase.ts @@ -1,18 +1,13 @@ import { UseCase } from "../../CompositionRoot"; import { FutureData } from "../entities/Future"; -import { User } from "../entities/User"; +import { MetadataResponse } from "../entities/Metadata"; import { NamedRef } from "../entities/Ref"; import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; -import { MetadataResponse } from "@eyeseetea/d2-api/2.34"; export class UpdateUsersRolesUseCase implements UseCase { constructor(private userRepository: UserRepository) {} - public execute( - usersToUpdate: User[], - rolesToUpdate: NamedRef[], - updateStrategy: UpdateStrategy - ): FutureData { - return this.userRepository.updateRoles(usersToUpdate, rolesToUpdate, updateStrategy); + public execute(ids: string[], roles: NamedRef[], strategy: UpdateStrategy): FutureData { + return this.userRepository.updateRoles(ids, roles, strategy); } } diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 91b20f6..73ce98f 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -8,8 +8,6 @@ import PropTypes from "prop-types"; import React from "react"; import i18n from "../../locales"; import { UserListTable } from "../../webapp/components/user-list-table/UserListTable"; -import { UserRolesSelector } from "../../webapp/components/user-roles-selector/UserRolesSelector"; -import { UserGroupsSelector } from "../../webapp/components/user-groups-selector/UserGroupsSelector"; import CopyInUserDialog from "../components/CopyInUserDialog.component"; import ImportExport from "../components/ImportExport.component"; import ImportTable from "../components/ImportTable.component"; @@ -27,8 +25,6 @@ import Filters from "./Filters.component"; import orgUnitDialogStore from "./organisation-unit-dialog/organisationUnitDialogStore"; import OrgUnitDialog from "./organisation-unit-dialog/OrgUnitDialog.component"; import replicateUserStore from "./replicateUser.store"; -import userGroupsAssignmentDialogStore from "./userGroups.store"; -import userRolesAssignmentDialogStore from "./userRoles.store"; const initialSorting = ["name", "asc"]; @@ -88,12 +84,6 @@ export class ListHybrid extends React.Component { orgunitassignment: { open: false, }, - assignUserRoles: { - open: false, - }, - assignUserGroups: { - open: false, - }, replicateUser: { open: false, }, @@ -129,16 +119,6 @@ export class ListHybrid extends React.Component { this.setAssignState("orgunitassignment", orgunitassignmentState); }); - const userRolesAssignmentDialogStoreDisposable = userRolesAssignmentDialogStore.subscribe(assignUserRoles => { - this.setAssignState("assignUserRoles", assignUserRoles); - }); - - const userGroupsAssignmentDialogStoreDisposable = userGroupsAssignmentDialogStore.subscribe( - assignUserGroups => { - this.setAssignState("assignUserGroups", assignUserGroups); - } - ); - const replicateUserDialogStoreDisposable = replicateUserStore.subscribe(replicateUser => { this.setAssignState("replicateUser", replicateUser); }); @@ -167,8 +147,6 @@ export class ListHybrid extends React.Component { }); this.registerDisposable(orgUnitAssignmentStoreDisposable); - this.registerDisposable(userRolesAssignmentDialogStoreDisposable); - this.registerDisposable(userGroupsAssignmentDialogStoreDisposable); this.registerDisposable(replicateUserDialogStoreDisposable); this.registerDisposable(deleteUserStoreDisposable); this.registerDisposable(enableStoreDisposable); @@ -329,8 +307,6 @@ export class ListHybrid extends React.Component { const { d2 } = this.context; const { - assignUserRoles, - assignUserGroups, replicateUser, listFilterOptions, copyUsers, @@ -417,22 +393,6 @@ export class ListHybrid extends React.Component { /> ) : null} - {assignUserRoles.open ? ( - userRolesAssignmentDialogStore.setState({ open: false })} - onSave={() => userRolesAssignmentDialogStore.setState({ open: false })} - /> - ) : null} - - {assignUserGroups.open ? ( - userGroupsAssignmentDialogStore.setState({ open: false })} - onSave={() => userGroupsAssignmentDialogStore.setState({ open: false })} - /> - ) : null} - {copyUsers.open ? ( { - const { field, options, orgUnitRoots } = this.props; + const { field, orgUnitRoots } = this.props; const { selected } = this.state; const t = this.getTranslation.bind(this); switch (field) { - case "userGroups": - case "userRoles": { - const selectOptions = options.map(o => ({ value: o.id, text: o.displayName })); - const selectedIds = _(selected).map("id").value(); - - return ( - - ); - } case "organisationUnits": return ( user) - .value(); - const groupIdsByUserId = _(pairs) - .map(([user, userGroupsForUser]) => [user.id, new Set(userGroupsForUser.map(group => group.id))]) - .fromPairs() - .value(); - const getUsersForGroup = group => - group.users - .toArray() - .concat(usersToSave) - .filter(user => !groupIdsByUserId[user.id] || groupIdsByUserId[user.id].has(group.id)) - .map(user => ({ id: user.id })); - const userGroups = _(pairs) - .flatMap(([user, userGroupsForUser]) => _.concat(user.userGroups.toArray(), userGroupsForUser)) - .uniqBy(group => group.id) - .map(userGroup => allUserGroupsById[userGroup.id]) - .compact() - .map(group => _m.imerge(getOwnedPropertyJSON(group), { users: getUsersForGroup(group) })) - .value(); - - return { userGroups }; -} - -function getTitle(getTranslation, users) { - const usernames = users && users.map(user => user.userCredentials.username); - const info = usernames ? _m.joinString(getTranslation, usernames, 3, ", ") : "..."; - return getTranslation("assign_groups") + ": " + info; -} - -function UserGroupsDialog(props, context) { - const { d2 } = context; - const getTranslation = d2.i18n.getTranslation.bind(d2.i18n); - - const modelOptions = { - parentModel: d2.models.users, - parentFields: "id,displayName,userCredentials[username],userGroups[id,name]", - childrenModel: d2.models.userGroups, - childrenFields: ":owner,id,name,users[id]", - getChildren: user => user.userGroups, - getPayload: getPayload, - }; - - return ( - getTitle(getTranslation, users)} - /> - ); -} - -UserGroupsDialog.contextTypes = { - d2: PropTypes.object.isRequired, -}; - -export default UserGroupsDialog; diff --git a/src/legacy/components/UserRolesDialog.component.js b/src/legacy/components/UserRolesDialog.component.js deleted file mode 100644 index 0b11235..0000000 --- a/src/legacy/components/UserRolesDialog.component.js +++ /dev/null @@ -1,53 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import BatchModelsMultiSelectModel from "./batch-models-multi-select/BatchModelsMultiSelect.model"; -import BatchModelsMultiSelectComponent from "./batch-models-multi-select/BatchModelsMultiSelect.component"; -import { getOwnedPropertyJSON } from "d2/lib/model/helpers/json"; -import _m from "../utils/lodash-mixins"; - -function getPayload(allUserRoles, pairs) { - const users = pairs.map(([user, newUserRolesForUser]) => - _m.imerge(getOwnedPropertyJSON(user), { - userCredentials: _m.imerge(user.userCredentials, { - userRoles: newUserRolesForUser.map(role => ({ id: role.id })), - }), - }) - ); - return { users }; -} - -function getTitle(getTranslation, users) { - const usernames = users && users.map(user => user.userCredentials.username); - const info = usernames ? _m.joinString(getTranslation, usernames, 3, ", ") : "..."; - return getTranslation("assign_roles") + ": " + info; -} - -function UserRolesDialog(props, context) { - const { d2 } = context; - const getTranslation = context.d2.i18n.getTranslation.bind(context.d2.i18n); - - const modelOptions = { - parentModel: d2.models.users, - parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin, disabled]", - childrenModel: d2.models.userRoles, - getChildren: user => user.userCredentials.userRoles, - getPayload: getPayload, - }; - - return ( - getTitle(getTranslation, users)} - onSuccess={getTranslation("user_roles_assigned")} - onError={getTranslation("user_roles_assign_error")} - /> - ); -} - -UserRolesDialog.contextTypes = { - d2: PropTypes.object.isRequired, -}; - -export default UserRolesDialog; diff --git a/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx new file mode 100644 index 0000000..483579d --- /dev/null +++ b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx @@ -0,0 +1,127 @@ +import { SegmentedControl, Transfer, TransferOption } from "@dhis2/ui"; +import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; +import _ from "lodash"; +import { useCallback, useEffect, useState } from "react"; +import styled from "styled-components"; +import { Future } from "../../../domain/entities/Future"; +import { NamedRef } from "../../../domain/entities/Ref"; +import { User } from "../../../domain/entities/User"; +import { UpdateStrategy } from "../../../domain/repositories/UserRepository"; +import i18n from "../../../locales"; +import { useAppContext } from "../../contexts/app-context"; +import { ellipsizedList } from "../../utils/list"; + +export const MultiSelectorDialog: React.FC = ({ type, ids, onClose }) => { + const { compositionRoot } = useAppContext(); + const snackbar = useSnackbar(); + + const [users, setUsers] = useState([]); + const [items, setItems] = useState([]); + const [selected, setSelected] = useState([]); + const [updateStrategy, setUpdateStrategy] = useState("merge"); + const title = getTitle(type, users); + + const handleSave = useCallback(() => { + if (users.length === 0) { + snackbar.error("Unable to save users"); + return; + } + + const update = items.filter(({ id }) => selected.includes(id)); + + compositionRoot.users.updateRoles(ids, update, updateStrategy).run( + () => onClose(), + error => snackbar.error(error) + ); + }, [ids, onClose, snackbar, updateStrategy, items, users, selected, compositionRoot]); + + useEffect(() => { + return Future.joinObj({ + roles: compositionRoot.metadata.list(type).map(({ objects }) => objects), + users: compositionRoot.users.get(ids), + }).run( + ({ roles, users }) => { + const roleIds = users.map(user => user.userRoles.map(({ id }) => id)); + const commonRoles = _.intersection(...roleIds); + + setItems(roles); + setUsers(users); + setSelected(commonRoles); + setUpdateStrategy(users.length > 1 ? "merge" : "replace"); + }, + error => snackbar.error(error) + ); + }, [type, ids, compositionRoot, snackbar]); + + return ( + + + + setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} + /> + + setSelected(selected)} + filterable={true} + filterablePicked={true} + filterPlaceholder={i18n.t("Search")} + filterPlaceholderPicked={i18n.t("Search")} + selectedWidth="100%" + optionsWidth="100%" + height="400px" + /> + + ); +}; + +const getTitle = (type: "userRoles" | "userGroups", users: User[]): string => { + const usernames = ellipsizedList(users.map(user => user.username)); + + return type === "userRoles" + ? i18n.t("Assign roles to {{usernames}}", { usernames }) + : i18n.t("Assign groups to {{usernames}}", { usernames }); +}; + +const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { + return options.map(({ id, name }) => ({ value: id, label: name })); +}; + +const Container = styled.div` + display: flex; + justify-content: right; + margin-bottom: 16px; + align-items: center; +`; + +const Label = styled.span` + margin-right: 16px; +`; + +export interface MultiSelectorDialogProps { + // TODO: Add organisation units + type: "userRoles" | "userGroups"; + ids: string[]; + onClose: () => void; +} diff --git a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx b/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx deleted file mode 100644 index 04a391b..0000000 --- a/src/webapp/components/user-groups-selector/UserGroupsSelector.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { useState, useEffect } from "react"; -import { Transfer, TransferOption, SegmentedControl, SegmentedControlOption } from "@dhis2/ui"; -import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; -import { NamedRef } from "../../../domain/entities/Ref"; -import { User } from "../../../domain/entities/User"; -import { Metadata } from "../../../domain/entities/Metadata"; -import { UpdateStrategy } from "../../../domain/repositories/UserRepository"; -import { useAppContext } from "../../contexts/app-context"; -import { ellipsizedList } from "../../utils/list"; -import i18n from "../../../locales"; -import styled from "styled-components"; -import _ from "lodash"; - -const oneUserOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - disabled: true, - }, - { - label: i18n.t("Replace"), - value: "replace", - }, -]; -const defaultOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - }, - { - label: i18n.t("Replace"), - value: "replace", - }, -]; - -export const UserGroupsSelector: React.FC = props => { - const snackbar = useSnackbar(); - const { compositionRoot } = useAppContext(); - const { ids, onCancel, onSave } = props; - const [users, setUsers] = useState([] as User[]); - const [userGroups, setUserGroups] = useState([] as Metadata[]); - const [transferOptions, setTransferOptions] = useState([] as TransferOption[]); - const [selectedGroups, setSelectedGroups] = useState([""]); - const [updateStrategy, setUpdateStrategy] = useState("merge"); - const [segmentedControlOptions, setSegmentedControlOptions] = useState(defaultOptions); - - useEffect(() => { - compositionRoot.metadata - .list("userGroups") - .map(({ objects }) => objects) - .run( - groups => { - setUserGroups(groups); - setTransferOptions(buildTransferOptions(groups)); - }, - error => snackbar.error(i18n.t("Error loading groups: ") + error) - ); - compositionRoot.users.getMany(ids).run( - users => { - setUsers(users); - setSelectedGroups(_.intersection(...users.map(user => user.userGroups.map(({ id }) => id)))); - setUpdateStrategy(users.length > 1 ? "merge" : "replace"); - setSegmentedControlOptions(users.length > 1 ? defaultOptions : oneUserOptions); - }, - error => snackbar.error(i18n.t("Error loading users: ") + error) - ); - }, [ids, compositionRoot.metadata, compositionRoot.users, snackbar]); - - return ( - { - if (users.length > 0) { - compositionRoot.users - .updateGroups( - users, - userGroups.filter(group => selectedGroups.includes(group.id)), - updateStrategy - ) - .run( - () => { - snackbar.success(i18n.t("User groups assigned.")); - onSave(); - }, - error => snackbar.error(i18n.t("Error assigning user groups: ") + error) - ); - } else onCancel(); - }} - > - - - setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} - /> - - setSelectedGroups(payload.selected)} - filterable={true} - filterablePicked={true} - filterPlaceholder={i18n.t("Search group")} - filterPlaceholderPicked={i18n.t("Search group")} - selectedWidth="100%" - optionsWidth="100%" - height="400px" - /> - - ); -}; - -const getTitle = (users: User[]): string => { - const usernames = users && users.map(user => user.username); - return i18n.t("Assign groups: ") + (usernames ? ellipsizedList(usernames) : "..."); -}; - -const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { - return options.map(({ id, name }) => ({ value: id, label: name })); -}; - -const Container = styled.div` - display: flex; - justify-content: right; - margin-bottom: 16px; - align-items: center; -`; - -const Label = styled.span` - margin-right: 16px; -`; - -export interface UserGroupsSelectorProps { - ids: string[]; - onCancel: () => void; - onSave: () => void; -} diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index d357c20..0470f10 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -1,6 +1,4 @@ import { - ConfirmationDialog, - ConfirmationDialogProps, ObjectsList, ObjectsTableProps, Pager, @@ -9,7 +7,7 @@ import { TablePagination, TableSorting, useObjectsTable, - useSnackbar, + useSnackbar } from "@eyeseetea/d2-ui-components"; import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; @@ -25,15 +23,17 @@ import copyInUserStore from "../../../legacy/List/copyInUser.store"; import deleteUserStore from "../../../legacy/List/deleteUser.store"; import enableStore from "../../../legacy/List/enable.store"; import replicateUserStore from "../../../legacy/List/replicateUser.store"; -import userGroupsAssignmentDialogStore from "../../../legacy/List/userGroups.store"; -import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store"; import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; +import { + MultiSelectorDialog, + MultiSelectorDialogProps +} from "../multi-selector-dialog/MultiSelectorDialog"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); - const [dialogProps, _openDialog] = useState(); + const [multiSelectorDialogProps, openMultiSelectorDialog] = useState(); const enableReplicate = hasReplicateAuthority(currentUser); const snackbar = useSnackbar(); @@ -117,7 +117,12 @@ export const UserListTable: React.FC = props => { text: i18n.t("Assign roles"), multiple: true, icon: assignment, - onClick: users => userRolesAssignmentDialogStore.setState({ users, open: true }), + onClick: ids => + openMultiSelectorDialog({ + type: "userRoles", + ids, + onClose: () => openMultiSelectorDialog(undefined), + }), isActive: checkAccess(["update"]), }, { @@ -125,7 +130,12 @@ export const UserListTable: React.FC = props => { text: i18n.t("Assign groups"), icon: group_add, multiple: true, - onClick: users => userGroupsAssignmentDialogStore.setState({ users, open: true }), + onClick: ids => + openMultiSelectorDialog({ + type: "userGroups", + ids, + onClose: () => openMultiSelectorDialog(undefined), + }), isActive: checkAccess(["update"]), }, { @@ -233,7 +243,7 @@ export const UserListTable: React.FC = props => { return ( - {dialogProps && } + {multiSelectorDialogProps && } {props.children} diff --git a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx b/src/webapp/components/user-roles-selector/UserRolesSelector.tsx deleted file mode 100644 index 71da9d8..0000000 --- a/src/webapp/components/user-roles-selector/UserRolesSelector.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { useState, useEffect } from "react"; -import { Transfer, TransferOption, SegmentedControl, SegmentedControlOption } from "@dhis2/ui"; -import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; -import { NamedRef } from "../../../domain/entities/Ref"; -import { User } from "../../../domain/entities/User"; -import { Metadata } from "../../../domain/entities/Metadata"; -import { UpdateStrategy } from "../../../domain/repositories/UserRepository"; -import { useAppContext } from "../../contexts/app-context"; -import { ellipsizedList } from "../../utils/list"; -import i18n from "../../../locales"; -import styled from "styled-components"; -import _ from "lodash"; - -const oneUserOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - disabled: true, - }, - { - label: i18n.t("Replace"), - value: "replace", - }, -]; -const defaultOptions: SegmentedControlOption[] = [ - { - label: i18n.t("Merge"), - value: "merge", - }, - { - label: i18n.t("Replace"), - value: "replace", - }, -]; - -export const UserRolesSelector: React.FC = props => { - const snackbar = useSnackbar(); - const { compositionRoot } = useAppContext(); - const { ids, onCancel, onSave } = props; - const [users, setUsers] = useState([] as User[]); - const [userRoles, setUserRoles] = useState([] as Metadata[]); - const [transferOptions, setTransferOptions] = useState([] as TransferOption[]); - const [selectedRoles, setSelectedRoles] = useState([""]); - const [updateStrategy, setUpdateStrategy] = useState("merge"); - const [segmentedControlOptions, setSegmentedControlOptions] = useState(defaultOptions); - - useEffect(() => { - compositionRoot.metadata - .list("userRoles") - .map(({ objects }) => objects) - .run( - roles => { - setUserRoles(roles); - setTransferOptions(buildTransferOptions(roles)); - }, - error => snackbar.error(i18n.t("Error loading roles: ") + error) - ); - compositionRoot.users.getMany(ids).run( - users => { - setUsers(users); - setSelectedRoles(_.intersection(...users.map(user => user.userRoles.map(({ id }) => id)))); - setUpdateStrategy(users.length > 1 ? "merge" : "replace"); - setSegmentedControlOptions(users.length > 1 ? defaultOptions : oneUserOptions); - }, - error => snackbar.error(i18n.t("Error loading users: ") + error) - ); - }, [ids, compositionRoot.metadata, compositionRoot.users, snackbar]); - - return ( - { - if (users.length > 0) { - compositionRoot.users - .updateRoles( - users, - userRoles.filter(role => selectedRoles.includes(role.id)), - updateStrategy - ) - .run( - () => { - snackbar.success(i18n.t("User roles assigned.")); - onSave(); - }, - error => snackbar.error(i18n.t("Error assigning user roles: ") + error) - ); - } else onCancel(); - }} - > - - - setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} - /> - - setSelectedRoles(payload.selected)} - filterable={true} - filterablePicked={true} - filterPlaceholder={i18n.t("Search role")} - filterPlaceholderPicked={i18n.t("Search role")} - selectedWidth="100%" - optionsWidth="100%" - height="400px" - /> - - ); -}; - -const getTitle = (users: User[]): string => { - const usernames = users && users.map(user => user.username); - return i18n.t("Assign roles: ") + (usernames ? ellipsizedList(usernames) : "..."); -}; - -const buildTransferOptions = (options: NamedRef[]): TransferOption[] => { - return options.map(({ id, name }) => ({ value: id, label: name })); -}; - -const Container = styled.div` - display: flex; - justify-content: right; - margin-bottom: 16px; - align-items: center; -`; - -const Label = styled.span` - margin-right: 16px; -`; - -export interface UserRolesSelectorProps { - ids: string[]; - onCancel: () => void; - onSave: () => void; -} From 974f0a517ccdf37623f07a4e0ff773715e8795d8 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 8 Feb 2022 22:32:41 +0100 Subject: [PATCH 136/192] Prettify code Signed-off-by: Alexis Rico --- i18n/en.pot | 40 +++++++++---------- i18n/es.po | 40 +++++++++---------- .../user-list-table/UserListTable.tsx | 7 +--- src/webapp/utils/list.ts | 1 + 4 files changed, 43 insertions(+), 45 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index eba31a7..3dc4c1c 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2022-02-08T21:24:30.377Z\n" -"PO-Revision-Date: 2022-02-08T21:24:30.377Z\n" +"POT-Creation-Date: 2022-02-08T21:32:20.566Z\n" +"PO-Revision-Date: 2022-02-08T21:32:20.566Z\n" msgid "Enable users" msgstr "" @@ -98,6 +98,24 @@ msgstr "" msgid "JSON Response" msgstr "" +msgid "Update strategy: " +msgstr "" + +msgid "Merge" +msgstr "" + +msgid "Replace" +msgstr "" + +msgid "Search" +msgstr "" + +msgid "Assign roles to {{usernames}}" +msgstr "" + +msgid "Assign groups to {{usernames}}" +msgstr "" + msgid "Back" msgstr "" @@ -221,24 +239,6 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" -msgid "Update strategy: " -msgstr "" - -msgid "Merge" -msgstr "" - -msgid "Replace" -msgstr "" - -msgid "Search" -msgstr "" - -msgid "Assign roles to {{usernames}}" -msgstr "" - -msgid "Assign groups to {{usernames}}" -msgstr "" - msgid "Saving users" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 0a4f098..f6c20a8 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-02-08T21:24:30.377Z\n" +"POT-Creation-Date: 2022-02-08T21:32:20.566Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -98,6 +98,25 @@ msgstr "" msgid "JSON Response" msgstr "" +msgid "Update strategy: " +msgstr "" + +msgid "Merge" +msgstr "" + +#, fuzzy +msgid "Replace" +msgstr "Replicar" + +msgid "Search" +msgstr "" + +msgid "Assign roles to {{usernames}}" +msgstr "" + +msgid "Assign groups to {{usernames}}" +msgstr "" + msgid "Back" msgstr "Volver" @@ -221,25 +240,6 @@ msgstr "" msgid "And {{overflow}} more..." msgstr "" -msgid "Update strategy: " -msgstr "" - -msgid "Merge" -msgstr "" - -#, fuzzy -msgid "Replace" -msgstr "Replicar" - -msgid "Search" -msgstr "" - -msgid "Assign roles to {{usernames}}" -msgstr "" - -msgid "Assign groups to {{usernames}}" -msgstr "" - msgid "Saving users" msgstr "" diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 0470f10..c0afe1d 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -7,7 +7,7 @@ import { TablePagination, TableSorting, useObjectsTable, - useSnackbar + useSnackbar, } from "@eyeseetea/d2-ui-components"; import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; @@ -25,10 +25,7 @@ import enableStore from "../../../legacy/List/enable.store"; import replicateUserStore from "../../../legacy/List/replicateUser.store"; import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; -import { - MultiSelectorDialog, - MultiSelectorDialogProps -} from "../multi-selector-dialog/MultiSelectorDialog"; +import { MultiSelectorDialog, MultiSelectorDialogProps } from "../multi-selector-dialog/MultiSelectorDialog"; export const UserListTable: React.FC = props => { const { compositionRoot, currentUser } = useAppContext(); diff --git a/src/webapp/utils/list.ts b/src/webapp/utils/list.ts index 070d938..936e40b 100644 --- a/src/webapp/utils/list.ts +++ b/src/webapp/utils/list.ts @@ -4,5 +4,6 @@ import _ from "lodash"; export function ellipsizedList(items: string[], limit = 3): string { const overflow = items.length - limit; const hasOverflow = overflow > 0; + return _.take(items, limit).join(", ") + (hasOverflow ? i18n.t(" and {{overflow}} more...", { overflow }) : ""); } From 0375604855b0278d3289eecf4c8a04f8fb37faad Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Tue, 8 Feb 2022 22:34:38 +0100 Subject: [PATCH 137/192] Remove fuzzy translation Signed-off-by: Alexis Rico --- i18n/es.po | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/i18n/es.po b/i18n/es.po index f6c20a8..05a79b9 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -104,9 +104,8 @@ msgstr "" msgid "Merge" msgstr "" -#, fuzzy msgid "Replace" -msgstr "Replicar" +msgstr "" msgid "Search" msgstr "" From b4a183dcb7bea8d847119c046060ae02879df00c Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Wed, 9 Feb 2022 09:30:19 +0100 Subject: [PATCH 138/192] Add GetColumns and SaveColumns use cases --- src/CompositionRoot.ts | 4 ++++ src/data/repositories/UserD2ApiRepository.ts | 13 +++++++++++++ src/domain/repositories/UserRepository.ts | 2 ++ src/domain/usecases/GetColumnsUseCase.ts | 11 +++++++++++ src/domain/usecases/SaveColumnsUseCase.ts | 11 +++++++++++ 5 files changed, 41 insertions(+) create mode 100644 src/domain/usecases/GetColumnsUseCase.ts create mode 100644 src/domain/usecases/SaveColumnsUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index 591af64..7245740 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -2,12 +2,14 @@ import { Instance } from "./data/entities/Instance"; import { InstanceD2ApiRepository } from "./data/repositories/InstanceD2ApiRepository"; import { MetadataD2ApiRepository } from "./data/repositories/MetadataD2ApiRepository"; import { UserD2ApiRepository } from "./data/repositories/UserD2ApiRepository"; +import { GetColumnsUseCase } from "./domain/usecases/GetColumnsUseCase"; import { GetCurrentUserUseCase } from "./domain/usecases/GetCurrentUserUseCase"; import { GetInstanceVersionUseCase } from "./domain/usecases/GetInstanceVersionUseCase"; import { GetUserByIdUseCase } from "./domain/usecases/GetUserByIdUseCase"; import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; +import { SaveColumnsUseCase } from "./domain/usecases/SaveColumnsUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; export function getCompositionRoot(instance: Instance) { @@ -25,6 +27,8 @@ export function getCompositionRoot(instance: Instance) { listAllIds: new ListAllUserIdsUseCase(userRepository), get: new GetUserByIdUseCase(userRepository), save: new SaveUsersUseCase(userRepository), + getColumns: new GetColumnsUseCase(userRepository), + saveColumns: new SaveColumnsUseCase(userRepository), }), metadata: getExecute({ list: new ListMetadataUseCase(metadataRepository), diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index d489ffa..10290d7 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -7,14 +7,19 @@ import { ListOptions, UserRepository } from "../../domain/repositories/UserRepos import { cache } from "../../utils/cache"; import { getD2APiFromInstance } from "../../utils/d2-api"; import { apiToFuture } from "../../utils/futures"; +import { DataStoreStorageClient } from "../clients/storage/DataStoreStorageClient"; +import { Namespaces } from "../clients/storage/Namespaces"; +import { StorageClient } from "../clients/storage/StorageClient"; import { Instance } from "../entities/Instance"; import { ApiUserModel } from "../models/UserModel"; export class UserD2ApiRepository implements UserRepository { private api: D2Api; + private storageClient: StorageClient; constructor(instance: Instance) { this.api = getD2APiFromInstance(instance); + this.storageClient = new DataStoreStorageClient("user", instance); } @cache() @@ -122,6 +127,14 @@ export class UserD2ApiRepository implements UserRepository { }); } + public getColumns(): FutureData { + return this.storageClient.getObject(Namespaces.CONFIG).map(value => value ?? []); + } + + public saveColumns(columns: string[]): FutureData { + return this.storageClient.saveObject(Namespaces.CONFIG, columns); + } + private getGroupsToSave(users: ApiUser[], existing: ApiUser[]) { const userIds = users.map(({ id }) => id); const groupDictionary = _(users) diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 1d36b98..0903749 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -9,6 +9,8 @@ export interface UserRepository { listAllIds(options: ListOptions): FutureData; getById(id: string): FutureData; save(users: User[]): FutureData; + getColumns(): FutureData; + saveColumns(columns: string[]): FutureData; } export interface ListOptions { diff --git a/src/domain/usecases/GetColumnsUseCase.ts b/src/domain/usecases/GetColumnsUseCase.ts new file mode 100644 index 0000000..adcf224 --- /dev/null +++ b/src/domain/usecases/GetColumnsUseCase.ts @@ -0,0 +1,11 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { UserRepository } from "../repositories/UserRepository"; + +export class GetColumnsUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + execute(): FutureData { + return this.userRepository.getColumns(); + } +} diff --git a/src/domain/usecases/SaveColumnsUseCase.ts b/src/domain/usecases/SaveColumnsUseCase.ts new file mode 100644 index 0000000..9c6b941 --- /dev/null +++ b/src/domain/usecases/SaveColumnsUseCase.ts @@ -0,0 +1,11 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { UserRepository } from "../repositories/UserRepository"; + +export class SaveColumnsUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + execute(columns: string[]): FutureData { + return this.userRepository.saveColumns(columns); + } +} From 79492998015c327bb1a27fecec6fd0b24c916788 Mon Sep 17 00:00:00 2001 From: p3rcypj Date: Wed, 9 Feb 2022 09:34:55 +0100 Subject: [PATCH 139/192] Add save columns onReorderedColumns and useEffect for getting columns --- .../user-list-table/UserListTable.tsx | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index d357c20..e76f08e 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -15,7 +15,7 @@ import { Icon, Tooltip } from "@material-ui/core"; import { Check, Tune } from "@material-ui/icons"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import _ from "lodash"; -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useMemo, useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { NamedRef } from "../../../domain/entities/Ref"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; @@ -31,9 +31,11 @@ import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; export const UserListTable: React.FC = props => { + const { onChangeVisibleColumns } = props; const { compositionRoot, currentUser } = useAppContext(); const [dialogProps, _openDialog] = useState(); + const [visibleColumns, setVisibleColumns] = useState(); const enableReplicate = hasReplicateAuthority(currentUser); const snackbar = useSnackbar(); @@ -54,6 +56,18 @@ export const UserListTable: React.FC = props => { [navigate, compositionRoot, snackbar] ); + const saveReorderedColumns = useCallback( + (columnKeys: Array) => { + if (!visibleColumns) return; + + compositionRoot.users.saveColumns(columnKeys).run( + () => {}, + error => snackbar.error(error) + ); + }, + [compositionRoot.users, visibleColumns, snackbar] + ); + const baseConfig = useMemo((): TableConfig => { return { columns, @@ -193,9 +207,9 @@ export const UserListTable: React.FC = props => { pageSizeInitialValue: 25, }, searchBoxLabel: i18n.t("Search by name or username..."), - onReorderColumns: props.onChangeVisibleColumns, + onReorderColumns: saveReorderedColumns, }; - }, [props, enableReplicate, editUsers]); + }, [props, enableReplicate, editUsers, saveReorderedColumns]); const refreshRows = useCallback( ( @@ -231,11 +245,37 @@ export const UserListTable: React.FC = props => { const tableProps = useObjectsTable(baseConfig, refreshRows, refreshAllIds); + const columnsToShow = useMemo[]>(() => { + if (!visibleColumns || _.isEmpty(visibleColumns)) return tableProps.columns; + console.log("visibleColumns in show"); + console.log(visibleColumns); + const indexes = _(visibleColumns) + .map((columnName, idx) => [columnName, idx] as [string, number]) + .fromPairs() + .value(); + + return _(tableProps.columns) + .map(column => ({ ...column, hidden: !visibleColumns.includes(column.name) })) + .sortBy(column => indexes[column.name] || 0) + .value(); + }, [tableProps.columns, visibleColumns]); + + useEffect(() => { + compositionRoot.users.getColumns().run( + columns => { + setVisibleColumns(columns); + }, + error => snackbar.error(error) + ); + }, [compositionRoot.users, snackbar]); + return ( {dialogProps && } - {props.children} + {...tableProps} columns={columnsToShow}> + {props.children} + ); }; From c1970093ea011418d274229be7473afb438069bb Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 9 Feb 2022 10:20:56 +0100 Subject: [PATCH 140/192] Code review Signed-off-by: Alexis Rico --- .../user-list-table/UserListTable.tsx | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index e76f08e..9894dd3 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -30,8 +30,12 @@ import userRolesAssignmentDialogStore from "../../../legacy/List/userRoles.store import i18n from "../../../locales"; import { useAppContext } from "../../contexts/app-context"; -export const UserListTable: React.FC = props => { - const { onChangeVisibleColumns } = props; +export const UserListTable: React.FC = ({ + openSettings, + onChangeVisibleColumns, + filters, + children, +}) => { const { compositionRoot, currentUser } = useAppContext(); const [dialogProps, _openDialog] = useState(); @@ -65,7 +69,7 @@ export const UserListTable: React.FC = props => { error => snackbar.error(error) ); }, - [compositionRoot.users, visibleColumns, snackbar] + [compositionRoot, visibleColumns, snackbar] ); const baseConfig = useMemo((): TableConfig => { @@ -188,7 +192,7 @@ export const UserListTable: React.FC = props => { name: "open-settings", text: i18n.t("Settings"), icon: , - onClick: () => props.openSettings(), + onClick: () => openSettings(), }, ], // TODO: Bug in ObjectsList @@ -209,7 +213,7 @@ export const UserListTable: React.FC = props => { searchBoxLabel: i18n.t("Search by name or username..."), onReorderColumns: saveReorderedColumns, }; - }, [props, enableReplicate, editUsers, saveReorderedColumns]); + }, [openSettings, enableReplicate, editUsers, saveReorderedColumns]); const refreshRows = useCallback( ( @@ -223,11 +227,11 @@ export const UserListTable: React.FC = props => { page, pageSize, sorting, - filters: props?.filters, + filters, }) .toPromise(); }, - [compositionRoot, props.filters] + [compositionRoot, filters] ); const refreshAllIds = useCallback( @@ -236,26 +240,23 @@ export const UserListTable: React.FC = props => { .listAllIds({ search, sorting, - filters: props?.filters, + filters, }) .toPromise(); }, - [compositionRoot, props.filters] + [compositionRoot, filters] ); const tableProps = useObjectsTable(baseConfig, refreshRows, refreshAllIds); const columnsToShow = useMemo[]>(() => { - if (!visibleColumns || _.isEmpty(visibleColumns)) return tableProps.columns; - console.log("visibleColumns in show"); - console.log(visibleColumns); const indexes = _(visibleColumns) .map((columnName, idx) => [columnName, idx] as [string, number]) .fromPairs() .value(); return _(tableProps.columns) - .map(column => ({ ...column, hidden: !visibleColumns.includes(column.name) })) + .map(column => ({ ...column, hidden: !visibleColumns?.includes(column.name) })) .sortBy(column => indexes[column.name] || 0) .value(); }, [tableProps.columns, visibleColumns]); @@ -264,17 +265,18 @@ export const UserListTable: React.FC = props => { compositionRoot.users.getColumns().run( columns => { setVisibleColumns(columns); + onChangeVisibleColumns(columns); }, error => snackbar.error(error) ); - }, [compositionRoot.users, snackbar]); + }, [compositionRoot, snackbar, onChangeVisibleColumns]); return ( {dialogProps && } {...tableProps} columns={columnsToShow}> - {props.children} + {children} ); From cad0284e5899542e0b1cfe6d8e55b6a8f0b9f41b Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 9 Feb 2022 10:34:18 +0100 Subject: [PATCH 141/192] Merge usecases Signed-off-by: Alexis Rico --- src/CompositionRoot.ts | 6 ++---- src/domain/usecases/UpdateUserPropUseCase.ts | 20 +++++++++++++++++++ .../usecases/UpdateUsersRolesUseCase.ts | 13 ------------ .../MultiSelectorDialog.tsx | 12 +++++------ 4 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 src/domain/usecases/UpdateUserPropUseCase.ts delete mode 100644 src/domain/usecases/UpdateUsersRolesUseCase.ts diff --git a/src/CompositionRoot.ts b/src/CompositionRoot.ts index fcf14e2..6774fed 100644 --- a/src/CompositionRoot.ts +++ b/src/CompositionRoot.ts @@ -9,8 +9,7 @@ import { ListAllUserIdsUseCase } from "./domain/usecases/ListAllUserIdsUseCase"; import { ListMetadataUseCase } from "./domain/usecases/ListMetadataUseCase"; import { ListUsersUseCase } from "./domain/usecases/ListUsersUseCase"; import { SaveUsersUseCase } from "./domain/usecases/SaveUsersUseCase"; -import { UpdateUsersGroupsUseCase } from "./domain/usecases/UpdateUsersGroupsUseCase"; -import { UpdateUsersRolesUseCase } from "./domain/usecases/UpdateUsersRolesUseCase"; +import { UpdateUserPropUseCase } from "./domain/usecases/UpdateUserPropUseCase"; export function getCompositionRoot(instance: Instance) { const instanceRepository = new InstanceD2ApiRepository(instance); @@ -27,8 +26,7 @@ export function getCompositionRoot(instance: Instance) { listAllIds: new ListAllUserIdsUseCase(userRepository), get: new GetUsersByIdsUseCase(userRepository), save: new SaveUsersUseCase(userRepository), - updateRoles: new UpdateUsersRolesUseCase(userRepository), - updateGroups: new UpdateUsersGroupsUseCase(userRepository), + updateProp: new UpdateUserPropUseCase(userRepository), }), metadata: getExecute({ list: new ListMetadataUseCase(metadataRepository), diff --git a/src/domain/usecases/UpdateUserPropUseCase.ts b/src/domain/usecases/UpdateUserPropUseCase.ts new file mode 100644 index 0000000..1fffe1f --- /dev/null +++ b/src/domain/usecases/UpdateUserPropUseCase.ts @@ -0,0 +1,20 @@ +import { UseCase } from "../../CompositionRoot"; +import { FutureData } from "../entities/Future"; +import { MetadataResponse } from "../entities/Metadata"; +import { NamedRef } from "../entities/Ref"; +import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; + +export class UpdateUserPropUseCase implements UseCase { + constructor(private userRepository: UserRepository) {} + + public execute(prop: "userRoles" | "userGroups", ids: string[], roles: NamedRef[], strategy: UpdateStrategy): FutureData { + switch (prop) { + case "userRoles": + return this.userRepository.updateRoles(ids, roles, strategy); + case "userGroups": + return this.userRepository.updateGroups(ids, roles, strategy); + default: + throw new Error(`Unknown property: ${prop}`); + } + } +} diff --git a/src/domain/usecases/UpdateUsersRolesUseCase.ts b/src/domain/usecases/UpdateUsersRolesUseCase.ts deleted file mode 100644 index 0656acb..0000000 --- a/src/domain/usecases/UpdateUsersRolesUseCase.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UseCase } from "../../CompositionRoot"; -import { FutureData } from "../entities/Future"; -import { MetadataResponse } from "../entities/Metadata"; -import { NamedRef } from "../entities/Ref"; -import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; - -export class UpdateUsersRolesUseCase implements UseCase { - constructor(private userRepository: UserRepository) {} - - public execute(ids: string[], roles: NamedRef[], strategy: UpdateStrategy): FutureData { - return this.userRepository.updateRoles(ids, roles, strategy); - } -} diff --git a/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx index 483579d..5fc5390 100644 --- a/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx +++ b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx @@ -29,22 +29,22 @@ export const MultiSelectorDialog: React.FC = ({ type, const update = items.filter(({ id }) => selected.includes(id)); - compositionRoot.users.updateRoles(ids, update, updateStrategy).run( + compositionRoot.users.updateProp(type, ids, update, updateStrategy).run( () => onClose(), error => snackbar.error(error) ); - }, [ids, onClose, snackbar, updateStrategy, items, users, selected, compositionRoot]); + }, [type, ids, onClose, snackbar, updateStrategy, items, users, selected, compositionRoot]); useEffect(() => { return Future.joinObj({ - roles: compositionRoot.metadata.list(type).map(({ objects }) => objects), + items: compositionRoot.metadata.list(type).map(({ objects }) => objects), users: compositionRoot.users.get(ids), }).run( - ({ roles, users }) => { - const roleIds = users.map(user => user.userRoles.map(({ id }) => id)); + ({ items, users }) => { + const roleIds = users.map(user => user[type].map(({ id }) => id)); const commonRoles = _.intersection(...roleIds); - setItems(roles); + setItems(items); setUsers(users); setSelected(commonRoles); setUpdateStrategy(users.length > 1 ? "merge" : "replace"); From ba8153383ce09e2bffbf0b8aee1b931610dd2b99 Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 9 Feb 2022 10:53:37 +0100 Subject: [PATCH 142/192] Update code with loading spiner Signed-off-by: Alexis Rico --- i18n/en.pot | 7 ++----- i18n/es.po | 5 +---- src/domain/usecases/UpdateUserPropUseCase.ts | 7 ++++++- src/types/d2-ui.d.ts | 8 ++++---- .../MultiSelectorDialog.tsx | 16 ++++++++++++---- src/webapp/utils/list.ts | 2 +- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/i18n/en.pot b/i18n/en.pot index 3dc4c1c..23e3806 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2022-02-08T21:32:20.566Z\n" -"PO-Revision-Date: 2022-02-08T21:32:20.566Z\n" +"POT-Creation-Date: 2022-02-09T09:43:58.960Z\n" +"PO-Revision-Date: 2022-02-09T09:43:58.960Z\n" msgid "Enable users" msgstr "" @@ -98,9 +98,6 @@ msgstr "" msgid "JSON Response" msgstr "" -msgid "Update strategy: " -msgstr "" - msgid "Merge" msgstr "" diff --git a/i18n/es.po b/i18n/es.po index 05a79b9..3ca3963 100644 --- a/i18n/es.po +++ b/i18n/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: i18next-conv\n" -"POT-Creation-Date: 2022-02-08T21:32:20.566Z\n" +"POT-Creation-Date: 2022-02-09T09:43:58.960Z\n" "PO-Revision-Date: 2018-10-25T09:02:35.143Z\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -98,9 +98,6 @@ msgstr "" msgid "JSON Response" msgstr "" -msgid "Update strategy: " -msgstr "" - msgid "Merge" msgstr "" diff --git a/src/domain/usecases/UpdateUserPropUseCase.ts b/src/domain/usecases/UpdateUserPropUseCase.ts index 1fffe1f..7e04ca0 100644 --- a/src/domain/usecases/UpdateUserPropUseCase.ts +++ b/src/domain/usecases/UpdateUserPropUseCase.ts @@ -7,7 +7,12 @@ import { UpdateStrategy, UserRepository } from "../repositories/UserRepository"; export class UpdateUserPropUseCase implements UseCase { constructor(private userRepository: UserRepository) {} - public execute(prop: "userRoles" | "userGroups", ids: string[], roles: NamedRef[], strategy: UpdateStrategy): FutureData { + public execute( + prop: "userRoles" | "userGroups", + ids: string[], + roles: NamedRef[], + strategy: UpdateStrategy + ): FutureData { switch (prop) { case "userRoles": return this.userRepository.updateRoles(ids, roles, strategy); diff --git a/src/types/d2-ui.d.ts b/src/types/d2-ui.d.ts index 7383c99..dbb25b5 100644 --- a/src/types/d2-ui.d.ts +++ b/src/types/d2-ui.d.ts @@ -183,10 +183,10 @@ declare module "@dhis2/ui" { disabled?: boolean; }; - export type SegmentedControlProps = { + export type SegmentedControlProps = { options: SegmentedControlOption[]; - selected: string; - onChange: (data: { value?: string }, event: ChangeEvent) => void; + selected: T; + onChange: (data: { value?: T }, event: ChangeEvent) => void; }; export type SingleSelectFieldProps = { @@ -397,7 +397,7 @@ declare module "@dhis2/ui" { export function Button(props: ButtonProps): React.ReactElement; export function Transfer(props: TransferProps): React.ReactElement; export function MultiSelect(props: MultiSelectProps): React.ReactElement; - export function SegmentedControl(props: SegmentedControlProps): React.ReactElement; + export function SegmentedControl(props: SegmentedControlProps): React.ReactElement; export function SingleSelectFieldFF(props: SingleSelectFieldFFProps): React.ReactElement; export function SingleSelectField(props: SingleSelectFieldProps): React.ReactElement; export function SingleSelectOption(props: SingleSelectOptionProps): React.ReactElement; diff --git a/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx index 5fc5390..64a67f8 100644 --- a/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx +++ b/src/webapp/components/multi-selector-dialog/MultiSelectorDialog.tsx @@ -1,5 +1,5 @@ import { SegmentedControl, Transfer, TransferOption } from "@dhis2/ui"; -import { ConfirmationDialog, useSnackbar } from "@eyeseetea/d2-ui-components"; +import { ConfirmationDialog, useLoading, useSnackbar } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import { useCallback, useEffect, useState } from "react"; import styled from "styled-components"; @@ -14,6 +14,7 @@ import { ellipsizedList } from "../../utils/list"; export const MultiSelectorDialog: React.FC = ({ type, ids, onClose }) => { const { compositionRoot } = useAppContext(); const snackbar = useSnackbar(); + const loading = useLoading(); const [users, setUsers] = useState([]); const [items, setItems] = useState([]); @@ -27,13 +28,17 @@ export const MultiSelectorDialog: React.FC = ({ type, return; } + loading.show(true, i18n.t("Saving users")); const update = items.filter(({ id }) => selected.includes(id)); compositionRoot.users.updateProp(type, ids, update, updateStrategy).run( - () => onClose(), + () => { + onClose(); + loading.reset(); + }, error => snackbar.error(error) ); - }, [type, ids, onClose, snackbar, updateStrategy, items, users, selected, compositionRoot]); + }, [type, ids, onClose, snackbar, updateStrategy, items, users, selected, compositionRoot, loading]); useEffect(() => { return Future.joinObj({ @@ -64,6 +69,7 @@ export const MultiSelectorDialog: React.FC = ({ type, > + = ({ type, }, ]} selected={updateStrategy} - onChange={data => setUpdateStrategy((data.value as UpdateStrategy) ?? "merge")} + onChange={({ value }) => setUpdateStrategy(value ?? "merge")} /> + 0; - + return _.take(items, limit).join(", ") + (hasOverflow ? i18n.t(" and {{overflow}} more...", { overflow }) : ""); } From b57dd0b9b67e9383151d8a189e191010ab90792c Mon Sep 17 00:00:00 2001 From: Alexis Rico Date: Wed, 9 Feb 2022 10:56:45 +0100 Subject: [PATCH 143/192] Add return to useEffect --- src/webapp/components/user-list-table/UserListTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index 9894dd3..12accdd 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -262,7 +262,7 @@ export const UserListTable: React.FC = ({ }, [tableProps.columns, visibleColumns]); useEffect(() => { - compositionRoot.users.getColumns().run( + return compositionRoot.users.getColumns().run( columns => { setVisibleColumns(columns); onChangeVisibleColumns(columns); From 421b9e4be31887da44e134a99b4d2ead0871c94d Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Wed, 9 Feb 2022 12:52:09 +0100 Subject: [PATCH 144/192] Copied over files from predictors-extended app files as template for user edit page --- src/webapp/components/user-form/UserForm.tsx | 27 +++++ .../user-list-table/UserListTable.tsx | 10 +- src/webapp/pages/Router.tsx | 2 + src/webapp/pages/user-edit/UserEditPage.tsx | 99 +++++++++++++++++++ 4 files changed, 135 insertions(+), 3 deletions(-) diff --git a/src/webapp/components/user-form/UserForm.tsx b/src/webapp/components/user-form/UserForm.tsx index 5187774..982f968 100644 --- a/src/webapp/components/user-form/UserForm.tsx +++ b/src/webapp/components/user-form/UserForm.tsx @@ -120,3 +120,30 @@ export const RenderUserImportField: React.FC<{ row: number; field: UserFormField return ; } }; + +export const RenderUserImportField2: React.FC<{ row: number; field: UserFormField }> = ({ row, field }) => { + const name = `users[${row}].${field}`; + + const { validation, props: validationProps = {} } = useValidations(field); + const props = { + name, + placeholder: getUserFieldName(field), + validate: validation, + ...validationProps, + }; + + // Complex field PopUp + switch (field) { + case "userGroups": + case "userRoles": + case "organisationUnits": + case "dataViewOrganisationUnits": + return ( + + + + ); + default: + return ; + } +}; diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index d357c20..8d2f762 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -20,7 +20,9 @@ import { useNavigate } from "react-router-dom"; import { NamedRef } from "../../../domain/entities/Ref"; import { hasReplicateAuthority, User } from "../../../domain/entities/User"; import { ListFilters } from "../../../domain/repositories/UserRepository"; -import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; +// Remove unused import +// import { assignToOrgUnits, goToUserEditPage } from "../../../legacy/List/context.actions"; +import { assignToOrgUnits } from "../../../legacy/List/context.actions"; import copyInUserStore from "../../../legacy/List/copyInUser.store"; import deleteUserStore from "../../../legacy/List/deleteUser.store"; import enableStore from "../../../legacy/List/enable.store"; @@ -42,8 +44,10 @@ export const UserListTable: React.FC = props => { const editUsers = useCallback( (ids: string[]) => { if (ids.length === 1) { - goToUserEditPage(ids[0]); - return; + // goToUserEditPage(ids[0]); + // return; + // Change to appropiete redirect + navigate(`/edit/${ids[0]}`) } compositionRoot.users.list({ filters: { id: ["in", ids] } }).run( diff --git a/src/webapp/pages/Router.tsx b/src/webapp/pages/Router.tsx index 52fddd1..de437c8 100644 --- a/src/webapp/pages/Router.tsx +++ b/src/webapp/pages/Router.tsx @@ -4,6 +4,7 @@ import { LegacyAppWrapper } from "../../legacy/LegacyApp"; import { ListHybrid } from "../../legacy/List/List.component"; import { useAppContext } from "../contexts/app-context"; import { UserBulkEditPage } from "./user-bulk-edit/UserBulkEditPage"; +import { UserEditPage } from "./user-edit/UserEditPage"; export const Router: React.FC = React.memo(() => { const { api } = useAppContext(); @@ -12,6 +13,7 @@ export const Router: React.FC = React.memo(() => { } /> + } /> { + const { baseUrl } = useConfig(); + const { compositionRoot } = useAppContext(); + const { type = "edit", id } = useParams(); + // Check type User + const location = useLocation() as any; + + const snackbar = useSnackbar(); + const goBack = useGoBack(); + + const [user, setUser] = useState(location.state?.user); + + const isValidEdit = id !== undefined || location.state?.user !== undefined; + const title = type === "edit" && isValidEdit ? i18n.t("Edit user") : i18n.t("New user"); + + const saveUser = useCallback( + async (user: User) => { + const { data = [], error } = await compositionRoot.users.save([user]).runAsync(); + if (error || _.some(data, ({ status }) => status === "ERROR")) { + return error ?? i18n.t("Network error"); + } else { + goBack(true); + } + }, + [compositionRoot, goBack] + ); + + const openMaintenance = useCallback(() => { + window + ?.open(`${baseUrl}/dhis-web-maintenance/index.html#/edit/otherSection/user/${id}`, "_blank") + ?.focus(); + }, [baseUrl, id]); + + useEffect(() => { + if (user !== undefined) return; + else if (id === undefined) { + setUser({ ...defaultUser, id: generateUid() }); + return; + } + + compositionRoot.users + .get(id) + .toPromise() + .then((user) => { + if (!user) snackbar.error(i18n.t("Unable to load user {{id}}", { id })); + else setUser(user); + }); + }, [compositionRoot, id, user, setUser, snackbar]); + + return ( + + + {isValidEdit && ( + } onClick={openMaintenance}> + {i18n.t("Open in maintenance")} + + )} + + + {user !== undefined ? ( + + ) : null} + + ); +}; + +const Wrapper = styled.div` + margin: 20px 30px; +`; + +const MaintenanceButton = styled(Button)` + float: right; + margin-top: 2px; + + :focus::after { + border-color: transparent !important; + } +`; From 612e5aac16585f308d4244aa2144435815cb988d Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Wed, 9 Feb 2022 12:55:38 +0100 Subject: [PATCH 145/192] Add UserEditWizard files based on predictors-extended app --- .../user-edit-wizard/UserEditWizard.tsx | 191 ++++++++++++++++++ .../user-edit-wizard/UserEditWizardStep.tsx | 30 +++ 2 files changed, 221 insertions(+) create mode 100644 src/webapp/components/user-edit-wizard/UserEditWizard.tsx create mode 100644 src/webapp/components/user-edit-wizard/UserEditWizardStep.tsx diff --git a/src/webapp/components/user-edit-wizard/UserEditWizard.tsx b/src/webapp/components/user-edit-wizard/UserEditWizard.tsx new file mode 100644 index 0000000..a73c692 --- /dev/null +++ b/src/webapp/components/user-edit-wizard/UserEditWizard.tsx @@ -0,0 +1,191 @@ +import { Button, ButtonStrip, NoticeBox } from "@dhis2/ui"; +import i18n from "@eyeseetea/d2-ui-components/locales"; +import { Paper, Step, StepLabel, Stepper } from "@material-ui/core"; +import { ArrowBack, ArrowForward } from "@material-ui/icons"; +import { FORM_ERROR } from "final-form"; +import _ from "lodash"; +import React, { FunctionComponent, useCallback, useState } from "react"; +import { Form } from "react-final-form"; +import styled from "styled-components"; +import { User } from "../../../domain/entities/User"; +import { useGoBack } from "../../hooks/useGoBack"; +import { UserEditWizardStep, UserEditWizardStepProps } from "./UserEditWizardStep"; + +const steps: WizardStep[] = [ + { + key: `general-info`, + label: i18n.t("General info"), + component: UserEditWizardStep, + props: { + fields: [ + "name", + "code", + "description", + "periodType", + "output", + "organisationUnitLevels", + "userGroups", + ], + }, + }, + { + key: `generator`, + label: i18n.t("Generator"), + component: UserEditWizardStep, + props: { fields: ["generator.description", "generator.expression", "generator.missingValueStrategy"] }, + }, + { + key: `sample`, + label: i18n.t("Samples"), + component: UserEditWizardStep, + props: { + fields: [ + "sequentialSampleCount", + "annualSampleCount", + "sequentialSkipCount", + "sampleSkipTest.description", + "sampleSkipTest.expression", + ], + }, + }, + { + key: `scheduling`, + label: i18n.t("Scheduling"), + component: UserEditWizardStep, + props: { + fields: ["scheduling.sequence", "scheduling.variable"], + }, + }, +]; + +interface WizardStep { + key: string; + label: string; + component: FunctionComponent; + props: UserEditWizardStepProps; +} + +export interface UserEditWizardProps { + user: User; + onCancel: () => void; + onSave: (user: User) => Promise; +} + +export const UserEditWizard: React.FC = ({ user, onSave, onCancel }) => { + const goBack = useGoBack(); + + const onSubmit = useCallback( + async (values: { users: User[] }) => { + const user = values.users[0]; + if (!user) return { [FORM_ERROR]: i18n.t("Error saving user") }; + + const error = await onSave(user); + if (error) return { [FORM_ERROR]: error }; + + goBack(true); + }, + [onSave, goBack] + ); + + return ( + + autocomplete="off" + onSubmit={onSubmit} + initialValues={{ users: [user] }} + render={({ handleSubmit, submitError }) => ( +
    + {submitError && ( + + {submitError} + + )} + + + {steps.map(({ component: Component, props, key }) => ( + + ))} + + + )} + /> + ); +}; + +const Wizard: React.FC<{ onCancel: any }> = ({ children, onCancel }) => { + const [step, setStep] = useState(steps[0]?.key ?? ""); + const index = _.findIndex(steps, ({ key }) => key === step); + const page = index > 0 ? index : 0; + const activePage = React.Children.toArray(children)[page]; + + const onNext = useCallback(() => { + setStep(step => { + const index = steps.findIndex(({ key }) => key === step); + return steps[index + 1]?.key ?? step; + }); + }, []); + + const onPrev = useCallback(() => { + setStep(step => { + const index = steps.findIndex(({ key }) => key === step); + return steps[index - 1]?.key ?? step; + }); + }, []); + + const jumpStep = useCallback((currentStep: string) => setStep(currentStep), []); + + return ( + + + + {steps.map(({ key, label }) => ( + jumpStep(key)}> + {label} + + ))} + + + {activePage} + + + + + + + +
    From 84784284d82fbc42b3cf03d8eeedbe7e77b15d94 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Wed, 15 Jun 2022 13:47:09 +0200 Subject: [PATCH 170/192] Add this.state update switch (boolean value, false == AND) and grid layout for the checkboxes and switch elements. --- src/legacy/List/Filters.component.js | 51 +++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index b081a6c..1ef04bd 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -2,7 +2,7 @@ import { ConfirmationDialog } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import Checkbox from "material-ui/Checkbox/Checkbox"; import IconButton from "material-ui/IconButton"; -import Switch from "@material-ui/core/Switch" +import { Switch, Grid } from "@material-ui/core"; import FilterListIcon from "material-ui/svg-icons/content/filter-list"; import memoize from "memoize-weak"; import PropTypes from "prop-types"; @@ -61,6 +61,7 @@ export default class Filters extends React.Component { searchStringClear: null, showOnlyManagedUsers: false, showOnlyActiveUsers: false, + rootJunction: false, userRoles: [], userGroups: [], orgUnits: [], @@ -167,7 +168,10 @@ export default class Filters extends React.Component { }; }; - checkboxHandler = (ev, isChecked) => isChecked; + checkboxHandler = (ev, isChecked) => { + console.log("this.state (before check): ", this.state) + return isChecked; + }; render() { const { @@ -178,6 +182,7 @@ export default class Filters extends React.Component { showOnlyManagedUsers, showOnlyActiveUsers, showExtendedFilters, + rootJunction, } = this.state; const { styles } = this; @@ -214,24 +219,30 @@ export default class Filters extends React.Component { onInfoAction={isFiltering ? this.clearFilters : undefined} >
    -
    - - - - - -
    - + + + + + + + {this.getTranslation("AND")} + + {this.getTranslation("OR")} + +
    Date: Thu, 16 Jun 2022 11:47:20 +0200 Subject: [PATCH 171/192] Remove console trace, add translation, fix code format and cleanup. --- public/old-i18n/i18n_module_en.properties | 2 ++ public/old-i18n/i18n_module_es.properties | 2 ++ src/legacy/List/Filters.component.js | 9 +++------ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 13c36db..3d41474 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -132,3 +132,5 @@ config_import_export=Import/export setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user +AND=AND +OR=OR \ No newline at end of file diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index c7b6a38..c984f03 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -133,3 +133,5 @@ config_import_export=Importación/Exportación setting_organisation_units_capture_field=Campo para unidades organizativas usando en importación/exportación de usuarios select_one_toggle=Seleccione al menos un modelo a copiar select_at_least_one_user=Seleccione al menos un usuario destino +AND=AND +OR=OR \ No newline at end of file diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 1ef04bd..bfbfe7a 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -168,10 +168,7 @@ export default class Filters extends React.Component { }; }; - checkboxHandler = (ev, isChecked) => { - console.log("this.state (before check): ", this.state) - return isChecked; - }; + checkboxHandler = (ev, isChecked) => isChecked; render() { const { @@ -237,8 +234,8 @@ export default class Filters extends React.Component { {this.getTranslation("AND")} {this.getTranslation("OR")} From aeb857fdac23e097484df5074eea2851c848f1c1 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 16 Jun 2022 12:35:58 +0200 Subject: [PATCH 172/192] Add switch describing text. Add translations. --- public/old-i18n/i18n_module_ar.properties | 3 +++ public/old-i18n/i18n_module_en.properties | 3 ++- public/old-i18n/i18n_module_es.properties | 3 ++- public/old-i18n/i18n_module_fr.properties | 3 +++ src/legacy/List/Filters.component.js | 16 ++++++++++------ 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index a25d59d..e5fcc4d 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -132,3 +132,6 @@ config_import_export=Import/export setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user +AND=AND +OR=OR +Filtering_behavior=Filtering behavior diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 3d41474..0167b58 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -133,4 +133,5 @@ setting_organisation_units_capture_field=Organisation Units Capture field used f select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user AND=AND -OR=OR \ No newline at end of file +OR=OR +Filtering_behavior=Filtering behavior diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index c984f03..02d9465 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -134,4 +134,5 @@ setting_organisation_units_capture_field=Campo para unidades organizativas usand select_one_toggle=Seleccione al menos un modelo a copiar select_at_least_one_user=Seleccione al menos un usuario destino AND=AND -OR=OR \ No newline at end of file +OR=OR +Filtering_behavior=Tipo de filtrado diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index ac8f184..78a65a3 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -132,3 +132,6 @@ config_import_export=Import/export setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user +AND=AND +OR=OR +Filtering_behavior=Type de filtrage diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index bfbfe7a..ea80230 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -232,12 +232,16 @@ export default class Filters extends React.Component { /> - {this.getTranslation("AND")} - - {this.getTranslation("OR")} + {this.getTranslation("Filtering_behavior")} +
    + {this.getTranslation("AND")} + + {this.getTranslation("OR")} +
    From fa309a0ab7b70d5c79d12f14c81a94e915e9682b Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Wed, 22 Jun 2022 09:35:27 +0200 Subject: [PATCH 173/192] Work in progress - AND/OR filter --- src/data/repositories/UserD2ApiRepository.ts | 10 +++++++++- src/domain/repositories/UserRepository.ts | 1 + src/legacy/List/Filters.component.js | 15 ++++++++++----- .../components/user-list-table/UserListTable.tsx | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 315878f..b64112e 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -29,7 +29,14 @@ export class UserD2ApiRepository implements UserRepository { } public list(options: ListOptions): FutureData> { - const { page, pageSize, search, sorting = { field: "firstName", order: "asc" }, filters } = options; + const { + page, + pageSize, + search, + sorting = { field: "firstName", order: "asc" }, + rootJunction, + filters, + } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); return apiToFuture( @@ -39,6 +46,7 @@ export class UserD2ApiRepository implements UserRepository { pageSize, query: search !== "" ? search : undefined, filter: otherFilters, + rootJunction: filters ? rootJunction : undefined, order: `${sorting.field}:${sorting.order}`, }) ).map(({ objects, pager }) => ({ diff --git a/src/domain/repositories/UserRepository.ts b/src/domain/repositories/UserRepository.ts index 62b5d2d..733e689 100644 --- a/src/domain/repositories/UserRepository.ts +++ b/src/domain/repositories/UserRepository.ts @@ -22,6 +22,7 @@ export interface ListOptions { search?: string; sorting?: { field: string; order: "asc" | "desc" }; filters?: ListFilters; + rootJunction?: "AND" | "OR"; } export type ListFilterType = "in" | "eq"; diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index ea80230..2a61e90 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -61,13 +61,13 @@ export default class Filters extends React.Component { searchStringClear: null, showOnlyManagedUsers: false, showOnlyActiveUsers: false, - rootJunction: false, userRoles: [], userGroups: [], orgUnits: [], orgUnitsOutput: [], userRolesAll: [], userGroupsAll: [], + rootJunction: "OR", }; } @@ -124,6 +124,7 @@ export default class Filters extends React.Component { userGroups, orgUnits, orgUnitsOutput, + rootJunction, } = this.state; const inFilter = field => (_(field).isEmpty() ? null : ["in", field]); @@ -131,6 +132,7 @@ export default class Filters extends React.Component { return { ...(showOnlyManagedUsers ? { canManage: "true" } : {}), ...(searchString ? { query: searchString } : {}), + ...(rootJunction ? { rootJunction } : {}), filters: { "userCredentials.disabled": showOnlyActiveUsers ? ["eq", false] : undefined, "userCredentials.userRoles.id": inFilter(userRoles), @@ -217,7 +219,7 @@ export default class Filters extends React.Component { >
    - + - + {this.getTranslation("Filtering_behavior")}
    {this.getTranslation("AND")} { + const newRootJunction = (rootJunction === "AND" ? "OR" : "AND"); + this.setState({ rootJunction: newRootJunction }, this.notifyParent); + }} + checked={rootJunction === "AND"} /> {this.getTranslation("OR")}
    diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index f9ffc59..6a59eb2 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -246,6 +246,7 @@ export const UserListTable: React.FC = ({ pageSize, sorting, filters, + rootJunction: "OR", // TODO: get from the Filters component }) .toPromise(); }, From 5f4ad91ddccdb9b01742bb285237e524a05b3ddf Mon Sep 17 00:00:00 2001 From: Jordi Date: Wed, 22 Jun 2022 17:10:42 +0200 Subject: [PATCH 174/192] Propagate correctly the state related to rootJunction --- src/legacy/List/Filters.component.js | 4 ++-- src/legacy/List/List.component.js | 3 ++- src/webapp/components/user-list-table/UserListTable.tsx | 8 +++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 2a61e90..fc3a1fd 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -236,7 +236,7 @@ export default class Filters extends React.Component { {this.getTranslation("Filtering_behavior")}
    - {this.getTranslation("AND")} + {this.getTranslation("OR")} { @@ -245,7 +245,7 @@ export default class Filters extends React.Component { }} checked={rootJunction === "AND"} /> - {this.getTranslation("OR")} + {this.getTranslation("AND")}
    diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 73ce98f..1a22de4 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -325,6 +325,7 @@ export class ListHybrid extends React.Component { loading={this.state.isLoading} openSettings={this._openSettings} filters={this.state.filters?.filters} + rootJunction={this.state.filters?.rootJunction} onChangeVisibleColumns={this._updateVisibleColumns} > @@ -360,7 +361,7 @@ export class ListHybrid extends React.Component { ) : null} {this.state.orgunitassignment.open && - this.state.orgunitassignment.field === "dataViewOrganisationUnits" ? ( + this.state.orgunitassignment.field === "dataViewOrganisationUnits" ? ( = ({ openSettings, onChangeVisibleColumns, filters, + rootJunction, children, }) => { const { compositionRoot, currentUser } = useAppContext(); @@ -64,7 +65,7 @@ export const UserListTable: React.FC = ({ onChangeVisibleColumns(columns); compositionRoot.users.saveColumns(columns).run( - () => {}, + () => { }, error => snackbar.error(error) ); }, @@ -246,11 +247,11 @@ export const UserListTable: React.FC = ({ pageSize, sorting, filters, - rootJunction: "OR", // TODO: get from the Filters component + rootJunction, }) .toPromise(); }, - [compositionRoot, filters, reloadKey] + [compositionRoot, filters, rootJunction, reloadKey] ); const refreshAllIds = useCallback( @@ -366,6 +367,7 @@ function isStateActionVisible(action: string) { export interface UserListTableProps extends Pick, "loading"> { openSettings: () => void; filters: ListFilters; + rootJunction: "AND" | "OR"; onChangeVisibleColumns: (columns: string[]) => void; } From 3c707f74502539f825908ce838729a36954139f4 Mon Sep 17 00:00:00 2001 From: Jordi Date: Wed, 22 Jun 2022 23:58:06 +0200 Subject: [PATCH 175/192] Fix: read users when userCredentials do not have userRoles --- src/data/repositories/UserD2ApiRepository.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index b64112e..17bd167 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -247,10 +247,10 @@ export class UserD2ApiRepository implements UserRepository { private toDomainUser(input: ApiUser): User { const { userCredentials, ...user } = input; - const authorities = _(userCredentials.userRoles.map(userRole => userRole.authorities)) + const authorities = _(userCredentials.userRoles?.map(userRole => userRole.authorities)) .flatten() .uniq() - .value(); + .value() || []; return { id: user.id, @@ -269,7 +269,7 @@ export class UserD2ApiRepository implements UserRepository { userGroups: user.userGroups, username: userCredentials.username, apiUrl: `${this.api.baseUrl}/api/users/${user.id}.json`, - userRoles: userCredentials.userRoles.map(userRole => ({ id: userRole.id, name: userRole.name })), + userRoles: userCredentials.userRoles?.map(userRole => ({ id: userRole.id, name: userRole.name })) || [], lastLogin: userCredentials.lastLogin ? new Date(userCredentials.lastLogin) : undefined, disabled: userCredentials.disabled, organisationUnits: user.organisationUnits, From 6ac13a2d15e2e3a7dcf6e256dfecebfde96cd5c7 Mon Sep 17 00:00:00 2001 From: Jordi Date: Wed, 22 Jun 2022 23:59:03 +0200 Subject: [PATCH 176/192] cosmetics --- src/legacy/List/Filters.component.js | 2 +- src/legacy/List/List.component.js | 2 +- src/webapp/components/user-list-table/UserListTable.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index fc3a1fd..20cb030 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -240,7 +240,7 @@ export default class Filters extends React.Component { { - const newRootJunction = (rootJunction === "AND" ? "OR" : "AND"); + const newRootJunction = rootJunction === "AND" ? "OR" : "AND"; this.setState({ rootJunction: newRootJunction }, this.notifyParent); }} checked={rootJunction === "AND"} diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 1a22de4..3ed2804 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -361,7 +361,7 @@ export class ListHybrid extends React.Component { ) : null} {this.state.orgunitassignment.open && - this.state.orgunitassignment.field === "dataViewOrganisationUnits" ? ( + this.state.orgunitassignment.field === "dataViewOrganisationUnits" ? ( = ({ onChangeVisibleColumns(columns); compositionRoot.users.saveColumns(columns).run( - () => { }, + () => {}, error => snackbar.error(error) ); }, From 48d653f7ce6fec8a5e5f960747263f083642f191 Mon Sep 17 00:00:00 2001 From: Jordi Date: Wed, 22 Jun 2022 23:59:53 +0200 Subject: [PATCH 177/192] prettify --- src/data/repositories/UserD2ApiRepository.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 17bd167..d33ed5c 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -247,10 +247,11 @@ export class UserD2ApiRepository implements UserRepository { private toDomainUser(input: ApiUser): User { const { userCredentials, ...user } = input; - const authorities = _(userCredentials.userRoles?.map(userRole => userRole.authorities)) - .flatten() - .uniq() - .value() || []; + const authorities = + _(userCredentials.userRoles?.map(userRole => userRole.authorities)) + .flatten() + .uniq() + .value() || []; return { id: user.id, From 8f5ffbb33c29824d940c256dbcbe5a1212b33d81 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 30 Jun 2022 13:32:02 +0200 Subject: [PATCH 178/192] Add query to filterList() --- src/legacy/List/List.component.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 73ce98f..4023367 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -206,9 +206,9 @@ export class ListHybrid extends React.Component { filterList = () => { const order = this.state.sorting ? this.state.sorting[0] + ":i" + this.state.sorting[1] : null; - const { filters } = this.state; + const { filters, query } = this.state; - this.setState({ isLoading: true, listFilterOptions: { order: order, ...filters } }); + this.setState({ isLoading: true, listFilterOptions: { order: order, query: query, ...filters } }); }; convertObjsToMenuItems = objs => { @@ -268,6 +268,10 @@ export class ListHybrid extends React.Component { this.setState({ visibleColumns }); }; + _updateSearch = query => { + this.setState({ query }, this.filterList); + }; + _openImportTable = importResult => { this.setState({ importUsers: { open: true, ...importResult } }); }; @@ -326,6 +330,7 @@ export class ListHybrid extends React.Component { openSettings={this._openSettings} filters={this.state.filters?.filters} onChangeVisibleColumns={this._updateVisibleColumns} + onChangeSearch={this._updateSearch} > From 43e9238df0a28d4b83839e1185a9ecd7bcc66aa4 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 30 Jun 2022 13:33:26 +0200 Subject: [PATCH 179/192] Add onChangeSearch property, used to pass the name filter query to src/legacy/List/List.component.js --- src/webapp/components/user-list-table/UserListTable.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/webapp/components/user-list-table/UserListTable.tsx b/src/webapp/components/user-list-table/UserListTable.tsx index f9ffc59..ec08b61 100644 --- a/src/webapp/components/user-list-table/UserListTable.tsx +++ b/src/webapp/components/user-list-table/UserListTable.tsx @@ -31,6 +31,7 @@ import { MultiSelectorDialog, MultiSelectorDialogProps } from "../multi-selector export const UserListTable: React.FC = ({ openSettings, onChangeVisibleColumns, + onChangeSearch, filters, children, }) => { @@ -238,6 +239,7 @@ export const UserListTable: React.FC = ({ sorting: TableSorting ): Promise<{ objects: User[]; pager: Pager }> => { console.debug("Reloading", reloadKey); + onChangeSearch(search); return compositionRoot.users .list({ @@ -249,7 +251,7 @@ export const UserListTable: React.FC = ({ }) .toPromise(); }, - [compositionRoot, filters, reloadKey] + [compositionRoot, filters, reloadKey, onChangeSearch] ); const refreshAllIds = useCallback( @@ -366,6 +368,7 @@ export interface UserListTableProps extends Pick, "loadi openSettings: () => void; filters: ListFilters; onChangeVisibleColumns: (columns: string[]) => void; + onChangeSearch: (search: string) => void; } function buildEllipsizedList(items: NamedRef[], limit = 3) { From f390388278d6e66df671fdf57bfbfae1ced051fb Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Fri, 1 Jul 2022 13:16:11 +0200 Subject: [PATCH 180/192] rename _updateSearch to _updateQuery. --- src/legacy/List/List.component.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/legacy/List/List.component.js b/src/legacy/List/List.component.js index 4023367..d41ddd1 100644 --- a/src/legacy/List/List.component.js +++ b/src/legacy/List/List.component.js @@ -268,7 +268,7 @@ export class ListHybrid extends React.Component { this.setState({ visibleColumns }); }; - _updateSearch = query => { + _updateQuery = query => { this.setState({ query }, this.filterList); }; @@ -330,7 +330,7 @@ export class ListHybrid extends React.Component { openSettings={this._openSettings} filters={this.state.filters?.filters} onChangeVisibleColumns={this._updateVisibleColumns} - onChangeSearch={this._updateSearch} + onChangeSearch={this._updateQuery} > From b8a50ea776ab66de1be21369ca8d5ac1e298350b Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Mon, 4 Jul 2022 09:23:57 +0200 Subject: [PATCH 181/192] Fix: users were removed in some cases where no filter was selected Addresses https://github.com/EyeSeeTea/user-extended-app/pull/234/files#r911917951 Even if the filters were disabled (being empty), the check would be true (since an empty object is truthy). That would incorrectly set rootJunction, and the query would return no results. --- src/data/repositories/UserD2ApiRepository.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index d33ed5c..522c838 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -38,6 +38,7 @@ export class UserD2ApiRepository implements UserRepository { filters, } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); + const areFiltersEnabled = _(otherFilters).values().some() return apiToFuture( this.api.models.users.get({ @@ -46,7 +47,7 @@ export class UserD2ApiRepository implements UserRepository { pageSize, query: search !== "" ? search : undefined, filter: otherFilters, - rootJunction: filters ? rootJunction : undefined, + rootJunction: areFiltersEnabled ? rootJunction : undefined, order: `${sorting.field}:${sorting.order}`, }) ).map(({ objects, pager }) => ({ From fdfab09762c34fa814234c5ae4832cb27557c486 Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Mon, 4 Jul 2022 09:28:52 +0200 Subject: [PATCH 182/192] Small simplification. Addresses https://github.com/EyeSeeTea/user-extended-app/pull/234/files#r911921659 --- src/data/repositories/UserD2ApiRepository.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 522c838..31ba1cf 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -249,10 +249,10 @@ export class UserD2ApiRepository implements UserRepository { private toDomainUser(input: ApiUser): User { const { userCredentials, ...user } = input; const authorities = - _(userCredentials.userRoles?.map(userRole => userRole.authorities)) + _(userCredentials.userRoles).map(userRole => userRole.authorities) .flatten() .uniq() - .value() || []; + .value(); return { id: user.id, From 9bec3e4f56e8e2032c2f424ae5e9e0742ec16380 Mon Sep 17 00:00:00 2001 From: Arnau Sanchez Date: Mon, 4 Jul 2022 10:06:28 +0200 Subject: [PATCH 183/192] Prettify UserD2ApiRepository.ts --- src/data/repositories/UserD2ApiRepository.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/repositories/UserD2ApiRepository.ts b/src/data/repositories/UserD2ApiRepository.ts index 31ba1cf..ab34ede 100644 --- a/src/data/repositories/UserD2ApiRepository.ts +++ b/src/data/repositories/UserD2ApiRepository.ts @@ -38,7 +38,7 @@ export class UserD2ApiRepository implements UserRepository { filters, } = options; const otherFilters = _.mapValues(filters, items => (items ? { [items[0]]: items[1] } : undefined)); - const areFiltersEnabled = _(otherFilters).values().some() + const areFiltersEnabled = _(otherFilters).values().some(); return apiToFuture( this.api.models.users.get({ @@ -248,11 +248,11 @@ export class UserD2ApiRepository implements UserRepository { private toDomainUser(input: ApiUser): User { const { userCredentials, ...user } = input; - const authorities = - _(userCredentials.userRoles).map(userRole => userRole.authorities) - .flatten() - .uniq() - .value(); + const authorities = _(userCredentials.userRoles) + .map(userRole => userRole.authorities) + .flatten() + .uniq() + .value(); return { id: user.id, From 8302de8fb5170f5a220232117fb3285c75120b05 Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Mon, 4 Jul 2022 18:04:51 +0200 Subject: [PATCH 184/192] Add warning about AND/OR being only for advanced filters. Agreed on this solution after talking to Nacho. --- public/old-i18n/i18n_module_ar.properties | 3 ++- public/old-i18n/i18n_module_en.properties | 3 ++- public/old-i18n/i18n_module_es.properties | 1 + public/old-i18n/i18n_module_fr.properties | 1 + src/legacy/List/Filters.component.js | 1 + 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index e5fcc4d..9a375ff 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -134,4 +134,5 @@ select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user AND=AND OR=OR -Filtering_behavior=Filtering behavior +Filtering_behavior=Filtering behavior +Active_in_advanced_only=(Only for advanced filters) diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 0167b58..876be3b 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -134,4 +134,5 @@ select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user AND=AND OR=OR -Filtering_behavior=Filtering behavior +Filtering_behavior=Filtering behavior +Active_in_advanced_only=(Only for advanced filters) diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 02d9465..6d82683 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -136,3 +136,4 @@ select_at_least_one_user=Seleccione al menos un usuario destino AND=AND OR=OR Filtering_behavior=Tipo de filtrado +Active_in_advanced_only=(Solo para los filtros avanzados) diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 78a65a3..1e53cb2 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -135,3 +135,4 @@ select_at_least_one_user=Select at least one destination user AND=AND OR=OR Filtering_behavior=Type de filtrage +Active_in_advanced_only=(Pour les filtres avancées seulement) diff --git a/src/legacy/List/Filters.component.js b/src/legacy/List/Filters.component.js index 20cb030..627e71c 100644 --- a/src/legacy/List/Filters.component.js +++ b/src/legacy/List/Filters.component.js @@ -247,6 +247,7 @@ export default class Filters extends React.Component { /> {this.getTranslation("AND")}
    + {this.getTranslation("Active_in_advanced_only")}
    From fbe804c705da2de72026bc0e85edd0ead534567c Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 7 Jul 2022 14:23:58 +0200 Subject: [PATCH 185/192] Restore old dialog code --- .../components/MultipleSelector.component.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/legacy/components/MultipleSelector.component.js b/src/legacy/components/MultipleSelector.component.js index c9f0d5e..ed3a529 100644 --- a/src/legacy/components/MultipleSelector.component.js +++ b/src/legacy/components/MultipleSelector.component.js @@ -3,6 +3,9 @@ import React from "react"; import PropTypes from "prop-types"; import OrgUnitForm from "./OrgUnitForm"; import _ from "lodash"; + +import FilteredMultiSelect from "./FilteredMultiSelect.component"; + class MultipleSelector extends React.Component { constructor(props, context) { super(props, context); @@ -57,11 +60,25 @@ class MultipleSelector extends React.Component { }; renderForm = () => { - const { field, orgUnitRoots } = this.props; + const { field, options, orgUnitRoots } = this.props; const { selected } = this.state; const t = this.getTranslation.bind(this); switch (field) { + case "userGroups": + case "userRoles": { + const selectOptions = options.map(o => ({ value: o.id, text: o.displayName })); + const selectedIds = _(selected).map("id").value(); + + return ( + + ); + } case "organisationUnits": return ( Date: Thu, 7 Jul 2022 14:24:41 +0200 Subject: [PATCH 186/192] Fix missing remove_all translation --- public/old-i18n/i18n_module_ar.properties | 1 + public/old-i18n/i18n_module_en.properties | 1 + public/old-i18n/i18n_module_es.properties | 1 + public/old-i18n/i18n_module_fr.properties | 1 + 4 files changed, 4 insertions(+) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index e5fcc4d..ede2bfd 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -1,5 +1,6 @@ actions=Actions assign_all=Assign all +remove_all=Remove all assign_groups=Assign to groups assign_roles=Assign roles assign_to_org_units_capture=Assign to organisation units capture diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 0167b58..fe68ed8 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -1,5 +1,6 @@ actions=Actions assign_all=Assign all +remove_all=Remove all assign_groups=Assign to groups assign_roles=Assign roles assign_to_org_units_capture=Assign to organisation units capture diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 02d9465..92c10bc 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -1,5 +1,6 @@ actions=Acciones assign_all=Assignar todos +remove_all=Eliminar todos assign_groups=Asignar a grupos assign_roles=Asignar a roles assign_to_org_units_capture=Asignar a la captura de unidades organizativas diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 78a65a3..d58abfa 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -1,5 +1,6 @@ actions=Actions assign_all=Assign all +remove_all=Supprimer tout assign_groups=Assign to groups assign_roles=Assign roles assign_to_org_units_capture=Assign to organisation units capture From 1e8d6b0a73badfaad45fa9997d036114603a088a Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 7 Jul 2022 15:19:26 +0200 Subject: [PATCH 187/192] Fix missing selected translation --- public/old-i18n/i18n_module_ar.properties | 1 + public/old-i18n/i18n_module_en.properties | 1 + public/old-i18n/i18n_module_es.properties | 1 + public/old-i18n/i18n_module_fr.properties | 1 + 4 files changed, 4 insertions(+) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index ede2bfd..a8f742a 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -1,4 +1,5 @@ actions=Actions +selected=selected assign_all=Assign all remove_all=Remove all assign_groups=Assign to groups diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index fe68ed8..a2789cd 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -1,4 +1,5 @@ actions=Actions +selected=selected assign_all=Assign all remove_all=Remove all assign_groups=Assign to groups diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 92c10bc..a8b7498 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -1,4 +1,5 @@ actions=Acciones +selected=seleccionado(s) assign_all=Assignar todos remove_all=Eliminar todos assign_groups=Asignar a grupos diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index d58abfa..46c8159 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -1,4 +1,5 @@ actions=Actions +selected=sélectionné(s) assign_all=Assign all remove_all=Supprimer tout assign_groups=Assign to groups From dd0c7048d535b0f6ee7c45e7e126dc61e1d4b110 Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Mon, 11 Jul 2022 10:38:24 +0200 Subject: [PATCH 188/192] Use new showNameSetting property from OrgUnitsSelector in d2-ui-components. Dependent on the PR at https://github.com/EyeSeeTea/d2-ui-components/pull/227 --- src/legacy/components/OrgUnitsSelectorFilter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/legacy/components/OrgUnitsSelectorFilter.js b/src/legacy/components/OrgUnitsSelectorFilter.js index 42a1221..867e992 100644 --- a/src/legacy/components/OrgUnitsSelectorFilter.js +++ b/src/legacy/components/OrgUnitsSelectorFilter.js @@ -107,6 +107,7 @@ class OrgUnitsSelectorFilter extends React.Component { filterByProgram: false, selectAll: false, }} + showNameSetting={true} /> From 809f48f27d669820a65d1cad9d482f09931e6495 Mon Sep 17 00:00:00 2001 From: Jordi BC Date: Tue, 12 Jul 2022 09:46:57 +0200 Subject: [PATCH 189/192] Use new d2-ui-components version 2.6.12-beta.3. This is the first version that contains the neccessary changes in the OrgUnitSelector component. --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 53267e2..f635f54 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dhis2/d2-i18n-generate": "1.2.0", "@dhis2/ui": "7.8.1", "@eyeseetea/d2-api": "1.11.0", - "@eyeseetea/d2-ui-components": "2.6.11", + "@eyeseetea/d2-ui-components": "2.6.12-beta.3", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", "@types/react-virtualized-auto-sizer": "1.0.1", diff --git a/yarn.lock b/yarn.lock index 7e0a9e8..96e1eda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2902,10 +2902,10 @@ react "^16.12.0" yargs "^14.0.0" -"@eyeseetea/d2-ui-components@2.6.11": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.11.tgz#34c0b6e43f8bca497379d813c8b61b70e418533a" - integrity sha512-0E2za7t51hZn2NgHqnBUhJB2y7arOqbcrNIsnqXtZh6qDIteTGQkDhjYVU/HskOP+cwqOxddUNNZngQ/SRGTnw== +"@eyeseetea/d2-ui-components@2.6.12-beta.3": + version "2.6.12-beta.3" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.12-beta.3.tgz#590a76d91982901579c30fb4f24347cf0b97c5b5" + integrity sha512-DL/ObidPFcEUIS9rrmHdF/7mLcltSgfr46p4VzV8ejur7pFeIPltOUXPgOdkwQEw9pgTjcbONd+GXhsSiBYZTw== dependencies: "@date-io/core" "1.3.6" "@date-io/moment" "1.0.2" From 568eb5c62e5eac3343c9922c2a0539e651ad0d80 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 21 Jul 2022 12:39:15 +0200 Subject: [PATCH 190/192] Add openId to getUserList queryFields --- src/legacy/models/userList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/models/userList.js b/src/legacy/models/userList.js index 12fa87f..5864992 100644 --- a/src/legacy/models/userList.js +++ b/src/legacy/models/userList.js @@ -14,7 +14,7 @@ const queryFields = [ "lastUpdated", "access", "href", - "userCredentials[username,disabled,userRoles[id,displayName],lastLogin]", + "userCredentials[username,disabled,userRoles[id,displayName],lastLogin,openId]", "userGroups[id,displayName,publicAccess]", "organisationUnits[id,code,shortName,displayName]", "dataViewOrganisationUnits[id,code,shortName,displayName]", From 63f856ae414e07002ec06e3cf78597e43736e810 Mon Sep 17 00:00:00 2001 From: nshandra <34254522+nshandra@users.noreply.github.com> Date: Thu, 21 Jul 2022 13:31:54 +0200 Subject: [PATCH 191/192] Add openId import (openId value must be unique for now) --- public/old-i18n/i18n_module_ar.properties | 1 + public/old-i18n/i18n_module_en.properties | 1 + public/old-i18n/i18n_module_es.properties | 1 + public/old-i18n/i18n_module_fr.properties | 1 + src/legacy/models/userHelpers.js | 3 ++- 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/public/old-i18n/i18n_module_ar.properties b/public/old-i18n/i18n_module_ar.properties index e5fcc4d..2e3558d 100644 --- a/public/old-i18n/i18n_module_ar.properties +++ b/public/old-i18n/i18n_module_ar.properties @@ -135,3 +135,4 @@ select_at_least_one_user=Select at least one destination user AND=AND OR=OR Filtering_behavior=Filtering behavior +open_id=Open ID diff --git a/public/old-i18n/i18n_module_en.properties b/public/old-i18n/i18n_module_en.properties index 0167b58..15369d2 100644 --- a/public/old-i18n/i18n_module_en.properties +++ b/public/old-i18n/i18n_module_en.properties @@ -135,3 +135,4 @@ select_at_least_one_user=Select at least one destination user AND=AND OR=OR Filtering_behavior=Filtering behavior +open_id=Open ID diff --git a/public/old-i18n/i18n_module_es.properties b/public/old-i18n/i18n_module_es.properties index 02d9465..accaafa 100644 --- a/public/old-i18n/i18n_module_es.properties +++ b/public/old-i18n/i18n_module_es.properties @@ -136,3 +136,4 @@ select_at_least_one_user=Seleccione al menos un usuario destino AND=AND OR=OR Filtering_behavior=Tipo de filtrado +open_id=Open ID diff --git a/public/old-i18n/i18n_module_fr.properties b/public/old-i18n/i18n_module_fr.properties index 78a65a3..0371a95 100644 --- a/public/old-i18n/i18n_module_fr.properties +++ b/public/old-i18n/i18n_module_fr.properties @@ -135,3 +135,4 @@ select_at_least_one_user=Select at least one destination user AND=AND OR=OR Filtering_behavior=Type de filtrage +open_id=Open ID diff --git a/src/legacy/models/userHelpers.js b/src/legacy/models/userHelpers.js index 11b87ba..3a484e6 100644 --- a/src/legacy/models/userHelpers.js +++ b/src/legacy/models/userHelpers.js @@ -16,7 +16,7 @@ const requiredPropertiesOnImport = ["username", "password", "firstName", "surnam const propertiesIgnoredOnImport = ["id", "created", "lastUpdated", "lastLogin"]; -const userCredentialsFields = ["username", "password", "userRoles", "disabled"]; +const userCredentialsFields = ["username", "password", "userRoles", "disabled", "openId"]; const columnNameFromPropertyMapping = { id: "ID", @@ -35,6 +35,7 @@ const columnNameFromPropertyMapping = { organisationUnits: "OUCapture", dataViewOrganisationUnits: "OUOutput", disabled: "Disabled", + openId: "Open ID", }; const propertyFromColumnNameMapping = _.invert(columnNameFromPropertyMapping); From b5598644ea87a776b6883620272cf9a63c936c5a Mon Sep 17 00:00:00 2001 From: Arnau Sanchez Date: Thu, 29 Sep 2022 10:18:00 +0200 Subject: [PATCH 192/192] Bump d2-ui-components --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f635f54..2889e94 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@dhis2/d2-i18n-generate": "1.2.0", "@dhis2/ui": "7.8.1", "@eyeseetea/d2-api": "1.11.0", - "@eyeseetea/d2-ui-components": "2.6.12-beta.3", + "@eyeseetea/d2-ui-components": "2.6.12-beta.4", "@material-ui/core": "4.12.3", "@material-ui/icons": "4.11.2", "@types/react-virtualized-auto-sizer": "1.0.1", diff --git a/yarn.lock b/yarn.lock index 96e1eda..ee86e8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2902,10 +2902,10 @@ react "^16.12.0" yargs "^14.0.0" -"@eyeseetea/d2-ui-components@2.6.12-beta.3": - version "2.6.12-beta.3" - resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.12-beta.3.tgz#590a76d91982901579c30fb4f24347cf0b97c5b5" - integrity sha512-DL/ObidPFcEUIS9rrmHdF/7mLcltSgfr46p4VzV8ejur7pFeIPltOUXPgOdkwQEw9pgTjcbONd+GXhsSiBYZTw== +"@eyeseetea/d2-ui-components@2.6.12-beta.4": + version "2.6.12-beta.4" + resolved "https://registry.yarnpkg.com/@eyeseetea/d2-ui-components/-/d2-ui-components-2.6.12-beta.4.tgz#81a1fb6199acd793169b7ba6f1c88755934bef0d" + integrity sha512-Q6ZmplRxZnVfoLrigWXK5F7R9sG5eQ8ehWqI6ARMbGsdkKOgqTwk2VPzjxZKTZLTx7ms5/31VoVBqAytIrp1jQ== dependencies: "@date-io/core" "1.3.6" "@date-io/moment" "1.0.2"

    + + Login + +