From 700d52d8158678c0e0699ce721e2291290ae57ef Mon Sep 17 00:00:00 2001 From: sercan Date: Thu, 15 Apr 2021 17:13:46 +0300 Subject: [PATCH] Fuse v12.0.0 --- .browserslistrc | 17 + .editorconfig | 16 + .gitignore | 46 + CREDITS | 69 + LICENSE.md | 6 + README.md | 25 + angular.json | 147 + e2e/protractor.conf.js | 40 + e2e/src/app.e2e-spec.ts | 23 + e2e/src/app.po.ts | 14 + e2e/tsconfig.json | 13 + karma.conf.js | 45 + package-lock.json | 15990 +++++++++ package.json | 83 + src/@fuse/animations/defaults.ts | 14 + src/@fuse/animations/expand-collapse.ts | 34 + src/@fuse/animations/fade.ts | 330 + src/@fuse/animations/index.ts | 1 + src/@fuse/animations/public-api.ts | 15 + src/@fuse/animations/shake.ts | 73 + src/@fuse/animations/slide.ts | 252 + src/@fuse/animations/zoom.ts | 73 + .../components/alert/alert.component.html | 82 + .../components/alert/alert.component.scss | 1340 + src/@fuse/components/alert/alert.component.ts | 211 + src/@fuse/components/alert/alert.module.ts | 22 + src/@fuse/components/alert/alert.service.ts | 77 + src/@fuse/components/alert/alert.types.ts | 15 + src/@fuse/components/alert/index.ts | 1 + src/@fuse/components/alert/public-api.ts | 4 + src/@fuse/components/card/card.component.html | 30 + src/@fuse/components/card/card.component.scss | 63 + src/@fuse/components/card/card.component.ts | 72 + src/@fuse/components/card/card.module.ts | 18 + src/@fuse/components/card/card.types.ts | 3 + src/@fuse/components/card/index.ts | 1 + src/@fuse/components/card/public-api.ts | 2 + .../date-range/date-range.component.html | 101 + .../date-range/date-range.component.scss | 292 + .../date-range/date-range.component.ts | 685 + .../date-range/date-range.module.ts | 32 + src/@fuse/components/date-range/index.ts | 1 + src/@fuse/components/date-range/public-api.ts | 2 + .../components/drawer/drawer.component.html | 3 + .../components/drawer/drawer.component.scss | 131 + .../components/drawer/drawer.component.ts | 412 + src/@fuse/components/drawer/drawer.module.ts | 18 + src/@fuse/components/drawer/drawer.service.ts | 52 + src/@fuse/components/drawer/drawer.types.ts | 7 + src/@fuse/components/drawer/index.ts | 1 + src/@fuse/components/drawer/public-api.ts | 4 + .../highlight/highlight.component.html | 9 + .../highlight/highlight.component.scss | 3 + .../highlight/highlight.component.ts | 132 + .../components/highlight/highlight.module.ts | 18 + .../components/highlight/highlight.service.ts | 82 + src/@fuse/components/highlight/index.ts | 1 + src/@fuse/components/highlight/public-api.ts | 3 + .../components/basic/basic.component.html | 111 + .../components/basic/basic.component.ts | 63 + .../components/branch/branch.component.html | 115 + .../components/branch/branch.component.ts | 82 + .../components/divider/divider.component.html | 4 + .../components/divider/divider.component.ts | 63 + .../components/spacer/spacer.component.html | 4 + .../components/spacer/spacer.component.ts | 63 + .../horizontal/horizontal.component.html | 33 + .../horizontal/horizontal.component.scss | 180 + .../horizontal/horizontal.component.ts | 109 + src/@fuse/components/navigation/index.ts | 1 + .../navigation/navigation.module.ts | 55 + .../navigation/navigation.service.ts | 188 + .../components/navigation/navigation.types.ts | 47 + src/@fuse/components/navigation/public-api.ts | 5 + .../components/aside/aside.component.html | 96 + .../components/aside/aside.component.ts | 186 + .../components/basic/basic.component.html | 110 + .../components/basic/basic.component.ts | 65 + .../collapsable/collapsable.component.html | 99 + .../collapsable/collapsable.component.ts | 346 + .../components/divider/divider.component.html | 4 + .../components/divider/divider.component.ts | 63 + .../components/group/group.component.html | 85 + .../components/group/group.component.ts | 82 + .../components/spacer/spacer.component.html | 4 + .../components/spacer/spacer.component.ts | 63 + .../vertical/styles/appearances/compact.scss | 110 + .../vertical/styles/appearances/default.scss | 591 + .../vertical/styles/appearances/dense.scss | 189 + .../vertical/styles/appearances/thin.scss | 97 + .../vertical/vertical.component.html | 114 + .../vertical/vertical.component.scss | 4 + .../navigation/vertical/vertical.component.ts | 736 + .../directives/autogrow/autogrow.directive.ts | 114 + .../directives/autogrow/autogrow.module.ts | 14 + src/@fuse/directives/autogrow/index.ts | 1 + src/@fuse/directives/autogrow/public-api.ts | 2 + src/@fuse/directives/scroll-reset/index.ts | 1 + .../directives/scroll-reset/public-api.ts | 2 + .../scroll-reset/scroll-reset.directive.ts | 53 + .../scroll-reset/scroll-reset.module.ts | 14 + src/@fuse/directives/scrollbar/index.ts | 1 + src/@fuse/directives/scrollbar/public-api.ts | 2 + .../scrollbar/scrollbar.directive.ts | 465 + .../directives/scrollbar/scrollbar.module.ts | 14 + .../directives/scrollbar/scrollbar.types.ts | 28 + src/@fuse/fuse.module.ts | 37 + src/@fuse/index.ts | 1 + src/@fuse/lib/mock-api/index.ts | 1 + src/@fuse/lib/mock-api/mock-api.constants.ts | 3 + .../lib/mock-api/mock-api.interceptor.ts | 97 + src/@fuse/lib/mock-api/mock-api.module.ts | 42 + .../lib/mock-api/mock-api.request-handler.ts | 100 + src/@fuse/lib/mock-api/mock-api.service.ts | 166 + src/@fuse/lib/mock-api/mock-api.types.ts | 13 + src/@fuse/lib/mock-api/mock-api.utils.ts | 37 + src/@fuse/lib/mock-api/public-api.ts | 5 + .../pipes/find-by-key/find-by-key.module.ts | 14 + .../pipes/find-by-key/find-by-key.pipe.ts | 39 + src/@fuse/pipes/find-by-key/index.ts | 1 + src/@fuse/pipes/find-by-key/public-api.ts | 2 + src/@fuse/services/config/config.constants.ts | 3 + src/@fuse/services/config/config.module.ts | 32 + src/@fuse/services/config/config.service.ts | 55 + src/@fuse/services/config/index.ts | 1 + src/@fuse/services/config/public-api.ts | 2 + src/@fuse/services/media-watcher/index.ts | 1 + .../media-watcher/media-watcher.module.ts | 17 + .../media-watcher/media-watcher.service.ts | 78 + .../services/media-watcher/public-api.ts | 2 + src/@fuse/services/splash-screen/index.ts | 1 + .../services/splash-screen/public-api.ts | 2 + .../splash-screen/splash-screen.module.ts | 17 + .../splash-screen/splash-screen.service.ts | 47 + src/@fuse/services/tailwind/index.ts | 1 + src/@fuse/services/tailwind/public-api.ts | 2 + .../services/tailwind/tailwind.module.ts | 17 + .../services/tailwind/tailwind.service.ts | 58 + src/@fuse/services/utils/index.ts | 1 + src/@fuse/services/utils/public-api.ts | 2 + src/@fuse/services/utils/utils.module.ts | 17 + src/@fuse/services/utils/utils.service.ts | 36 + .../styles/components/example-viewer.scss | 48 + src/@fuse/styles/components/input.scss | 41 + src/@fuse/styles/core/tailwind-config.scss | 6 + src/@fuse/styles/main.scss | 13 + .../styles/overrides/angular-material.scss | 1473 + src/@fuse/styles/overrides/fullcalendar.scss | 680 + src/@fuse/styles/overrides/highlightjs.scss | 82 + .../styles/overrides/perfect-scrollbar.scss | 69 + src/@fuse/styles/overrides/quill.scss | 108 + src/@fuse/styles/tailwind.scss | 98 + src/@fuse/styles/themes.scss | 190 + src/@fuse/tailwind/plugins/extract-config.js | 38 + src/@fuse/tailwind/plugins/icon-size.js | 56 + src/@fuse/tailwind/plugins/theming.js | 229 + src/@fuse/tailwind/plugins/utilities.js | 75 + .../tailwind/utils/generate-contrasts.js | 31 + src/@fuse/tailwind/utils/generate-palette.js | 100 + src/@fuse/validators/index.ts | 1 + src/@fuse/validators/public-api.ts | 1 + src/@fuse/validators/validators.ts | 59 + src/@fuse/version/fuse-version.ts | 4 + src/@fuse/version/index.ts | 1 + src/@fuse/version/public-api.ts | 2 + src/@fuse/version/version.ts | 21 + src/app/app.component.html | 1 + src/app/app.component.scss | 6 + src/app/app.component.ts | 16 + src/app/app.module.ts | 51 + src/app/app.resolvers.ts | 55 + src/app/app.routing.ts | 191 + src/app/app.types.ts | 19 + src/app/core/auth/auth.interceptor.ts | 62 + src/app/core/auth/auth.service.ts | 187 + src/app/core/auth/auth.utils.ts | 206 + src/app/core/auth/guards/auth.guard.ts | 93 + src/app/core/auth/guards/noAuth.guard.ts | 90 + src/app/core/config/app.config.ts | 30 + src/app/core/core.module.ts | 46 + src/app/core/user/user.model.ts | 8 + src/app/core/user/user.service.ts | 59 + .../common/messages/messages.component.html | 158 + .../common/messages/messages.component.ts | 226 + .../layout/common/messages/messages.module.ts | 30 + .../common/messages/messages.service.ts | 157 + .../layout/common/messages/messages.types.ts | 12 + .../notifications.component.html | 162 + .../notifications/notifications.component.ts | 226 + .../notifications/notifications.module.ts | 30 + .../notifications/notifications.service.ts | 157 + .../notifications/notifications.types.ts | 12 + .../common/search/search.component.html | 128 + .../layout/common/search/search.component.ts | 206 + src/app/layout/common/search/search.module.ts | 40 + .../common/shortcuts/shortcuts.component.html | 215 + .../common/shortcuts/shortcuts.component.ts | 263 + .../common/shortcuts/shortcuts.module.ts | 38 + .../common/shortcuts/shortcuts.service.ts | 132 + .../common/shortcuts/shortcuts.types.ts | 9 + .../common/user-menu/user-menu.component.html | 84 + .../common/user-menu/user-menu.component.ts | 97 + .../common/user-menu/user-menu.module.ts | 26 + src/app/layout/layout.component.html | 511 + src/app/layout/layout.component.scss | 26 + src/app/layout/layout.component.ts | 261 + src/app/layout/layout.module.ts | 56 + src/app/layout/layout.types.ts | 14 + .../layout/layouts/empty/empty.component.html | 11 + .../layout/layouts/empty/empty.component.ts | 33 + src/app/layout/layouts/empty/empty.module.ts | 20 + .../centered/centered.component.html | 88 + .../horizontal/centered/centered.component.ts | 98 + .../horizontal/centered/centered.module.ts | 42 + .../enterprise/enterprise.component.html | 86 + .../enterprise/enterprise.component.ts | 98 + .../enterprise/enterprise.module.ts | 42 + .../material/material.component.html | 89 + .../horizontal/material/material.component.ts | 98 + .../horizontal/material/material.module.ts | 42 + .../horizontal/modern/modern.component.html | 78 + .../horizontal/modern/modern.component.ts | 98 + .../horizontal/modern/modern.module.ts | 42 + .../vertical/classic/classic.component.html | 59 + .../vertical/classic/classic.component.ts | 98 + .../vertical/classic/classic.module.ts | 42 + .../vertical/classy/classy.component.html | 87 + .../vertical/classy/classy.component.ts | 98 + .../layouts/vertical/classy/classy.module.ts | 42 + .../vertical/compact/compact.component.html | 54 + .../vertical/compact/compact.component.ts | 98 + .../vertical/compact/compact.module.ts | 42 + .../vertical/dense/dense.component.html | 63 + .../layouts/vertical/dense/dense.component.ts | 107 + .../layouts/vertical/dense/dense.module.ts | 42 + .../futuristic/futuristic.component.html | 67 + .../futuristic/futuristic.component.ts | 98 + .../vertical/futuristic/futuristic.module.ts | 42 + .../layouts/vertical/thin/thin.component.html | 55 + .../layouts/vertical/thin/thin.component.ts | 98 + .../layouts/vertical/thin/thin.module.ts | 42 + src/app/mock-api/apps/calendar/api.ts | 624 + src/app/mock-api/apps/calendar/data.ts | 170 + src/app/mock-api/apps/contacts/api.ts | 353 + src/app/mock-api/apps/contacts/data.ts | 4432 +++ .../mock-api/apps/ecommerce/inventory/api.ts | 346 + .../mock-api/apps/ecommerce/inventory/data.ts | 822 + src/app/mock-api/apps/file-manager/api.ts | 58 + src/app/mock-api/apps/file-manager/data.ts | 179 + src/app/mock-api/apps/help-center/api.ts | 173 + src/app/mock-api/apps/help-center/data.ts | 507 + src/app/mock-api/apps/mailbox/api.ts | 385 + src/app/mock-api/apps/mailbox/data.ts | 2581 ++ src/app/mock-api/apps/tasks/api.ts | 329 + src/app/mock-api/apps/tasks/data.ts | 953 + src/app/mock-api/common/auth/api.ts | 258 + src/app/mock-api/common/messages/api.ts | 164 + src/app/mock-api/common/messages/data.ts | 92 + src/app/mock-api/common/navigation/api.ts | 84 + src/app/mock-api/common/navigation/data.ts | 1284 + src/app/mock-api/common/notifications/api.ts | 164 + src/app/mock-api/common/notifications/data.ts | 91 + src/app/mock-api/common/search/api.ts | 115 + src/app/mock-api/common/shortcuts/api.ts | 115 + src/app/mock-api/common/shortcuts/data.ts | 77 + src/app/mock-api/common/user/api.ts | 55 + src/app/mock-api/common/user/data.ts | 8 + src/app/mock-api/dashboards/analytics/api.ts | 38 + src/app/mock-api/dashboards/analytics/data.ts | 1599 + src/app/mock-api/dashboards/project/api.ts | 38 + src/app/mock-api/dashboards/project/data.ts | 325 + src/app/mock-api/index.ts | 37 + src/app/mock-api/ui/icons/api.ts | 124 + src/app/mock-api/ui/icons/data.ts | 4383 +++ .../apps/calendar/calendar.component.html | 386 + .../apps/calendar/calendar.component.scss | 121 + .../admin/apps/calendar/calendar.component.ts | 1011 + .../admin/apps/calendar/calendar.module.ts | 75 + .../admin/apps/calendar/calendar.resolvers.ts | 89 + .../admin/apps/calendar/calendar.routing.ts | 23 + .../admin/apps/calendar/calendar.service.ts | 475 + .../admin/apps/calendar/calendar.types.ts | 47 + .../recurrence/recurrence.component.html | 120 + .../recurrence/recurrence.component.ts | 341 + .../calendar/settings/settings.component.html | 60 + .../calendar/settings/settings.component.ts | 96 + .../apps/calendar/sidebar/calendar-colors.ts | 12 + .../calendar/sidebar/sidebar.component.html | 116 + .../calendar/sidebar/sidebar.component.ts | 217 + .../apps/contacts/contacts.component.html | 1 + .../admin/apps/contacts/contacts.component.ts | 17 + .../admin/apps/contacts/contacts.guards.ts | 49 + .../admin/apps/contacts/contacts.module.ts | 75 + .../admin/apps/contacts/contacts.resolvers.ts | 138 + .../admin/apps/contacts/contacts.routing.ts | 37 + .../admin/apps/contacts/contacts.service.ts | 389 + .../admin/apps/contacts/contacts.types.ts | 37 + .../contacts/details/details.component.html | 641 + .../contacts/details/details.component.ts | 711 + .../apps/contacts/list/list.component.html | 120 + .../apps/contacts/list/list.component.ts | 241 + .../admin/apps/ecommerce/ecommerce.module.ts | 48 + .../admin/apps/ecommerce/ecommerce.routing.ts | 50 + .../inventory/inventory.component.html | 1 + .../inventory/inventory.component.ts | 17 + .../inventory/inventory.resolvers.ts | 194 + .../ecommerce/inventory/inventory.service.ts | 441 + .../ecommerce/inventory/inventory.types.ts | 60 + .../inventory/list/inventory.component.html | 567 + .../inventory/list/inventory.component.ts | 552 + .../details/details.component.html | 105 + .../file-manager/details/details.component.ts | 91 + .../file-manager/file-manager.component.html | 1 + .../file-manager/file-manager.component.ts | 17 + .../apps/file-manager/file-manager.guards.ts | 49 + .../apps/file-manager/file-manager.module.ts | 30 + .../file-manager/file-manager.resolvers.ts | 82 + .../apps/file-manager/file-manager.routing.ts | 32 + .../apps/file-manager/file-manager.service.ts | 88 + .../apps/file-manager/file-manager.types.ts | 18 + .../file-manager/list/list.component.html | 133 + .../apps/file-manager/list/list.component.ts | 147 + .../apps/help-center/faqs/faqs.component.html | 32 + .../apps/help-center/faqs/faqs.component.ts | 65 + .../guides/category/category.component.html | 30 + .../guides/category/category.component.ts | 70 + .../guides/guide/guide.component.html | 52 + .../guides/guide/guide.component.ts | 65 + .../help-center/guides/guides.component.html | 48 + .../help-center/guides/guides.component.ts | 65 + .../help-center/help-center.component.html | 104 + .../apps/help-center/help-center.component.ts | 65 + .../apps/help-center/help-center.module.ts | 40 + .../apps/help-center/help-center.resolvers.ts | 145 + .../apps/help-center/help-center.routing.ts | 60 + .../apps/help-center/help-center.service.ts | 134 + .../apps/help-center/help-center.type.ts | 35 + .../support/support.component.html | 109 + .../help-center/support/support.component.ts | 82 + .../mailbox/compose/compose.component.html | 132 + .../apps/mailbox/compose/compose.component.ts | 110 + .../mailbox/details/details.component.html | 409 + .../apps/mailbox/details/details.component.ts | 375 + .../apps/mailbox/list/list.component.html | 154 + .../admin/apps/mailbox/list/list.component.ts | 203 + .../admin/apps/mailbox/mailbox.component.html | 29 + .../admin/apps/mailbox/mailbox.component.ts | 64 + .../admin/apps/mailbox/mailbox.constants.ts | 65 + .../admin/apps/mailbox/mailbox.module.ts | 60 + .../admin/apps/mailbox/mailbox.resolvers.ts | 246 + .../admin/apps/mailbox/mailbox.routing.ts | 162 + .../admin/apps/mailbox/mailbox.service.ts | 396 + .../admin/apps/mailbox/mailbox.types.ts | 60 + .../mailbox/settings/settings.component.html | 121 + .../mailbox/settings/settings.component.ts | 146 + .../mailbox/sidebar/sidebar.component.html | 21 + .../mailbox/sidebar/sidebar.component.scss | 9 + .../apps/mailbox/sidebar/sidebar.component.ts | 297 + .../apps/tasks/details/details.component.html | 335 + .../apps/tasks/details/details.component.ts | 526 + .../admin/apps/tasks/list/list.component.html | 180 + .../admin/apps/tasks/list/list.component.ts | 264 + .../admin/apps/tasks/tasks.component.html | 1 + .../admin/apps/tasks/tasks.component.ts | 17 + .../modules/admin/apps/tasks/tasks.guards.ts | 49 + .../modules/admin/apps/tasks/tasks.module.ts | 77 + .../admin/apps/tasks/tasks.resolvers.ts | 110 + .../modules/admin/apps/tasks/tasks.routing.ts | 35 + .../modules/admin/apps/tasks/tasks.service.ts | 327 + .../modules/admin/apps/tasks/tasks.types.ts | 18 + .../analytics/analytics.component.html | 509 + .../analytics/analytics.component.ts | 676 + .../dashboards/analytics/analytics.module.ts | 38 + .../analytics/analytics.resolvers.ts | 32 + .../dashboards/analytics/analytics.routing.ts | 13 + .../dashboards/analytics/analytics.service.ts | 47 + .../dashboards/project/project.component.html | 734 + .../dashboards/project/project.component.ts | 448 + .../dashboards/project/project.module.ts | 40 + .../dashboards/project/project.resolvers.ts | 32 + .../dashboards/project/project.routing.ts | 13 + .../dashboards/project/project.service.ts | 47 + .../admin/docs/changelog/changelog.html | 41 + .../admin/docs/changelog/changelog.module.ts | 18 + .../admin/docs/changelog/changelog.routing.ts | 9 + .../modules/admin/docs/changelog/changelog.ts | 44 + .../components/alert/alert.component.html | 1207 + .../components/alert/alert.component.ts | 62 + .../components/card/card.component.html | 413 + .../components/card/card.component.ts | 30 + .../date-range/date-range.component.html | 171 + .../date-range/date-range.component.ts | 30 + .../components/drawer/drawer.component.html | 358 + .../components/drawer/drawer.component.ts | 68 + .../highlight/highlight.component.html | 144 + .../highlight/highlight.component.ts | 30 + .../navigation/navigation.component.html | 1022 + .../navigation/navigation.component.ts | 185 + .../core-features.component.html | 36 + .../core-features.component.scss | 9 + .../core-features/core-features.component.ts | 207 + .../core-features/core-features.module.ts | 72 + .../core-features/core-features.routing.ts | 146 + .../autogrow/autogrow.component.html | 99 + .../directives/autogrow/autogrow.component.ts | 30 + .../scroll-reset/scroll-reset.component.html | 88 + .../scroll-reset/scroll-reset.component.ts | 30 + .../scrollbar/scrollbar.component.html | 255 + .../scrollbar/scrollbar.component.ts | 30 + .../mock-api/mock-api.component.html | 496 + .../libraries/mock-api/mock-api.component.ts | 30 + .../find-by-key/find-by-key.component.html | 197 + .../find-by-key/find-by-key.component.ts | 30 + .../services/config/config.component.html | 153 + .../services/config/config.component.ts | 30 + .../media-watcher.component.html | 103 + .../media-watcher/media-watcher.component.ts | 30 + .../splash-screen.component.html | 73 + .../splash-screen/splash-screen.component.ts | 30 + .../must-match/must-match.component.html | 117 + .../must-match/must-match.component.ts | 30 + .../docs/guides/authentication/jwt/jwt.html | 131 + .../docs/guides/authentication/jwt/jwt.ts | 30 + .../component-theming/component-theming.html | 188 + .../component-theming/component-theming.ts | 30 + .../page-layouts/page-layouts.html | 82 + .../page-layouts/page-layouts.ts | 30 + .../splash-screen/splash-screen.html | 141 + .../splash-screen/splash-screen.ts | 30 + .../tailwindcss/tailwindcss.html | 117 + .../customization/tailwindcss/tailwindcss.ts | 30 + .../theme-layouts/theme-layouts.html | 138 + .../theme-layouts/theme-layouts.ts | 30 + .../guides/customization/theming/theming.html | 384 + .../guides/customization/theming/theming.ts | 30 + .../component-structure.html | 180 + .../component-structure.ts | 30 + .../development/deployment/deployment.html | 99 + .../development/deployment/deployment.ts | 30 + .../directory-structure.html | 342 + .../directory-structure.ts | 276 + .../development/starter-kit/starter-kit.html | 80 + .../development/starter-kit/starter-kit.ts | 30 + .../guides/development/updating/updating.html | 95 + .../guides/development/updating/updating.ts | 30 + .../installation/installation.html | 153 + .../installation/installation.ts | 30 + .../introduction/introduction.html | 105 + .../introduction/introduction.ts | 30 + .../prerequisites/prerequisites.html | 111 + .../prerequisites/prerequisites.ts | 30 + .../getting-started/serving/serving.html | 102 + .../guides/getting-started/serving/serving.ts | 30 + .../admin/docs/guides/guides.component.html | 38 + .../admin/docs/guides/guides.component.scss | 9 + .../admin/docs/guides/guides.component.ts | 199 + .../admin/docs/guides/guides.module.ts | 66 + .../admin/docs/guides/guides.routing.ts | 136 + .../common/messages/messages.component.html | 229 + .../common/messages/messages.component.ts | 30 + .../notifications.component.html | 229 + .../notifications/notifications.component.ts | 30 + .../common/overview/overview.component.html | 86 + .../common/overview/overview.component.ts | 30 + .../common/search/search.component.html | 122 + .../common/search/search.component.ts | 30 + .../common/shortcuts/shortcuts.component.html | 186 + .../common/shortcuts/shortcuts.component.ts | 30 + .../common/user-menu/user-menu.component.html | 96 + .../common/user-menu/user-menu.component.ts | 30 + .../other-components.component.html | 38 + .../other-components.component.scss | 9 + .../other-components.component.ts | 155 + .../other-components.module.ts | 50 + .../other-components.routing.ts | 86 + .../apex-charts/apex-charts.component.html | 61 + .../apex-charts/apex-charts.component.ts | 30 + .../full-calendar.component.html | 61 + .../full-calendar/full-calendar.component.ts | 30 + .../ngx-markdown/ngx-markdown.component.html | 52 + .../ngx-markdown/ngx-markdown.component.ts | 30 + .../quill-editor/quill-editor.component.html | 61 + .../quill-editor/quill-editor.component.ts | 30 + .../authentication/authentication.module.ts | 32 + .../confirmation-required.component.html | 26 + .../confirmation-required.component.ts | 18 + .../confirmation-required.module.ts | 75 + .../confirmation-required.component.html | 76 + .../confirmation-required.component.ts | 18 + .../confirmation-required.component.html | 76 + .../confirmation-required.component.ts | 18 + .../confirmation-required.component.html | 78 + .../confirmation-required.component.ts | 18 + .../confirmation-required.component.html | 78 + .../modern/confirmation-required.component.ts | 18 + .../confirmation-required.component.html | 76 + .../confirmation-required.component.ts | 18 + .../confirmation-required.component.html | 76 + .../confirmation-required.component.ts | 18 + .../classic/forgot-password.component.html | 73 + .../classic/forgot-password.component.ts | 55 + .../forgot-password/forgot-password.module.ts | 75 + .../forgot-password.component.html | 123 + .../forgot-password.component.ts | 55 + .../fullscreen/forgot-password.component.html | 123 + .../fullscreen/forgot-password.component.ts | 55 + .../forgot-password.component.html | 125 + .../forgot-password.component.ts | 55 + .../modern/forgot-password.component.html | 125 + .../modern/forgot-password.component.ts | 55 + .../forgot-password.component.html | 123 + .../forgot-password.component.ts | 55 + .../forgot-password.component.html | 123 + .../split-screen/forgot-password.component.ts | 55 + .../classic/reset-password.component.html | 117 + .../classic/reset-password.component.ts | 61 + .../reset-password.component.html | 167 + .../reset-password.component.ts | 61 + .../fullscreen/reset-password.component.html | 167 + .../fullscreen/reset-password.component.ts | 61 + .../reset-password.component.html | 169 + .../reset-password.component.ts | 61 + .../modern/reset-password.component.html | 169 + .../modern/reset-password.component.ts | 61 + .../reset-password/reset-password.module.ts | 77 + .../reset-password.component.html | 167 + .../reset-password.component.ts | 61 + .../reset-password.component.html | 167 + .../split-screen/reset-password.component.ts | 61 + .../sign-in/classic/sign-in.component.html | 145 + .../sign-in/classic/sign-in.component.ts | 59 + .../sign-in.component.html | 195 + .../fullscreen-reversed/sign-in.component.ts | 59 + .../sign-in/fullscreen/sign-in.component.html | 195 + .../sign-in/fullscreen/sign-in.component.ts | 59 + .../modern-reversed/sign-in.component.html | 197 + .../modern-reversed/sign-in.component.ts | 59 + .../sign-in/modern/sign-in.component.html | 197 + .../sign-in/modern/sign-in.component.ts | 59 + .../authentication/sign-in/sign-in.module.ts | 79 + .../sign-in.component.html | 195 + .../sign-in.component.ts | 59 + .../split-screen/sign-in.component.html | 195 + .../sign-in/split-screen/sign-in.component.ts | 59 + .../sign-out/classic/sign-out.component.html | 33 + .../sign-out/classic/sign-out.component.ts | 29 + .../sign-out.component.html | 83 + .../fullscreen-reversed/sign-out.component.ts | 29 + .../fullscreen/sign-out.component.html | 83 + .../sign-out/fullscreen/sign-out.component.ts | 29 + .../modern-reversed/sign-out.component.html | 85 + .../modern-reversed/sign-out.component.ts | 29 + .../sign-out/modern/sign-out.component.html | 85 + .../sign-out/modern/sign-out.component.ts | 29 + .../sign-out/sign-out.module.ts | 69 + .../sign-out.component.html | 83 + .../sign-out.component.ts | 29 + .../split-screen/sign-out.component.html | 83 + .../split-screen/sign-out.component.ts | 29 + .../sign-up/classic/sign-up.component.html | 136 + .../sign-up/classic/sign-up.component.ts | 64 + .../sign-up.component.html | 186 + .../fullscreen-reversed/sign-up.component.ts | 64 + .../sign-up/fullscreen/sign-up.component.html | 186 + .../sign-up/fullscreen/sign-up.component.ts | 64 + .../modern-reversed/sign-up.component.html | 188 + .../modern-reversed/sign-up.component.ts | 64 + .../sign-up/modern/sign-up.component.html | 188 + .../sign-up/modern/sign-up.component.ts | 64 + .../authentication/sign-up/sign-up.module.ts | 79 + .../sign-up.component.html | 186 + .../sign-up.component.ts | 64 + .../split-screen/sign-up.component.html | 186 + .../sign-up/split-screen/sign-up.component.ts | 64 + .../classic/unlock-session.component.html | 94 + .../classic/unlock-session.component.ts | 64 + .../unlock-session.component.html | 144 + .../unlock-session.component.ts | 64 + .../fullscreen/unlock-session.component.html | 144 + .../fullscreen/unlock-session.component.ts | 64 + .../unlock-session.component.html | 146 + .../unlock-session.component.ts | 64 + .../modern/unlock-session.component.html | 146 + .../modern/unlock-session.component.ts | 64 + .../unlock-session.component.html | 144 + .../unlock-session.component.ts | 64 + .../unlock-session.component.html | 144 + .../split-screen/unlock-session.component.ts | 64 + .../unlock-session/unlock-session.module.ts | 77 + .../classic/coming-soon.component.html | 73 + .../classic/coming-soon.component.ts | 88 + .../pages/coming-soon/coming-soon.module.ts | 74 + .../coming-soon.component.html | 123 + .../coming-soon.component.ts | 88 + .../fullscreen/coming-soon.component.html | 123 + .../fullscreen/coming-soon.component.ts | 88 + .../coming-soon.component.html | 125 + .../modern-reversed/coming-soon.component.ts | 88 + .../modern/coming-soon.component.html | 125 + .../modern/coming-soon.component.ts | 88 + .../coming-soon.component.html | 123 + .../coming-soon.component.ts | 88 + .../split-screen/coming-soon.component.html | 123 + .../split-screen/coming-soon.component.ts | 88 + .../error/error-404/error-404.component.html | 64 + .../error/error-404/error-404.component.ts | 17 + .../pages/error/error-404/error-404.module.ts | 16 + .../error/error-404/error-404.routing.ts | 9 + .../error/error-500/error-500.component.html | 73 + .../error/error-500/error-500.component.ts | 17 + .../pages/error/error-500/error-500.module.ts | 16 + .../error/error-500/error-500.routing.ts | 9 + .../printable/compact/compact.component.html | 163 + .../printable/compact/compact.component.ts | 17 + .../printable/compact/compact.module.ts | 18 + .../printable/compact/compact.routing.ts | 9 + .../printable/modern/modern.component.html | 163 + .../printable/modern/modern.component.ts | 17 + .../invoice/printable/modern/modern.module.ts | 16 + .../printable/modern/modern.routing.ts | 9 + .../maintenance/maintenance.component.html | 49 + .../maintenance/maintenance.component.ts | 17 + .../pages/maintenance/maintenance.module.ts | 16 + .../pages/maintenance/maintenance.routing.ts | 9 + .../pricing/modern/modern.component.html | 435 + .../pages/pricing/modern/modern.component.ts | 19 + .../pages/pricing/modern/modern.module.ts | 24 + .../pages/pricing/modern/modern.routing.ts | 9 + .../pricing/simple/simple.component.html | 344 + .../pages/pricing/simple/simple.component.ts | 19 + .../pages/pricing/simple/simple.module.ts | 24 + .../pages/pricing/simple/simple.routing.ts | 9 + .../pricing/single/single.component.html | 260 + .../pages/pricing/single/single.component.ts | 17 + .../pages/pricing/single/single.module.ts | 24 + .../pages/pricing/single/single.routing.ts | 9 + .../pages/pricing/table/table.component.html | 476 + .../pages/pricing/table/table.component.ts | 19 + .../admin/pages/pricing/table/table.module.ts | 24 + .../pages/pricing/table/table.routing.ts | 9 + .../pages/profile/profile.component.html | 1836 + .../admin/pages/profile/profile.component.ts | 17 + .../admin/pages/profile/profile.module.ts | 34 + .../admin/pages/profile/profile.routing.ts | 9 + .../angular-material.component.html | 73 + .../angular-material.component.ts | 16 + .../angular-material.module.ts | 24 + .../ui/animations/animations.component.html | 2018 ++ .../ui/animations/animations.component.scss | 62 + .../ui/animations/animations.component.ts | 151 + .../admin/ui/animations/animations.module.ts | 34 + .../admin/ui/cards/cards.component.html | 4263 +++ .../modules/admin/ui/cards/cards.component.ts | 131 + .../modules/admin/ui/cards/cards.module.ts | 46 + .../admin/ui/colors/colors.component.html | 143 + .../admin/ui/colors/colors.component.ts | 18 + .../modules/admin/ui/colors/colors.module.ts | 32 + .../ui/datatable/datatable.component.html | 52 + .../admin/ui/datatable/datatable.component.ts | 16 + .../admin/ui/datatable/datatable.module.ts | 24 + .../ui/forms/fields/fields.component.html | 770 + .../admin/ui/forms/fields/fields.component.ts | 31 + .../admin/ui/forms/fields/fields.module.ts | 50 + .../ui/forms/layouts/layouts.component.html | 971 + .../ui/forms/layouts/layouts.component.ts | 16 + .../admin/ui/forms/layouts/layouts.module.ts | 42 + .../ui/forms/wizards/wizards.component.html | 554 + .../ui/forms/wizards/wizards.component.ts | 76 + .../admin/ui/forms/wizards/wizards.module.ts | 40 + .../admin/ui/icons/icons.component.html | 96 + .../modules/admin/ui/icons/icons.component.ts | 128 + .../modules/admin/ui/icons/icons.module.ts | 51 + .../modules/admin/ui/icons/icons.resolvers.ts | 32 + .../modules/admin/ui/icons/icons.service.ts | 53 + src/app/modules/admin/ui/icons/icons.types.ts | 7 + .../content-scroll/fullwidth.component.html | 73 + .../content-scroll/fullwidth.component.ts | 16 + .../normal-scroll/fullwidth.component.html | 71 + .../normal-scroll/fullwidth.component.ts | 16 + .../page-scroll/fullwidth.component.html | 73 + .../page-scroll/fullwidth.component.ts | 16 + .../left-sidebar-1.component.html | 82 + .../left-sidebar-1.component.ts | 16 + .../left-sidebar-1.component.html | 80 + .../normal-scroll/left-sidebar-1.component.ts | 16 + .../page-scroll/left-sidebar-1.component.html | 82 + .../page-scroll/left-sidebar-1.component.ts | 16 + .../left-sidebar-2.component.html | 83 + .../left-sidebar-2.component.ts | 61 + .../left-sidebar-2.component.html | 81 + .../normal-scroll/left-sidebar-2.component.ts | 61 + .../page-scroll/left-sidebar-2.component.html | 83 + .../page-scroll/left-sidebar-2.component.ts | 61 + .../right-sidebar-1.component.html | 83 + .../right-sidebar-1.component.ts | 16 + .../right-sidebar-1.component.html | 81 + .../right-sidebar-1.component.ts | 16 + .../right-sidebar-1.component.html | 83 + .../page-scroll/right-sidebar-1.component.ts | 16 + .../right-sidebar-2.component.html | 84 + .../right-sidebar-2.component.ts | 61 + .../right-sidebar-2.component.html | 82 + .../right-sidebar-2.component.ts | 61 + .../right-sidebar-2.component.html | 84 + .../page-scroll/right-sidebar-2.component.ts | 61 + .../demo-placeholder.component.ts | 18 + .../demo-placeholder.module.ts | 14 + .../demo-sidebar/demo-sidebar.component.ts | 199 + .../demo-sidebar/demo-sidebar.module.ts | 24 + .../layout-overview.component.ts | 136 + .../layout-overview/layout-overview.module.ts | 28 + .../empty/normal-scroll/empty.component.html | 11 + .../empty/normal-scroll/empty.component.ts | 16 + .../empty/page-scroll/empty.component.html | 13 + .../empty/page-scroll/empty.component.ts | 16 + .../overview/overview.component.html | 62 + .../overview/overview.component.ts | 16 + .../ui/page-layouts/page-layouts.module.ts | 1038 + .../content-scroll/fullwidth.component.html | 73 + .../content-scroll/fullwidth.component.ts | 16 + .../normal-scroll/fullwidth.component.html | 71 + .../normal-scroll/fullwidth.component.ts | 16 + .../page-scroll/fullwidth.component.html | 73 + .../page-scroll/fullwidth.component.ts | 16 + .../left-sidebar-1.component.html | 39 + .../left-sidebar-1.component.ts | 61 + .../left-sidebar-1.component.html | 39 + .../normal-scroll/left-sidebar-1.component.ts | 61 + .../page-scroll/left-sidebar-1.component.html | 41 + .../page-scroll/left-sidebar-1.component.ts | 61 + .../left-sidebar-2.component.html | 81 + .../left-sidebar-2.component.ts | 61 + .../left-sidebar-2.component.html | 83 + .../inner-scroll/left-sidebar-2.component.ts | 61 + .../left-sidebar-2.component.html | 81 + .../normal-scroll/left-sidebar-2.component.ts | 61 + .../page-scroll/left-sidebar-2.component.html | 83 + .../page-scroll/left-sidebar-2.component.ts | 61 + .../left-sidebar-3.component.html | 81 + .../left-sidebar-3.component.ts | 61 + .../left-sidebar-3.component.html | 81 + .../normal-scroll/left-sidebar-3.component.ts | 61 + .../page-scroll/left-sidebar-3.component.html | 83 + .../page-scroll/left-sidebar-3.component.ts | 61 + .../right-sidebar-1.component.html | 40 + .../right-sidebar-1.component.ts | 61 + .../right-sidebar-1.component.html | 40 + .../right-sidebar-1.component.ts | 61 + .../right-sidebar-1.component.html | 42 + .../page-scroll/right-sidebar-1.component.ts | 61 + .../right-sidebar-2.component.html | 82 + .../right-sidebar-2.component.ts | 61 + .../right-sidebar-2.component.html | 84 + .../inner-scroll/right-sidebar-2.component.ts | 61 + .../right-sidebar-2.component.html | 82 + .../right-sidebar-2.component.ts | 61 + .../right-sidebar-2.component.html | 84 + .../page-scroll/right-sidebar-2.component.ts | 61 + .../right-sidebar-3.component.html | 82 + .../right-sidebar-3.component.ts | 61 + .../right-sidebar-3.component.html | 82 + .../right-sidebar-3.component.ts | 61 + .../right-sidebar-3.component.html | 84 + .../page-scroll/right-sidebar-3.component.ts | 61 + .../ui/tailwindcss/tailwindcss.component.html | 50 + .../ui/tailwindcss/tailwindcss.component.ts | 16 + .../ui/tailwindcss/tailwindcss.module.ts | 24 + .../ui/typography/typography.component.html | 439 + .../ui/typography/typography.component.ts | 16 + .../admin/ui/typography/typography.module.ts | 28 + .../confirmation-required.component.html | 76 + .../confirmation-required.component.ts | 18 + .../confirmation-required.module.ts | 22 + .../confirmation-required.routing.ts | 9 + .../forgot-password.component.html | 123 + .../forgot-password.component.ts | 105 + .../forgot-password/forgot-password.module.ts | 32 + .../forgot-password.routing.ts | 9 + .../reset-password.component.html | 167 + .../reset-password.component.ts | 111 + .../reset-password/reset-password.module.ts | 32 + .../reset-password/reset-password.routing.ts | 9 + .../auth/sign-in/sign-in.component.html | 195 + .../modules/auth/sign-in/sign-in.component.ts | 109 + .../modules/auth/sign-in/sign-in.module.ts | 34 + .../modules/auth/sign-in/sign-in.routing.ts | 9 + .../auth/sign-out/sign-out.component.html | 33 + .../auth/sign-out/sign-out.component.ts | 65 + .../modules/auth/sign-out/sign-out.module.ts | 22 + .../modules/auth/sign-out/sign-out.routing.ts | 9 + .../auth/sign-up/sign-up.component.html | 186 + .../modules/auth/sign-up/sign-up.component.ts | 104 + .../modules/auth/sign-up/sign-up.module.ts | 34 + .../modules/auth/sign-up/sign-up.routing.ts | 9 + .../unlock-session.component.html | 144 + .../unlock-session.component.ts | 129 + .../unlock-session/unlock-session.module.ts | 32 + .../unlock-session/unlock-session.routing.ts | 9 + .../modules/landing/home/home.component.html | 31 + .../modules/landing/home/home.component.ts | 16 + src/app/modules/landing/home/home.module.ts | 22 + src/app/modules/landing/home/home.routing.ts | 9 + src/app/shared/shared.module.ts | 19 + src/assets/.gitkeep | 0 src/assets/fonts/inter/Inter-italic.var.woff2 | Bin 0 -> 244760 bytes src/assets/fonts/inter/Inter-roman.var.woff2 | Bin 0 -> 227688 bytes src/assets/fonts/inter/inter.css | 17 + src/assets/icons/feather.svg | 4310 +++ src/assets/icons/heroicons-outline.svg | 695 + src/assets/icons/heroicons-solid.svg | 726 + src/assets/icons/iconsmind.svg | 29079 ++++++++++++++++ src/assets/icons/material-outline.svg | 6025 ++++ src/assets/icons/material-twotone.svg | 7590 ++++ src/assets/images/apps/contacts/flags.png | Bin 0 -> 33805 bytes .../apps/ecommerce/products/watch-01-01.jpg | Bin 0 -> 29845 bytes .../apps/ecommerce/products/watch-01-02.jpg | Bin 0 -> 33338 bytes .../apps/ecommerce/products/watch-01-03.jpg | Bin 0 -> 25433 bytes .../ecommerce/products/watch-01-thumb.jpg | Bin 0 -> 2332 bytes .../apps/ecommerce/products/watch-02-01.jpg | Bin 0 -> 27322 bytes .../apps/ecommerce/products/watch-02-02.jpg | Bin 0 -> 44651 bytes .../apps/ecommerce/products/watch-02-03.jpg | Bin 0 -> 32916 bytes .../ecommerce/products/watch-02-thumb.jpg | Bin 0 -> 1825 bytes .../apps/ecommerce/products/watch-03-01.jpg | Bin 0 -> 48549 bytes .../apps/ecommerce/products/watch-03-02.jpg | Bin 0 -> 47572 bytes .../apps/ecommerce/products/watch-03-03.jpg | Bin 0 -> 108543 bytes .../ecommerce/products/watch-03-thumb.jpg | Bin 0 -> 1870 bytes .../apps/ecommerce/products/watch-04-01.jpg | Bin 0 -> 29274 bytes .../apps/ecommerce/products/watch-04-02.jpg | Bin 0 -> 37992 bytes .../apps/ecommerce/products/watch-04-03.jpg | Bin 0 -> 38757 bytes .../ecommerce/products/watch-04-thumb.jpg | Bin 0 -> 1993 bytes .../apps/ecommerce/products/watch-05-01.jpg | Bin 0 -> 47786 bytes .../apps/ecommerce/products/watch-05-02.jpg | Bin 0 -> 67235 bytes .../apps/ecommerce/products/watch-05-03.jpg | Bin 0 -> 37235 bytes .../ecommerce/products/watch-05-thumb.jpg | Bin 0 -> 2120 bytes .../apps/ecommerce/products/watch-06-01.jpg | Bin 0 -> 56982 bytes .../apps/ecommerce/products/watch-06-02.jpg | Bin 0 -> 55674 bytes .../apps/ecommerce/products/watch-06-03.jpg | Bin 0 -> 61953 bytes .../ecommerce/products/watch-06-thumb.jpg | Bin 0 -> 2482 bytes .../apps/ecommerce/products/watch-07-01.jpg | Bin 0 -> 62512 bytes .../apps/ecommerce/products/watch-07-02.jpg | Bin 0 -> 62246 bytes .../apps/ecommerce/products/watch-07-03.jpg | Bin 0 -> 76761 bytes .../ecommerce/products/watch-07-thumb.jpg | Bin 0 -> 2076 bytes .../apps/ecommerce/products/watch-08-01.jpg | Bin 0 -> 50767 bytes .../apps/ecommerce/products/watch-08-02.jpg | Bin 0 -> 51869 bytes .../apps/ecommerce/products/watch-08-03.jpg | Bin 0 -> 63582 bytes .../ecommerce/products/watch-08-thumb.jpg | Bin 0 -> 2241 bytes .../apps/ecommerce/products/watch-09-01.jpg | Bin 0 -> 31325 bytes .../apps/ecommerce/products/watch-09-02.jpg | Bin 0 -> 43828 bytes .../apps/ecommerce/products/watch-09-03.jpg | Bin 0 -> 30309 bytes .../ecommerce/products/watch-09-thumb.jpg | Bin 0 -> 1874 bytes .../apps/ecommerce/products/watch-10-01.jpg | Bin 0 -> 26390 bytes .../apps/ecommerce/products/watch-10-02.jpg | Bin 0 -> 35374 bytes .../apps/ecommerce/products/watch-10-03.jpg | Bin 0 -> 58346 bytes .../ecommerce/products/watch-10-thumb.jpg | Bin 0 -> 1738 bytes .../apps/ecommerce/products/watch-11-01.jpg | Bin 0 -> 30634 bytes .../apps/ecommerce/products/watch-11-02.jpg | Bin 0 -> 37070 bytes .../apps/ecommerce/products/watch-11-03.jpg | Bin 0 -> 48898 bytes .../ecommerce/products/watch-11-thumb.jpg | Bin 0 -> 1718 bytes .../apps/ecommerce/products/watch-12-01.jpg | Bin 0 -> 23057 bytes .../apps/ecommerce/products/watch-12-02.jpg | Bin 0 -> 27222 bytes .../apps/ecommerce/products/watch-12-03.jpg | Bin 0 -> 26010 bytes .../ecommerce/products/watch-12-thumb.jpg | Bin 0 -> 1594 bytes .../apps/ecommerce/products/watch-13-01.jpg | Bin 0 -> 41366 bytes .../apps/ecommerce/products/watch-13-02.jpg | Bin 0 -> 44818 bytes .../apps/ecommerce/products/watch-13-03.jpg | Bin 0 -> 107097 bytes .../ecommerce/products/watch-13-thumb.jpg | Bin 0 -> 2091 bytes .../apps/ecommerce/products/watch-14-01.jpg | Bin 0 -> 43550 bytes .../apps/ecommerce/products/watch-14-02.jpg | Bin 0 -> 55267 bytes .../apps/ecommerce/products/watch-14-03.jpg | Bin 0 -> 63641 bytes .../ecommerce/products/watch-14-thumb.jpg | Bin 0 -> 2430 bytes .../apps/ecommerce/products/watch-15-01.jpg | Bin 0 -> 31619 bytes .../apps/ecommerce/products/watch-15-02.jpg | Bin 0 -> 47701 bytes .../apps/ecommerce/products/watch-15-03.jpg | Bin 0 -> 66092 bytes .../ecommerce/products/watch-15-thumb.jpg | Bin 0 -> 1751 bytes .../apps/ecommerce/products/watch-16-01.jpg | Bin 0 -> 31394 bytes .../apps/ecommerce/products/watch-16-02.jpg | Bin 0 -> 36650 bytes .../apps/ecommerce/products/watch-16-03.jpg | Bin 0 -> 74096 bytes .../ecommerce/products/watch-16-thumb.jpg | Bin 0 -> 2218 bytes .../apps/ecommerce/products/watch-17-01.jpg | Bin 0 -> 44036 bytes .../apps/ecommerce/products/watch-17-02.jpg | Bin 0 -> 53926 bytes .../apps/ecommerce/products/watch-17-03.jpg | Bin 0 -> 60500 bytes .../ecommerce/products/watch-17-thumb.jpg | Bin 0 -> 2385 bytes .../apps/ecommerce/products/watch-18-01.jpg | Bin 0 -> 36518 bytes .../apps/ecommerce/products/watch-18-02.jpg | Bin 0 -> 44001 bytes .../apps/ecommerce/products/watch-18-03.jpg | Bin 0 -> 58765 bytes .../ecommerce/products/watch-18-thumb.jpg | Bin 0 -> 1913 bytes .../apps/ecommerce/products/watch-19-01.jpg | Bin 0 -> 27962 bytes .../apps/ecommerce/products/watch-19-02.jpg | Bin 0 -> 36789 bytes .../apps/ecommerce/products/watch-19-03.jpg | Bin 0 -> 34184 bytes .../ecommerce/products/watch-19-thumb.jpg | Bin 0 -> 1978 bytes .../apps/ecommerce/products/watch-20-01.jpg | Bin 0 -> 31529 bytes .../apps/ecommerce/products/watch-20-02.jpg | Bin 0 -> 37316 bytes .../apps/ecommerce/products/watch-20-03.jpg | Bin 0 -> 50885 bytes .../ecommerce/products/watch-20-thumb.jpg | Bin 0 -> 1745 bytes .../apps/ecommerce/products/watch-21-01.jpg | Bin 0 -> 29518 bytes .../apps/ecommerce/products/watch-21-02.jpg | Bin 0 -> 42273 bytes .../apps/ecommerce/products/watch-21-03.jpg | Bin 0 -> 42234 bytes .../ecommerce/products/watch-21-thumb.jpg | Bin 0 -> 1654 bytes .../apps/ecommerce/products/watch-22-01.jpg | Bin 0 -> 29783 bytes .../apps/ecommerce/products/watch-22-02.jpg | Bin 0 -> 36659 bytes .../apps/ecommerce/products/watch-22-03.jpg | Bin 0 -> 55302 bytes .../ecommerce/products/watch-22-thumb.jpg | Bin 0 -> 1922 bytes .../apps/ecommerce/products/watch-23-01.jpg | Bin 0 -> 38415 bytes .../apps/ecommerce/products/watch-23-02.jpg | Bin 0 -> 70470 bytes .../apps/ecommerce/products/watch-23-03.jpg | Bin 0 -> 47694 bytes .../ecommerce/products/watch-23-thumb.jpg | Bin 0 -> 2072 bytes .../apps/mailbox/birds-eye-sydney_preview.jpg | Bin 0 -> 14294 bytes .../apps/mailbox/lake-of-carrezza_preview.png | Bin 0 -> 13071 bytes .../apps/mailbox/mystery-forest_preview.jpg | Bin 0 -> 15539 bytes .../yosemite-national-park_preview.png | Bin 0 -> 14242 bytes src/assets/images/avatars/brian-hughes.jpg | Bin 0 -> 8062 bytes src/assets/images/avatars/female-01.jpg | Bin 0 -> 6770 bytes src/assets/images/avatars/female-02.jpg | Bin 0 -> 8657 bytes src/assets/images/avatars/female-03.jpg | Bin 0 -> 7786 bytes src/assets/images/avatars/female-04.jpg | Bin 0 -> 9125 bytes src/assets/images/avatars/female-05.jpg | Bin 0 -> 6046 bytes src/assets/images/avatars/female-06.jpg | Bin 0 -> 6414 bytes src/assets/images/avatars/female-07.jpg | Bin 0 -> 10360 bytes src/assets/images/avatars/female-08.jpg | Bin 0 -> 9690 bytes src/assets/images/avatars/female-09.jpg | Bin 0 -> 9179 bytes src/assets/images/avatars/female-10.jpg | Bin 0 -> 8330 bytes src/assets/images/avatars/female-11.jpg | Bin 0 -> 5835 bytes src/assets/images/avatars/female-12.jpg | Bin 0 -> 8524 bytes src/assets/images/avatars/female-13.jpg | Bin 0 -> 5478 bytes src/assets/images/avatars/female-14.jpg | Bin 0 -> 7784 bytes src/assets/images/avatars/female-15.jpg | Bin 0 -> 7531 bytes src/assets/images/avatars/female-16.jpg | Bin 0 -> 6085 bytes src/assets/images/avatars/female-17.jpg | Bin 0 -> 6762 bytes src/assets/images/avatars/female-18.jpg | Bin 0 -> 6870 bytes src/assets/images/avatars/female-19.jpg | Bin 0 -> 5431 bytes src/assets/images/avatars/female-20.jpg | Bin 0 -> 10317 bytes src/assets/images/avatars/male-01.jpg | Bin 0 -> 4794 bytes src/assets/images/avatars/male-02.jpg | Bin 0 -> 10901 bytes src/assets/images/avatars/male-03.jpg | Bin 0 -> 12467 bytes src/assets/images/avatars/male-04.jpg | Bin 0 -> 8062 bytes src/assets/images/avatars/male-05.jpg | Bin 0 -> 5975 bytes src/assets/images/avatars/male-06.jpg | Bin 0 -> 10645 bytes src/assets/images/avatars/male-07.jpg | Bin 0 -> 8347 bytes src/assets/images/avatars/male-08.jpg | Bin 0 -> 6354 bytes src/assets/images/avatars/male-09.jpg | Bin 0 -> 6177 bytes src/assets/images/avatars/male-10.jpg | Bin 0 -> 9704 bytes src/assets/images/avatars/male-11.jpg | Bin 0 -> 10702 bytes src/assets/images/avatars/male-12.jpg | Bin 0 -> 8946 bytes src/assets/images/avatars/male-13.jpg | Bin 0 -> 11725 bytes src/assets/images/avatars/male-14.jpg | Bin 0 -> 9229 bytes src/assets/images/avatars/male-15.jpg | Bin 0 -> 10129 bytes src/assets/images/avatars/male-16.jpg | Bin 0 -> 8695 bytes src/assets/images/avatars/male-17.jpg | Bin 0 -> 5135 bytes src/assets/images/avatars/male-18.jpg | Bin 0 -> 4772 bytes src/assets/images/avatars/male-19.jpg | Bin 0 -> 8542 bytes src/assets/images/avatars/male-20.jpg | Bin 0 -> 4161 bytes src/assets/images/cards/01-320x200.jpg | Bin 0 -> 54791 bytes src/assets/images/cards/02-320x200.jpg | Bin 0 -> 71656 bytes src/assets/images/cards/03-320x200.jpg | Bin 0 -> 59429 bytes src/assets/images/cards/04-320x200.jpg | Bin 0 -> 33751 bytes src/assets/images/cards/05-320x200.jpg | Bin 0 -> 42378 bytes src/assets/images/cards/06-320x200.jpg | Bin 0 -> 36980 bytes src/assets/images/cards/07-320x200.jpg | Bin 0 -> 41624 bytes src/assets/images/cards/08-320x200.jpg | Bin 0 -> 32850 bytes src/assets/images/cards/09-320x200.jpg | Bin 0 -> 32150 bytes src/assets/images/cards/10-320x200.jpg | Bin 0 -> 61295 bytes src/assets/images/cards/11-512x512.jpg | Bin 0 -> 29209 bytes src/assets/images/cards/12-512x512.jpg | Bin 0 -> 21035 bytes src/assets/images/cards/13-160x160.jpg | Bin 0 -> 7084 bytes src/assets/images/cards/14-640x480.jpg | Bin 0 -> 41179 bytes src/assets/images/cards/15-640x480.jpg | Bin 0 -> 114215 bytes src/assets/images/cards/16-640x480.jpg | Bin 0 -> 59993 bytes src/assets/images/cards/17-640x480.jpg | Bin 0 -> 214958 bytes src/assets/images/cards/18-640x480.jpg | Bin 0 -> 80393 bytes src/assets/images/cards/19-640x480.jpg | Bin 0 -> 139550 bytes src/assets/images/cards/20-640x480.jpg | Bin 0 -> 106212 bytes src/assets/images/cards/21-640x480.jpg | Bin 0 -> 57304 bytes src/assets/images/cards/22-640x480.jpg | Bin 0 -> 122120 bytes src/assets/images/cards/23-640x480.jpg | Bin 0 -> 103992 bytes src/assets/images/cards/24-640x480.jpg | Bin 0 -> 107966 bytes src/assets/images/cards/25-640x480.jpg | Bin 0 -> 160087 bytes src/assets/images/cards/26-640x480.jpg | Bin 0 -> 226065 bytes src/assets/images/cards/27-640x480.jpg | Bin 0 -> 47654 bytes src/assets/images/cards/28-640x480.jpg | Bin 0 -> 85905 bytes src/assets/images/cards/29-640x480.jpg | Bin 0 -> 196894 bytes src/assets/images/cards/30-640x480.jpg | Bin 0 -> 168776 bytes src/assets/images/cards/31-640x480.jpg | Bin 0 -> 121671 bytes src/assets/images/cards/32-640x480.jpg | Bin 0 -> 233898 bytes src/assets/images/cards/33-640x480.jpg | Bin 0 -> 110875 bytes src/assets/images/cards/34-640x480.jpg | Bin 0 -> 100667 bytes src/assets/images/cards/35-640x480.jpg | Bin 0 -> 185769 bytes src/assets/images/cards/36-640x480.jpg | Bin 0 -> 76640 bytes src/assets/images/cards/avatar-400x400.jpg | Bin 0 -> 36226 bytes .../images/cards/coffee-shop-01-320x200.jpg | Bin 0 -> 80450 bytes .../images/cards/coffee-shop-02-512x512.jpg | Bin 0 -> 54082 bytes .../images/cards/coffee-shop-03-320x320.jpg | Bin 0 -> 37033 bytes .../images/cards/mansion-01-320x200.jpg | Bin 0 -> 61032 bytes .../images/cards/product-01-224x256.jpg | Bin 0 -> 8393 bytes .../images/cards/sneakers-01-320x200.jpg | Bin 0 -> 12998 bytes .../images/cards/sneakers-02-448x560.jpg | Bin 0 -> 32651 bytes .../images/cards/sneakers-03-448x560.jpg | Bin 0 -> 33154 bytes src/assets/images/logo/logo-text-on-dark.svg | 50 + src/assets/images/logo/logo-text.svg | 50 + src/assets/images/logo/logo.svg | 37 + .../images/pages/help-center/image-1.jpg | Bin 0 -> 194741 bytes src/assets/images/pages/profile/cover.jpg | Bin 0 -> 483873 bytes src/assets/styles/splash-screen.css | 80 + src/environments/environment.prod.ts | 3 + src/environments/environment.ts | 16 + src/favicon-16x16.png | Bin 0 -> 540 bytes src/favicon-32x32.png | Bin 0 -> 838 bytes src/global.d.ts | 8 + src/index.html | 73 + src/main.ts | 12 + src/polyfills.ts | 64 + src/styles/styles.scss | 4 + src/styles/tailwind.scss | 4 + src/styles/vendors.scss | 15 + src/test.ts | 24 + tailwind.config.js | 472 + tsconfig.app.json | 15 + tsconfig.json | 24 + tsconfig.spec.json | 18 + tslint.json | 169 + 1019 files changed, 170506 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 CREDITS create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 angular.json create mode 100644 e2e/protractor.conf.js create mode 100644 e2e/src/app.e2e-spec.ts create mode 100644 e2e/src/app.po.ts create mode 100644 e2e/tsconfig.json create mode 100644 karma.conf.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/@fuse/animations/defaults.ts create mode 100644 src/@fuse/animations/expand-collapse.ts create mode 100644 src/@fuse/animations/fade.ts create mode 100644 src/@fuse/animations/index.ts create mode 100644 src/@fuse/animations/public-api.ts create mode 100644 src/@fuse/animations/shake.ts create mode 100644 src/@fuse/animations/slide.ts create mode 100644 src/@fuse/animations/zoom.ts create mode 100644 src/@fuse/components/alert/alert.component.html create mode 100644 src/@fuse/components/alert/alert.component.scss create mode 100644 src/@fuse/components/alert/alert.component.ts create mode 100644 src/@fuse/components/alert/alert.module.ts create mode 100644 src/@fuse/components/alert/alert.service.ts create mode 100644 src/@fuse/components/alert/alert.types.ts create mode 100644 src/@fuse/components/alert/index.ts create mode 100644 src/@fuse/components/alert/public-api.ts create mode 100644 src/@fuse/components/card/card.component.html create mode 100644 src/@fuse/components/card/card.component.scss create mode 100644 src/@fuse/components/card/card.component.ts create mode 100644 src/@fuse/components/card/card.module.ts create mode 100644 src/@fuse/components/card/card.types.ts create mode 100644 src/@fuse/components/card/index.ts create mode 100644 src/@fuse/components/card/public-api.ts create mode 100644 src/@fuse/components/date-range/date-range.component.html create mode 100644 src/@fuse/components/date-range/date-range.component.scss create mode 100644 src/@fuse/components/date-range/date-range.component.ts create mode 100644 src/@fuse/components/date-range/date-range.module.ts create mode 100644 src/@fuse/components/date-range/index.ts create mode 100644 src/@fuse/components/date-range/public-api.ts create mode 100644 src/@fuse/components/drawer/drawer.component.html create mode 100644 src/@fuse/components/drawer/drawer.component.scss create mode 100644 src/@fuse/components/drawer/drawer.component.ts create mode 100644 src/@fuse/components/drawer/drawer.module.ts create mode 100644 src/@fuse/components/drawer/drawer.service.ts create mode 100644 src/@fuse/components/drawer/drawer.types.ts create mode 100644 src/@fuse/components/drawer/index.ts create mode 100644 src/@fuse/components/drawer/public-api.ts create mode 100644 src/@fuse/components/highlight/highlight.component.html create mode 100644 src/@fuse/components/highlight/highlight.component.scss create mode 100644 src/@fuse/components/highlight/highlight.component.ts create mode 100644 src/@fuse/components/highlight/highlight.module.ts create mode 100644 src/@fuse/components/highlight/highlight.service.ts create mode 100644 src/@fuse/components/highlight/index.ts create mode 100644 src/@fuse/components/highlight/public-api.ts create mode 100644 src/@fuse/components/navigation/horizontal/components/basic/basic.component.html create mode 100644 src/@fuse/components/navigation/horizontal/components/basic/basic.component.ts create mode 100644 src/@fuse/components/navigation/horizontal/components/branch/branch.component.html create mode 100644 src/@fuse/components/navigation/horizontal/components/branch/branch.component.ts create mode 100644 src/@fuse/components/navigation/horizontal/components/divider/divider.component.html create mode 100644 src/@fuse/components/navigation/horizontal/components/divider/divider.component.ts create mode 100644 src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.html create mode 100644 src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.ts create mode 100644 src/@fuse/components/navigation/horizontal/horizontal.component.html create mode 100644 src/@fuse/components/navigation/horizontal/horizontal.component.scss create mode 100644 src/@fuse/components/navigation/horizontal/horizontal.component.ts create mode 100644 src/@fuse/components/navigation/index.ts create mode 100644 src/@fuse/components/navigation/navigation.module.ts create mode 100644 src/@fuse/components/navigation/navigation.service.ts create mode 100644 src/@fuse/components/navigation/navigation.types.ts create mode 100644 src/@fuse/components/navigation/public-api.ts create mode 100644 src/@fuse/components/navigation/vertical/components/aside/aside.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/aside/aside.component.ts create mode 100644 src/@fuse/components/navigation/vertical/components/basic/basic.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/basic/basic.component.ts create mode 100644 src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.ts create mode 100644 src/@fuse/components/navigation/vertical/components/divider/divider.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/divider/divider.component.ts create mode 100644 src/@fuse/components/navigation/vertical/components/group/group.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/group/group.component.ts create mode 100644 src/@fuse/components/navigation/vertical/components/spacer/spacer.component.html create mode 100644 src/@fuse/components/navigation/vertical/components/spacer/spacer.component.ts create mode 100644 src/@fuse/components/navigation/vertical/styles/appearances/compact.scss create mode 100644 src/@fuse/components/navigation/vertical/styles/appearances/default.scss create mode 100644 src/@fuse/components/navigation/vertical/styles/appearances/dense.scss create mode 100644 src/@fuse/components/navigation/vertical/styles/appearances/thin.scss create mode 100644 src/@fuse/components/navigation/vertical/vertical.component.html create mode 100644 src/@fuse/components/navigation/vertical/vertical.component.scss create mode 100644 src/@fuse/components/navigation/vertical/vertical.component.ts create mode 100644 src/@fuse/directives/autogrow/autogrow.directive.ts create mode 100644 src/@fuse/directives/autogrow/autogrow.module.ts create mode 100644 src/@fuse/directives/autogrow/index.ts create mode 100644 src/@fuse/directives/autogrow/public-api.ts create mode 100644 src/@fuse/directives/scroll-reset/index.ts create mode 100644 src/@fuse/directives/scroll-reset/public-api.ts create mode 100644 src/@fuse/directives/scroll-reset/scroll-reset.directive.ts create mode 100644 src/@fuse/directives/scroll-reset/scroll-reset.module.ts create mode 100644 src/@fuse/directives/scrollbar/index.ts create mode 100644 src/@fuse/directives/scrollbar/public-api.ts create mode 100644 src/@fuse/directives/scrollbar/scrollbar.directive.ts create mode 100644 src/@fuse/directives/scrollbar/scrollbar.module.ts create mode 100644 src/@fuse/directives/scrollbar/scrollbar.types.ts create mode 100644 src/@fuse/fuse.module.ts create mode 100644 src/@fuse/index.ts create mode 100644 src/@fuse/lib/mock-api/index.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.constants.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.interceptor.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.module.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.request-handler.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.service.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.types.ts create mode 100644 src/@fuse/lib/mock-api/mock-api.utils.ts create mode 100644 src/@fuse/lib/mock-api/public-api.ts create mode 100644 src/@fuse/pipes/find-by-key/find-by-key.module.ts create mode 100644 src/@fuse/pipes/find-by-key/find-by-key.pipe.ts create mode 100644 src/@fuse/pipes/find-by-key/index.ts create mode 100644 src/@fuse/pipes/find-by-key/public-api.ts create mode 100644 src/@fuse/services/config/config.constants.ts create mode 100644 src/@fuse/services/config/config.module.ts create mode 100644 src/@fuse/services/config/config.service.ts create mode 100644 src/@fuse/services/config/index.ts create mode 100644 src/@fuse/services/config/public-api.ts create mode 100644 src/@fuse/services/media-watcher/index.ts create mode 100644 src/@fuse/services/media-watcher/media-watcher.module.ts create mode 100644 src/@fuse/services/media-watcher/media-watcher.service.ts create mode 100644 src/@fuse/services/media-watcher/public-api.ts create mode 100644 src/@fuse/services/splash-screen/index.ts create mode 100644 src/@fuse/services/splash-screen/public-api.ts create mode 100644 src/@fuse/services/splash-screen/splash-screen.module.ts create mode 100644 src/@fuse/services/splash-screen/splash-screen.service.ts create mode 100644 src/@fuse/services/tailwind/index.ts create mode 100644 src/@fuse/services/tailwind/public-api.ts create mode 100644 src/@fuse/services/tailwind/tailwind.module.ts create mode 100644 src/@fuse/services/tailwind/tailwind.service.ts create mode 100644 src/@fuse/services/utils/index.ts create mode 100644 src/@fuse/services/utils/public-api.ts create mode 100644 src/@fuse/services/utils/utils.module.ts create mode 100644 src/@fuse/services/utils/utils.service.ts create mode 100644 src/@fuse/styles/components/example-viewer.scss create mode 100644 src/@fuse/styles/components/input.scss create mode 100644 src/@fuse/styles/core/tailwind-config.scss create mode 100644 src/@fuse/styles/main.scss create mode 100644 src/@fuse/styles/overrides/angular-material.scss create mode 100644 src/@fuse/styles/overrides/fullcalendar.scss create mode 100644 src/@fuse/styles/overrides/highlightjs.scss create mode 100644 src/@fuse/styles/overrides/perfect-scrollbar.scss create mode 100644 src/@fuse/styles/overrides/quill.scss create mode 100644 src/@fuse/styles/tailwind.scss create mode 100644 src/@fuse/styles/themes.scss create mode 100644 src/@fuse/tailwind/plugins/extract-config.js create mode 100644 src/@fuse/tailwind/plugins/icon-size.js create mode 100644 src/@fuse/tailwind/plugins/theming.js create mode 100644 src/@fuse/tailwind/plugins/utilities.js create mode 100644 src/@fuse/tailwind/utils/generate-contrasts.js create mode 100644 src/@fuse/tailwind/utils/generate-palette.js create mode 100644 src/@fuse/validators/index.ts create mode 100644 src/@fuse/validators/public-api.ts create mode 100644 src/@fuse/validators/validators.ts create mode 100644 src/@fuse/version/fuse-version.ts create mode 100644 src/@fuse/version/index.ts create mode 100644 src/@fuse/version/public-api.ts create mode 100644 src/@fuse/version/version.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/app.resolvers.ts create mode 100644 src/app/app.routing.ts create mode 100644 src/app/app.types.ts create mode 100644 src/app/core/auth/auth.interceptor.ts create mode 100644 src/app/core/auth/auth.service.ts create mode 100644 src/app/core/auth/auth.utils.ts create mode 100644 src/app/core/auth/guards/auth.guard.ts create mode 100644 src/app/core/auth/guards/noAuth.guard.ts create mode 100644 src/app/core/config/app.config.ts create mode 100644 src/app/core/core.module.ts create mode 100644 src/app/core/user/user.model.ts create mode 100644 src/app/core/user/user.service.ts create mode 100644 src/app/layout/common/messages/messages.component.html create mode 100644 src/app/layout/common/messages/messages.component.ts create mode 100644 src/app/layout/common/messages/messages.module.ts create mode 100644 src/app/layout/common/messages/messages.service.ts create mode 100644 src/app/layout/common/messages/messages.types.ts create mode 100644 src/app/layout/common/notifications/notifications.component.html create mode 100644 src/app/layout/common/notifications/notifications.component.ts create mode 100644 src/app/layout/common/notifications/notifications.module.ts create mode 100644 src/app/layout/common/notifications/notifications.service.ts create mode 100644 src/app/layout/common/notifications/notifications.types.ts create mode 100644 src/app/layout/common/search/search.component.html create mode 100644 src/app/layout/common/search/search.component.ts create mode 100644 src/app/layout/common/search/search.module.ts create mode 100644 src/app/layout/common/shortcuts/shortcuts.component.html create mode 100644 src/app/layout/common/shortcuts/shortcuts.component.ts create mode 100644 src/app/layout/common/shortcuts/shortcuts.module.ts create mode 100644 src/app/layout/common/shortcuts/shortcuts.service.ts create mode 100644 src/app/layout/common/shortcuts/shortcuts.types.ts create mode 100644 src/app/layout/common/user-menu/user-menu.component.html create mode 100644 src/app/layout/common/user-menu/user-menu.component.ts create mode 100644 src/app/layout/common/user-menu/user-menu.module.ts create mode 100644 src/app/layout/layout.component.html create mode 100644 src/app/layout/layout.component.scss create mode 100644 src/app/layout/layout.component.ts create mode 100644 src/app/layout/layout.module.ts create mode 100644 src/app/layout/layout.types.ts create mode 100644 src/app/layout/layouts/empty/empty.component.html create mode 100644 src/app/layout/layouts/empty/empty.component.ts create mode 100644 src/app/layout/layouts/empty/empty.module.ts create mode 100644 src/app/layout/layouts/horizontal/centered/centered.component.html create mode 100644 src/app/layout/layouts/horizontal/centered/centered.component.ts create mode 100644 src/app/layout/layouts/horizontal/centered/centered.module.ts create mode 100644 src/app/layout/layouts/horizontal/enterprise/enterprise.component.html create mode 100644 src/app/layout/layouts/horizontal/enterprise/enterprise.component.ts create mode 100644 src/app/layout/layouts/horizontal/enterprise/enterprise.module.ts create mode 100644 src/app/layout/layouts/horizontal/material/material.component.html create mode 100644 src/app/layout/layouts/horizontal/material/material.component.ts create mode 100644 src/app/layout/layouts/horizontal/material/material.module.ts create mode 100644 src/app/layout/layouts/horizontal/modern/modern.component.html create mode 100644 src/app/layout/layouts/horizontal/modern/modern.component.ts create mode 100644 src/app/layout/layouts/horizontal/modern/modern.module.ts create mode 100644 src/app/layout/layouts/vertical/classic/classic.component.html create mode 100644 src/app/layout/layouts/vertical/classic/classic.component.ts create mode 100644 src/app/layout/layouts/vertical/classic/classic.module.ts create mode 100644 src/app/layout/layouts/vertical/classy/classy.component.html create mode 100644 src/app/layout/layouts/vertical/classy/classy.component.ts create mode 100644 src/app/layout/layouts/vertical/classy/classy.module.ts create mode 100644 src/app/layout/layouts/vertical/compact/compact.component.html create mode 100644 src/app/layout/layouts/vertical/compact/compact.component.ts create mode 100644 src/app/layout/layouts/vertical/compact/compact.module.ts create mode 100644 src/app/layout/layouts/vertical/dense/dense.component.html create mode 100644 src/app/layout/layouts/vertical/dense/dense.component.ts create mode 100644 src/app/layout/layouts/vertical/dense/dense.module.ts create mode 100644 src/app/layout/layouts/vertical/futuristic/futuristic.component.html create mode 100644 src/app/layout/layouts/vertical/futuristic/futuristic.component.ts create mode 100644 src/app/layout/layouts/vertical/futuristic/futuristic.module.ts create mode 100644 src/app/layout/layouts/vertical/thin/thin.component.html create mode 100644 src/app/layout/layouts/vertical/thin/thin.component.ts create mode 100644 src/app/layout/layouts/vertical/thin/thin.module.ts create mode 100644 src/app/mock-api/apps/calendar/api.ts create mode 100644 src/app/mock-api/apps/calendar/data.ts create mode 100644 src/app/mock-api/apps/contacts/api.ts create mode 100644 src/app/mock-api/apps/contacts/data.ts create mode 100644 src/app/mock-api/apps/ecommerce/inventory/api.ts create mode 100644 src/app/mock-api/apps/ecommerce/inventory/data.ts create mode 100644 src/app/mock-api/apps/file-manager/api.ts create mode 100644 src/app/mock-api/apps/file-manager/data.ts create mode 100644 src/app/mock-api/apps/help-center/api.ts create mode 100644 src/app/mock-api/apps/help-center/data.ts create mode 100644 src/app/mock-api/apps/mailbox/api.ts create mode 100644 src/app/mock-api/apps/mailbox/data.ts create mode 100644 src/app/mock-api/apps/tasks/api.ts create mode 100644 src/app/mock-api/apps/tasks/data.ts create mode 100644 src/app/mock-api/common/auth/api.ts create mode 100644 src/app/mock-api/common/messages/api.ts create mode 100644 src/app/mock-api/common/messages/data.ts create mode 100644 src/app/mock-api/common/navigation/api.ts create mode 100644 src/app/mock-api/common/navigation/data.ts create mode 100644 src/app/mock-api/common/notifications/api.ts create mode 100644 src/app/mock-api/common/notifications/data.ts create mode 100644 src/app/mock-api/common/search/api.ts create mode 100644 src/app/mock-api/common/shortcuts/api.ts create mode 100644 src/app/mock-api/common/shortcuts/data.ts create mode 100644 src/app/mock-api/common/user/api.ts create mode 100644 src/app/mock-api/common/user/data.ts create mode 100644 src/app/mock-api/dashboards/analytics/api.ts create mode 100644 src/app/mock-api/dashboards/analytics/data.ts create mode 100644 src/app/mock-api/dashboards/project/api.ts create mode 100644 src/app/mock-api/dashboards/project/data.ts create mode 100644 src/app/mock-api/index.ts create mode 100644 src/app/mock-api/ui/icons/api.ts create mode 100644 src/app/mock-api/ui/icons/data.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.component.html create mode 100644 src/app/modules/admin/apps/calendar/calendar.component.scss create mode 100644 src/app/modules/admin/apps/calendar/calendar.component.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.module.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.resolvers.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.routing.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.service.ts create mode 100644 src/app/modules/admin/apps/calendar/calendar.types.ts create mode 100644 src/app/modules/admin/apps/calendar/recurrence/recurrence.component.html create mode 100644 src/app/modules/admin/apps/calendar/recurrence/recurrence.component.ts create mode 100644 src/app/modules/admin/apps/calendar/settings/settings.component.html create mode 100644 src/app/modules/admin/apps/calendar/settings/settings.component.ts create mode 100644 src/app/modules/admin/apps/calendar/sidebar/calendar-colors.ts create mode 100644 src/app/modules/admin/apps/calendar/sidebar/sidebar.component.html create mode 100644 src/app/modules/admin/apps/calendar/sidebar/sidebar.component.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.component.html create mode 100644 src/app/modules/admin/apps/contacts/contacts.component.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.guards.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.module.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.resolvers.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.routing.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.service.ts create mode 100644 src/app/modules/admin/apps/contacts/contacts.types.ts create mode 100644 src/app/modules/admin/apps/contacts/details/details.component.html create mode 100644 src/app/modules/admin/apps/contacts/details/details.component.ts create mode 100644 src/app/modules/admin/apps/contacts/list/list.component.html create mode 100644 src/app/modules/admin/apps/contacts/list/list.component.ts create mode 100644 src/app/modules/admin/apps/ecommerce/ecommerce.module.ts create mode 100644 src/app/modules/admin/apps/ecommerce/ecommerce.routing.ts create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/inventory.component.html create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/inventory.component.ts create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/inventory.resolvers.ts create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/inventory.service.ts create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/inventory.types.ts create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.html create mode 100644 src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.ts create mode 100644 src/app/modules/admin/apps/file-manager/details/details.component.html create mode 100644 src/app/modules/admin/apps/file-manager/details/details.component.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.component.html create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.component.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.guards.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.module.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.resolvers.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.routing.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.service.ts create mode 100644 src/app/modules/admin/apps/file-manager/file-manager.types.ts create mode 100644 src/app/modules/admin/apps/file-manager/list/list.component.html create mode 100644 src/app/modules/admin/apps/file-manager/list/list.component.ts create mode 100644 src/app/modules/admin/apps/help-center/faqs/faqs.component.html create mode 100644 src/app/modules/admin/apps/help-center/faqs/faqs.component.ts create mode 100644 src/app/modules/admin/apps/help-center/guides/category/category.component.html create mode 100644 src/app/modules/admin/apps/help-center/guides/category/category.component.ts create mode 100644 src/app/modules/admin/apps/help-center/guides/guide/guide.component.html create mode 100644 src/app/modules/admin/apps/help-center/guides/guide/guide.component.ts create mode 100644 src/app/modules/admin/apps/help-center/guides/guides.component.html create mode 100644 src/app/modules/admin/apps/help-center/guides/guides.component.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.component.html create mode 100644 src/app/modules/admin/apps/help-center/help-center.component.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.module.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.resolvers.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.routing.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.service.ts create mode 100644 src/app/modules/admin/apps/help-center/help-center.type.ts create mode 100644 src/app/modules/admin/apps/help-center/support/support.component.html create mode 100644 src/app/modules/admin/apps/help-center/support/support.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/compose/compose.component.html create mode 100644 src/app/modules/admin/apps/mailbox/compose/compose.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/details/details.component.html create mode 100644 src/app/modules/admin/apps/mailbox/details/details.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/list/list.component.html create mode 100644 src/app/modules/admin/apps/mailbox/list/list.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.component.html create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.constants.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.module.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.resolvers.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.routing.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.service.ts create mode 100644 src/app/modules/admin/apps/mailbox/mailbox.types.ts create mode 100644 src/app/modules/admin/apps/mailbox/settings/settings.component.html create mode 100644 src/app/modules/admin/apps/mailbox/settings/settings.component.ts create mode 100644 src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.html create mode 100644 src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.scss create mode 100644 src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.ts create mode 100644 src/app/modules/admin/apps/tasks/details/details.component.html create mode 100644 src/app/modules/admin/apps/tasks/details/details.component.ts create mode 100644 src/app/modules/admin/apps/tasks/list/list.component.html create mode 100644 src/app/modules/admin/apps/tasks/list/list.component.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.component.html create mode 100644 src/app/modules/admin/apps/tasks/tasks.component.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.guards.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.module.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.resolvers.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.routing.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.service.ts create mode 100644 src/app/modules/admin/apps/tasks/tasks.types.ts create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.component.html create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.component.ts create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.module.ts create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.resolvers.ts create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.routing.ts create mode 100644 src/app/modules/admin/dashboards/analytics/analytics.service.ts create mode 100644 src/app/modules/admin/dashboards/project/project.component.html create mode 100644 src/app/modules/admin/dashboards/project/project.component.ts create mode 100644 src/app/modules/admin/dashboards/project/project.module.ts create mode 100644 src/app/modules/admin/dashboards/project/project.resolvers.ts create mode 100644 src/app/modules/admin/dashboards/project/project.routing.ts create mode 100644 src/app/modules/admin/dashboards/project/project.service.ts create mode 100644 src/app/modules/admin/docs/changelog/changelog.html create mode 100644 src/app/modules/admin/docs/changelog/changelog.module.ts create mode 100644 src/app/modules/admin/docs/changelog/changelog.routing.ts create mode 100644 src/app/modules/admin/docs/changelog/changelog.ts create mode 100644 src/app/modules/admin/docs/core-features/components/alert/alert.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/alert/alert.component.ts create mode 100644 src/app/modules/admin/docs/core-features/components/card/card.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/card/card.component.ts create mode 100644 src/app/modules/admin/docs/core-features/components/date-range/date-range.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/date-range/date-range.component.ts create mode 100644 src/app/modules/admin/docs/core-features/components/drawer/drawer.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/drawer/drawer.component.ts create mode 100644 src/app/modules/admin/docs/core-features/components/highlight/highlight.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/highlight/highlight.component.ts create mode 100644 src/app/modules/admin/docs/core-features/components/navigation/navigation.component.html create mode 100644 src/app/modules/admin/docs/core-features/components/navigation/navigation.component.ts create mode 100644 src/app/modules/admin/docs/core-features/core-features.component.html create mode 100644 src/app/modules/admin/docs/core-features/core-features.component.scss create mode 100644 src/app/modules/admin/docs/core-features/core-features.component.ts create mode 100644 src/app/modules/admin/docs/core-features/core-features.module.ts create mode 100644 src/app/modules/admin/docs/core-features/core-features.routing.ts create mode 100644 src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.html create mode 100644 src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.ts create mode 100644 src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.html create mode 100644 src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.ts create mode 100644 src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.html create mode 100644 src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.ts create mode 100644 src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.html create mode 100644 src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.ts create mode 100644 src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.html create mode 100644 src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.ts create mode 100644 src/app/modules/admin/docs/core-features/services/config/config.component.html create mode 100644 src/app/modules/admin/docs/core-features/services/config/config.component.ts create mode 100644 src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.html create mode 100644 src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.ts create mode 100644 src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.html create mode 100644 src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.ts create mode 100644 src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.html create mode 100644 src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.ts create mode 100644 src/app/modules/admin/docs/guides/authentication/jwt/jwt.html create mode 100644 src/app/modules/admin/docs/guides/authentication/jwt/jwt.ts create mode 100644 src/app/modules/admin/docs/guides/customization/component-theming/component-theming.html create mode 100644 src/app/modules/admin/docs/guides/customization/component-theming/component-theming.ts create mode 100644 src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.html create mode 100644 src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.ts create mode 100644 src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.html create mode 100644 src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.ts create mode 100644 src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.html create mode 100644 src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.ts create mode 100644 src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.html create mode 100644 src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.ts create mode 100644 src/app/modules/admin/docs/guides/customization/theming/theming.html create mode 100644 src/app/modules/admin/docs/guides/customization/theming/theming.ts create mode 100644 src/app/modules/admin/docs/guides/development/component-structure/component-structure.html create mode 100644 src/app/modules/admin/docs/guides/development/component-structure/component-structure.ts create mode 100644 src/app/modules/admin/docs/guides/development/deployment/deployment.html create mode 100644 src/app/modules/admin/docs/guides/development/deployment/deployment.ts create mode 100644 src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.html create mode 100644 src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.ts create mode 100644 src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.html create mode 100644 src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.ts create mode 100644 src/app/modules/admin/docs/guides/development/updating/updating.html create mode 100644 src/app/modules/admin/docs/guides/development/updating/updating.ts create mode 100644 src/app/modules/admin/docs/guides/getting-started/installation/installation.html create mode 100644 src/app/modules/admin/docs/guides/getting-started/installation/installation.ts create mode 100644 src/app/modules/admin/docs/guides/getting-started/introduction/introduction.html create mode 100644 src/app/modules/admin/docs/guides/getting-started/introduction/introduction.ts create mode 100644 src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.html create mode 100644 src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.ts create mode 100644 src/app/modules/admin/docs/guides/getting-started/serving/serving.html create mode 100644 src/app/modules/admin/docs/guides/getting-started/serving/serving.ts create mode 100644 src/app/modules/admin/docs/guides/guides.component.html create mode 100644 src/app/modules/admin/docs/guides/guides.component.scss create mode 100644 src/app/modules/admin/docs/guides/guides.component.ts create mode 100644 src/app/modules/admin/docs/guides/guides.module.ts create mode 100644 src/app/modules/admin/docs/guides/guides.routing.ts create mode 100644 src/app/modules/admin/docs/other-components/common/messages/messages.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/messages/messages.component.ts create mode 100644 src/app/modules/admin/docs/other-components/common/notifications/notifications.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/notifications/notifications.component.ts create mode 100644 src/app/modules/admin/docs/other-components/common/overview/overview.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/overview/overview.component.ts create mode 100644 src/app/modules/admin/docs/other-components/common/search/search.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/search/search.component.ts create mode 100644 src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.ts create mode 100644 src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.html create mode 100644 src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.ts create mode 100644 src/app/modules/admin/docs/other-components/other-components.component.html create mode 100644 src/app/modules/admin/docs/other-components/other-components.component.scss create mode 100644 src/app/modules/admin/docs/other-components/other-components.component.ts create mode 100644 src/app/modules/admin/docs/other-components/other-components.module.ts create mode 100644 src/app/modules/admin/docs/other-components/other-components.routing.ts create mode 100644 src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.html create mode 100644 src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.ts create mode 100644 src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.html create mode 100644 src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.ts create mode 100644 src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.html create mode 100644 src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.ts create mode 100644 src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.html create mode 100644 src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.ts create mode 100644 src/app/modules/admin/pages/authentication/authentication.module.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/confirmation-required.module.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.html create mode 100644 src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/forgot-password.module.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/reset-password.module.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.html create mode 100644 src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/sign-in.module.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/sign-out.module.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/sign-up.module.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.html create mode 100644 src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.html create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.ts create mode 100644 src/app/modules/admin/pages/authentication/unlock-session/unlock-session.module.ts create mode 100644 src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/coming-soon.module.ts create mode 100644 src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.html create mode 100644 src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.ts create mode 100644 src/app/modules/admin/pages/error/error-404/error-404.component.html create mode 100644 src/app/modules/admin/pages/error/error-404/error-404.component.ts create mode 100644 src/app/modules/admin/pages/error/error-404/error-404.module.ts create mode 100644 src/app/modules/admin/pages/error/error-404/error-404.routing.ts create mode 100644 src/app/modules/admin/pages/error/error-500/error-500.component.html create mode 100644 src/app/modules/admin/pages/error/error-500/error-500.component.ts create mode 100644 src/app/modules/admin/pages/error/error-500/error-500.module.ts create mode 100644 src/app/modules/admin/pages/error/error-500/error-500.routing.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/compact/compact.component.html create mode 100644 src/app/modules/admin/pages/invoice/printable/compact/compact.component.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/compact/compact.module.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/compact/compact.routing.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/modern/modern.component.html create mode 100644 src/app/modules/admin/pages/invoice/printable/modern/modern.component.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/modern/modern.module.ts create mode 100644 src/app/modules/admin/pages/invoice/printable/modern/modern.routing.ts create mode 100644 src/app/modules/admin/pages/maintenance/maintenance.component.html create mode 100644 src/app/modules/admin/pages/maintenance/maintenance.component.ts create mode 100644 src/app/modules/admin/pages/maintenance/maintenance.module.ts create mode 100644 src/app/modules/admin/pages/maintenance/maintenance.routing.ts create mode 100644 src/app/modules/admin/pages/pricing/modern/modern.component.html create mode 100644 src/app/modules/admin/pages/pricing/modern/modern.component.ts create mode 100644 src/app/modules/admin/pages/pricing/modern/modern.module.ts create mode 100644 src/app/modules/admin/pages/pricing/modern/modern.routing.ts create mode 100644 src/app/modules/admin/pages/pricing/simple/simple.component.html create mode 100644 src/app/modules/admin/pages/pricing/simple/simple.component.ts create mode 100644 src/app/modules/admin/pages/pricing/simple/simple.module.ts create mode 100644 src/app/modules/admin/pages/pricing/simple/simple.routing.ts create mode 100644 src/app/modules/admin/pages/pricing/single/single.component.html create mode 100644 src/app/modules/admin/pages/pricing/single/single.component.ts create mode 100644 src/app/modules/admin/pages/pricing/single/single.module.ts create mode 100644 src/app/modules/admin/pages/pricing/single/single.routing.ts create mode 100644 src/app/modules/admin/pages/pricing/table/table.component.html create mode 100644 src/app/modules/admin/pages/pricing/table/table.component.ts create mode 100644 src/app/modules/admin/pages/pricing/table/table.module.ts create mode 100644 src/app/modules/admin/pages/pricing/table/table.routing.ts create mode 100644 src/app/modules/admin/pages/profile/profile.component.html create mode 100644 src/app/modules/admin/pages/profile/profile.component.ts create mode 100644 src/app/modules/admin/pages/profile/profile.module.ts create mode 100644 src/app/modules/admin/pages/profile/profile.routing.ts create mode 100644 src/app/modules/admin/ui/angular-material/angular-material.component.html create mode 100644 src/app/modules/admin/ui/angular-material/angular-material.component.ts create mode 100644 src/app/modules/admin/ui/angular-material/angular-material.module.ts create mode 100644 src/app/modules/admin/ui/animations/animations.component.html create mode 100644 src/app/modules/admin/ui/animations/animations.component.scss create mode 100644 src/app/modules/admin/ui/animations/animations.component.ts create mode 100644 src/app/modules/admin/ui/animations/animations.module.ts create mode 100644 src/app/modules/admin/ui/cards/cards.component.html create mode 100644 src/app/modules/admin/ui/cards/cards.component.ts create mode 100644 src/app/modules/admin/ui/cards/cards.module.ts create mode 100644 src/app/modules/admin/ui/colors/colors.component.html create mode 100644 src/app/modules/admin/ui/colors/colors.component.ts create mode 100644 src/app/modules/admin/ui/colors/colors.module.ts create mode 100644 src/app/modules/admin/ui/datatable/datatable.component.html create mode 100644 src/app/modules/admin/ui/datatable/datatable.component.ts create mode 100644 src/app/modules/admin/ui/datatable/datatable.module.ts create mode 100644 src/app/modules/admin/ui/forms/fields/fields.component.html create mode 100644 src/app/modules/admin/ui/forms/fields/fields.component.ts create mode 100644 src/app/modules/admin/ui/forms/fields/fields.module.ts create mode 100644 src/app/modules/admin/ui/forms/layouts/layouts.component.html create mode 100644 src/app/modules/admin/ui/forms/layouts/layouts.component.ts create mode 100644 src/app/modules/admin/ui/forms/layouts/layouts.module.ts create mode 100644 src/app/modules/admin/ui/forms/wizards/wizards.component.html create mode 100644 src/app/modules/admin/ui/forms/wizards/wizards.component.ts create mode 100644 src/app/modules/admin/ui/forms/wizards/wizards.module.ts create mode 100644 src/app/modules/admin/ui/icons/icons.component.html create mode 100644 src/app/modules/admin/ui/icons/icons.component.ts create mode 100644 src/app/modules/admin/ui/icons/icons.module.ts create mode 100644 src/app/modules/admin/ui/icons/icons.resolvers.ts create mode 100644 src/app/modules/admin/ui/icons/icons.service.ts create mode 100644 src/app/modules/admin/ui/icons/icons.types.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.module.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.module.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.module.ts create mode 100644 src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/overview/overview.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/overview/overview.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/page-layouts.module.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.html create mode 100644 src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.ts create mode 100644 src/app/modules/admin/ui/tailwindcss/tailwindcss.component.html create mode 100644 src/app/modules/admin/ui/tailwindcss/tailwindcss.component.ts create mode 100644 src/app/modules/admin/ui/tailwindcss/tailwindcss.module.ts create mode 100644 src/app/modules/admin/ui/typography/typography.component.html create mode 100644 src/app/modules/admin/ui/typography/typography.component.ts create mode 100644 src/app/modules/admin/ui/typography/typography.module.ts create mode 100644 src/app/modules/auth/confirmation-required/confirmation-required.component.html create mode 100644 src/app/modules/auth/confirmation-required/confirmation-required.component.ts create mode 100644 src/app/modules/auth/confirmation-required/confirmation-required.module.ts create mode 100644 src/app/modules/auth/confirmation-required/confirmation-required.routing.ts create mode 100644 src/app/modules/auth/forgot-password/forgot-password.component.html create mode 100644 src/app/modules/auth/forgot-password/forgot-password.component.ts create mode 100644 src/app/modules/auth/forgot-password/forgot-password.module.ts create mode 100644 src/app/modules/auth/forgot-password/forgot-password.routing.ts create mode 100644 src/app/modules/auth/reset-password/reset-password.component.html create mode 100644 src/app/modules/auth/reset-password/reset-password.component.ts create mode 100644 src/app/modules/auth/reset-password/reset-password.module.ts create mode 100644 src/app/modules/auth/reset-password/reset-password.routing.ts create mode 100644 src/app/modules/auth/sign-in/sign-in.component.html create mode 100644 src/app/modules/auth/sign-in/sign-in.component.ts create mode 100644 src/app/modules/auth/sign-in/sign-in.module.ts create mode 100644 src/app/modules/auth/sign-in/sign-in.routing.ts create mode 100644 src/app/modules/auth/sign-out/sign-out.component.html create mode 100644 src/app/modules/auth/sign-out/sign-out.component.ts create mode 100644 src/app/modules/auth/sign-out/sign-out.module.ts create mode 100644 src/app/modules/auth/sign-out/sign-out.routing.ts create mode 100644 src/app/modules/auth/sign-up/sign-up.component.html create mode 100644 src/app/modules/auth/sign-up/sign-up.component.ts create mode 100644 src/app/modules/auth/sign-up/sign-up.module.ts create mode 100644 src/app/modules/auth/sign-up/sign-up.routing.ts create mode 100644 src/app/modules/auth/unlock-session/unlock-session.component.html create mode 100644 src/app/modules/auth/unlock-session/unlock-session.component.ts create mode 100644 src/app/modules/auth/unlock-session/unlock-session.module.ts create mode 100644 src/app/modules/auth/unlock-session/unlock-session.routing.ts create mode 100644 src/app/modules/landing/home/home.component.html create mode 100644 src/app/modules/landing/home/home.component.ts create mode 100644 src/app/modules/landing/home/home.module.ts create mode 100644 src/app/modules/landing/home/home.routing.ts create mode 100644 src/app/shared/shared.module.ts create mode 100755 src/assets/.gitkeep create mode 100644 src/assets/fonts/inter/Inter-italic.var.woff2 create mode 100644 src/assets/fonts/inter/Inter-roman.var.woff2 create mode 100644 src/assets/fonts/inter/inter.css create mode 100644 src/assets/icons/feather.svg create mode 100644 src/assets/icons/heroicons-outline.svg create mode 100644 src/assets/icons/heroicons-solid.svg create mode 100755 src/assets/icons/iconsmind.svg create mode 100644 src/assets/icons/material-outline.svg create mode 100644 src/assets/icons/material-twotone.svg create mode 100644 src/assets/images/apps/contacts/flags.png create mode 100644 src/assets/images/apps/ecommerce/products/watch-01-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-01-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-01-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-01-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-02-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-02-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-02-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-02-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-03-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-03-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-03-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-03-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-04-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-04-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-04-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-04-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-05-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-05-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-05-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-05-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-06-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-06-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-06-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-06-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-07-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-07-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-07-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-07-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-08-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-08-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-08-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-08-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-09-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-09-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-09-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-09-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-10-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-10-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-10-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-10-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-11-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-11-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-11-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-11-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-12-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-12-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-12-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-12-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-13-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-13-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-13-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-13-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-14-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-14-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-14-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-14-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-15-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-15-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-15-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-15-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-16-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-16-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-16-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-16-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-17-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-17-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-17-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-17-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-18-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-18-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-18-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-18-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-19-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-19-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-19-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-19-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-20-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-20-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-20-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-20-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-21-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-21-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-21-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-21-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-22-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-22-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-22-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-22-thumb.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-23-01.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-23-02.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-23-03.jpg create mode 100644 src/assets/images/apps/ecommerce/products/watch-23-thumb.jpg create mode 100644 src/assets/images/apps/mailbox/birds-eye-sydney_preview.jpg create mode 100644 src/assets/images/apps/mailbox/lake-of-carrezza_preview.png create mode 100644 src/assets/images/apps/mailbox/mystery-forest_preview.jpg create mode 100644 src/assets/images/apps/mailbox/yosemite-national-park_preview.png create mode 100755 src/assets/images/avatars/brian-hughes.jpg create mode 100755 src/assets/images/avatars/female-01.jpg create mode 100755 src/assets/images/avatars/female-02.jpg create mode 100755 src/assets/images/avatars/female-03.jpg create mode 100755 src/assets/images/avatars/female-04.jpg create mode 100755 src/assets/images/avatars/female-05.jpg create mode 100755 src/assets/images/avatars/female-06.jpg create mode 100755 src/assets/images/avatars/female-07.jpg create mode 100755 src/assets/images/avatars/female-08.jpg create mode 100755 src/assets/images/avatars/female-09.jpg create mode 100755 src/assets/images/avatars/female-10.jpg create mode 100755 src/assets/images/avatars/female-11.jpg create mode 100755 src/assets/images/avatars/female-12.jpg create mode 100755 src/assets/images/avatars/female-13.jpg create mode 100755 src/assets/images/avatars/female-14.jpg create mode 100755 src/assets/images/avatars/female-15.jpg create mode 100755 src/assets/images/avatars/female-16.jpg create mode 100755 src/assets/images/avatars/female-17.jpg create mode 100755 src/assets/images/avatars/female-18.jpg create mode 100755 src/assets/images/avatars/female-19.jpg create mode 100755 src/assets/images/avatars/female-20.jpg create mode 100755 src/assets/images/avatars/male-01.jpg create mode 100755 src/assets/images/avatars/male-02.jpg create mode 100755 src/assets/images/avatars/male-03.jpg create mode 100755 src/assets/images/avatars/male-04.jpg create mode 100755 src/assets/images/avatars/male-05.jpg create mode 100755 src/assets/images/avatars/male-06.jpg create mode 100755 src/assets/images/avatars/male-07.jpg create mode 100755 src/assets/images/avatars/male-08.jpg create mode 100755 src/assets/images/avatars/male-09.jpg create mode 100755 src/assets/images/avatars/male-10.jpg create mode 100755 src/assets/images/avatars/male-11.jpg create mode 100755 src/assets/images/avatars/male-12.jpg create mode 100755 src/assets/images/avatars/male-13.jpg create mode 100755 src/assets/images/avatars/male-14.jpg create mode 100755 src/assets/images/avatars/male-15.jpg create mode 100755 src/assets/images/avatars/male-16.jpg create mode 100755 src/assets/images/avatars/male-17.jpg create mode 100755 src/assets/images/avatars/male-18.jpg create mode 100755 src/assets/images/avatars/male-19.jpg create mode 100755 src/assets/images/avatars/male-20.jpg create mode 100755 src/assets/images/cards/01-320x200.jpg create mode 100755 src/assets/images/cards/02-320x200.jpg create mode 100755 src/assets/images/cards/03-320x200.jpg create mode 100755 src/assets/images/cards/04-320x200.jpg create mode 100755 src/assets/images/cards/05-320x200.jpg create mode 100755 src/assets/images/cards/06-320x200.jpg create mode 100755 src/assets/images/cards/07-320x200.jpg create mode 100755 src/assets/images/cards/08-320x200.jpg create mode 100755 src/assets/images/cards/09-320x200.jpg create mode 100755 src/assets/images/cards/10-320x200.jpg create mode 100755 src/assets/images/cards/11-512x512.jpg create mode 100755 src/assets/images/cards/12-512x512.jpg create mode 100755 src/assets/images/cards/13-160x160.jpg create mode 100755 src/assets/images/cards/14-640x480.jpg create mode 100755 src/assets/images/cards/15-640x480.jpg create mode 100755 src/assets/images/cards/16-640x480.jpg create mode 100755 src/assets/images/cards/17-640x480.jpg create mode 100755 src/assets/images/cards/18-640x480.jpg create mode 100755 src/assets/images/cards/19-640x480.jpg create mode 100755 src/assets/images/cards/20-640x480.jpg create mode 100755 src/assets/images/cards/21-640x480.jpg create mode 100755 src/assets/images/cards/22-640x480.jpg create mode 100755 src/assets/images/cards/23-640x480.jpg create mode 100755 src/assets/images/cards/24-640x480.jpg create mode 100755 src/assets/images/cards/25-640x480.jpg create mode 100755 src/assets/images/cards/26-640x480.jpg create mode 100755 src/assets/images/cards/27-640x480.jpg create mode 100755 src/assets/images/cards/28-640x480.jpg create mode 100755 src/assets/images/cards/29-640x480.jpg create mode 100755 src/assets/images/cards/30-640x480.jpg create mode 100755 src/assets/images/cards/31-640x480.jpg create mode 100755 src/assets/images/cards/32-640x480.jpg create mode 100755 src/assets/images/cards/33-640x480.jpg create mode 100755 src/assets/images/cards/34-640x480.jpg create mode 100755 src/assets/images/cards/35-640x480.jpg create mode 100755 src/assets/images/cards/36-640x480.jpg create mode 100755 src/assets/images/cards/avatar-400x400.jpg create mode 100755 src/assets/images/cards/coffee-shop-01-320x200.jpg create mode 100755 src/assets/images/cards/coffee-shop-02-512x512.jpg create mode 100755 src/assets/images/cards/coffee-shop-03-320x320.jpg create mode 100755 src/assets/images/cards/mansion-01-320x200.jpg create mode 100755 src/assets/images/cards/product-01-224x256.jpg create mode 100755 src/assets/images/cards/sneakers-01-320x200.jpg create mode 100755 src/assets/images/cards/sneakers-02-448x560.jpg create mode 100755 src/assets/images/cards/sneakers-03-448x560.jpg create mode 100644 src/assets/images/logo/logo-text-on-dark.svg create mode 100644 src/assets/images/logo/logo-text.svg create mode 100644 src/assets/images/logo/logo.svg create mode 100644 src/assets/images/pages/help-center/image-1.jpg create mode 100644 src/assets/images/pages/profile/cover.jpg create mode 100644 src/assets/styles/splash-screen.css create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon-16x16.png create mode 100644 src/favicon-32x32.png create mode 100644 src/global.d.ts create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/styles/styles.scss create mode 100644 src/styles/tailwind.scss create mode 100644 src/styles/vendors.scss create mode 100644 src/test.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json create mode 100644 tslint.json diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..427441dc --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..07926923 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..86d943a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/CREDITS b/CREDITS new file mode 100644 index 00000000..f14feeb0 --- /dev/null +++ b/CREDITS @@ -0,0 +1,69 @@ +// ----------------------------------------------------------------------------------------------------- +// @ 3rd party credits +// ----------------------------------------------------------------------------------------------------- + +// Icons +Material - https://material.io/tools/icons +Feather - https://feathericons.com/ +Heroicons - https://github.com/refactoringui/heroicons +Iconsmind - https://iconsmind.com/ + +// Avatars +https://uifaces.co + +// 404, 500 & Maintenance +https://undraw.co + +// Mail app +Photo by Riccardo Chiarini on Unsplash - https://unsplash.com/photos/2VDa8bnLM8c +Photo by Johannes Plenio on Unsplash - https://unsplash.com/photos/RwHv7LgeC7s +Photo by Jamie Davies on Unsplash - https://unsplash.com/photos/Hao52Fu9-F8 +Photo by Christian Joudrey on Unsplash - https://unsplash.com/photos/mWRR1xj95hg + +// Profile page +Photo by Alex Knight on Unsplash - https://unsplash.com/photos/DpPutJwgyW8 + +// Cards +Photo by Kym Ellis on Unsplash - https://unsplash.com/photos/RPT3AjdXlZc +Photo by Patrick Hendry on Unsplash - https://unsplash.com/photos/Qgxk3PQsMiI +Photo by Hailey Kean on Unsplash - https://unsplash.com/photos/QxjsOlFNr_4 +Photo by Nathan Anderson on Unsplash - https://unsplash.com/photos/mG8ShlWrMDI +Photo by Adrian Infernus on Unsplash - https://unsplash.com/photos/5apewqWk978 +Photo by freestocks.org on Unsplash - https://unsplash.com/photos/c73TZ2sIU38 +Photo by Tim Marshall on Unsplash - https://unsplash.com/photos/PKSCrmZdvwA +Photo by Daniel Koponyas on Unsplash - https://unsplash.com/photos/rbiLY6ZwvXQ +Photo by John Westrock on Unsplash - https://unsplash.com/photos/LCesauDseu8 +Photo by Gabriel Sollmann on Unsplash - https://unsplash.com/photos/kFWj9y-tJB4 +Photo by Kevin Wolf on Unsplash - https://unsplash.com/photos/BJyjgEdNTPs +Photo by Luca Bravo on Unsplash - https://unsplash.com/photos/hFzIoD0F_i8 +Photo by Ian Baldwin on Unsplash - https://unsplash.com/photos/Dlj-SxxTlQ0 +Photo by Ben Kolde on Unsplash - https://unsplash.com/photos/KRTFIBOfcFw +Photo by Chad Peltola on Unsplash - https://unsplash.com/photos/BTvQ2ET_iKc +Photo by rocknwool on Unsplash - https://unsplash.com/photos/r56oO1V5oms +Photo by Vita Vilcina on Unsplash - https://unsplash.com/photos/KtOid0FLjqU +Photo by Jia Ye on Unsplash - https://unsplash.com/photos/y8ZnQqgohLk +Photo by Parker Whitson on Unsplash - https://unsplash.com/photos/OlTYIqTjmVM +Photo by Dorian Hurst on Unsplash - https://unsplash.com/photos/a9uWPQlIbYc +Photo by Everaldo Coelho on Unsplash - https://unsplash.com/photos/KPaSCpklCZw +Photo by eberhard grossgasteiger on Unsplash - https://unsplash.com/photos/fh2JefbNlII +Photo by Orlova Maria on Unsplash - https://unsplash.com/photos/p8y4dWEMGMU +Photo by Jake Blucker on Unsplash - https://unsplash.com/photos/tMzCrBkM99Y +Photo by Jerry Zhang on Unsplash - https://unsplash.com/photos/oIBcow6n36s +Photo by John Cobb on Unsplash - https://unsplash.com/photos/IE_sifhay7o +Photo by Dan Gold on Unsplash - https://unsplash.com/photos/mDlhOIfGxNI +Photo by Ana Toma on Unsplash - https://unsplash.com/photos/XsGwe6gYg0c +Photo by Andrea on Unsplash - https://unsplash.com/photos/1AWY0N960Sk +Photo by Aswin on Unsplash - https://unsplash.com/photos/_roUcFWstas +Photo by Justin Kauffman on Unsplash - https://unsplash.com/photos/aWG_dqyhI0A +Photo by Barna Bartis on Unsplash - https://unsplash.com/photos/VVoBQqWrvkc +Photo by Kyle Hinkson on Unsplash - https://unsplash.com/photos/3439EnvnAGo +Photo by Spencer Watson on Unsplash - https://unsplash.com/photos/5TBf16GnHKg +Photo by adrian on Unsplash - https://unsplash.com/photos/1wrzvwoK8A4 +Photo by Christopher Rusev on Unsplash - https://unsplash.com/photos/7gKWgCRixf0 +Photo by Stephen Leonardi on Unsplash - https://unsplash.com/photos/MDmwQVgDHHM +Photo by Dwinanda Nurhanif Mujito on Unsplash - https://unsplash.com/photos/pKT5Mg16w_w +Photo by Humphrey Muleba on Unsplash - https://unsplash.com/photos/Zuvf5mxT5fs +Photo by adrian on Unsplash - https://unsplash.com/photos/PNRxLFPMyJY +Photo by Dahee Son on Unsplash - https://unsplash.com/photos/tV06QVJXVxU +Photo by Zachary Kyra-Derksen on Unsplash - https://unsplash.com/photos/vkqS7vLQUtg +Photo by Rodrigo Soares on Unsplash - https://unsplash.com/photos/8BFWBUkSqQo diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..d4f17d13 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,6 @@ +Envato Standard License + +Copyright (c) Sercan Yemen + +This project is protected by Envato's Standard License. For more information, +check the official license page at [https://themeforest.net/licenses/standard](https://themeforest.net/licenses/standard) diff --git a/README.md b/README.md new file mode 100644 index 00000000..9318f462 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Fuse - Admin template and Starter project for Angular + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 00000000..b3781381 --- /dev/null +++ b/angular.json @@ -0,0 +1,147 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "fuse": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/fuse", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "allowedCommonJsDependencies": [ + "apexcharts", + "highlight.js", + "crypto-js/enc-utf8", + "crypto-js/hmac-sha256", + "crypto-js/enc-base64" + ], + "assets": [ + "src/favicon-16x16.png", + "src/favicon-32x32.png", + "src/assets" + ], + "stylePreprocessorOptions": { + "includePaths": [ + "src/@fuse/styles" + ] + }, + "styles": [ + "src/@fuse/styles/tailwind.scss", + "src/@fuse/styles/themes.scss", + "src/styles/vendors.scss", + "src/@fuse/styles/main.scss", + "src/styles/styles.scss", + "src/styles/tailwind.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "5mb", + "maximumError": "8mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "100kb", + "maximumError": "150kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "fuse:build" + }, + "configurations": { + "production": { + "browserTarget": "fuse:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "fuse:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon-16x16.png", + "src/favicon-32x32.png", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "fuse:serve" + }, + "configurations": { + "production": { + "devServerTarget": "fuse:serve:production" + } + } + } + } + } + }, + "defaultProject": "fuse" +} diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 00000000..9d6eda58 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,40 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const {SpecReporter, StacktraceOption} = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout : 11000, + specs : [ + './src/**/*.e2e-spec.ts' + ], + capabilities : { + browserName: 'chrome' + }, + directConnect : true, + SELENIUM_PROMISE_MANAGER: false, + baseUrl : 'http://localhost:4200/', + framework : 'jasmine', + jasmineNodeOpts : { + showColors : true, + defaultTimeoutInterval: 30000, + print : function () + { + } + }, + onPrepare() + { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayStacktrace: StacktraceOption.PRETTY + } + })); + } +}; diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..a256a45e --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', async () => { + await page.navigateTo(); + expect(await page.getTitleText()).toEqual('Welcome to Fuse!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 00000000..faa49e83 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,14 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage +{ + async navigateTo(): Promise + { + return browser.get(browser.baseUrl); + } + + async getTitleText(): Promise + { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 00000000..f8ddb5c7 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": [ + "jasmine", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..c6cde41c --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,45 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) +{ + config.set({ + basePath : '', + frameworks : ['jasmine', '@angular-devkit/build-angular'], + plugins : [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client : { + jasmine : { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter : { + dir : require('path').join(__dirname, './coverage/angular11'), + subdir : '.', + reporters: [ + {type: 'html'}, + {type: 'text-summary'} + ] + }, + reporters : ['progress', 'kjhtml'], + port : 9876, + colors : true, + logLevel : config.LOG_INFO, + autoWatch : true, + browsers : ['Chrome'], + singleRun : false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3ea62464 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15990 @@ +{ + "name": "@fuse/demo", + "version": "12.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1102.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1102.9.tgz", + "integrity": "sha512-AU7i0VqWUwBc04oyT98Pp6sMDMp67JTZd/Cfrz5AM4MqrCZsDJMsTlWH26fAbESSLHgNst7H91Eq0cnC8rCmOQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.9", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.1102.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1102.9.tgz", + "integrity": "sha512-qwE5Jdt7lJOouOJ4JJfnuTislG8JgBOTW0iQDu7h6veetWrPBI1ouWF9E4ryELnRrGQTSCFm9xFT+2l0H0o6zA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1102.9", + "@angular-devkit/build-optimizer": "0.1102.9", + "@angular-devkit/build-webpack": "0.1102.9", + "@angular-devkit/core": "11.2.9", + "@babel/core": "7.12.10", + "@babel/generator": "7.12.11", + "@babel/plugin-transform-async-to-generator": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.10", + "@babel/preset-env": "7.12.11", + "@babel/runtime": "7.12.5", + "@babel/template": "7.12.7", + "@discoveryjs/json-ext": "0.5.2", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "11.2.9", + "ansi-colors": "4.1.1", + "autoprefixer": "10.2.4", + "babel-loader": "8.2.2", + "browserslist": "^4.9.1", + "cacache": "15.0.5", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "6.3.2", + "core-js": "3.8.3", + "critters": "0.0.7", + "css-loader": "5.0.1", + "cssnano": "4.1.11", + "file-loader": "6.2.0", + "find-cache-dir": "3.3.1", + "glob": "7.1.6", + "https-proxy-agent": "5.0.0", + "inquirer": "7.3.3", + "jest-worker": "26.6.2", + "karma-source-map-support": "1.4.0", + "less": "4.1.1", + "less-loader": "7.3.0", + "license-webpack-plugin": "2.3.11", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "1.3.5", + "minimatch": "3.0.4", + "open": "7.4.0", + "ora": "5.3.0", + "parse5-html-rewriting-stream": "6.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "8.2.4", + "postcss-import": "14.0.0", + "postcss-loader": "4.2.0", + "raw-loader": "4.0.2", + "regenerator-runtime": "0.13.7", + "resolve-url-loader": "3.1.2", + "rimraf": "3.0.2", + "rollup": "2.38.4", + "rxjs": "6.6.3", + "sass": "1.32.6", + "sass-loader": "10.1.1", + "semver": "7.3.4", + "source-map": "0.7.3", + "source-map-loader": "1.1.3", + "source-map-support": "0.5.19", + "speed-measure-webpack-plugin": "1.4.2", + "style-loader": "2.0.0", + "stylus": "0.54.8", + "stylus-loader": "4.3.3", + "terser": "5.5.1", + "terser-webpack-plugin": "4.2.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "webpack": "4.44.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.11.2", + "webpack-merge": "5.7.3", + "webpack-sources": "2.2.0", + "webpack-subresource-integrity": "1.5.2", + "worker-plugin": "5.0.0" + }, + "dependencies": { + "autoprefixer": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.4.tgz", + "integrity": "sha512-DCCdUQiMD+P/as8m3XkeTUkUKuuRqLGcwD0nll7wevhqoJfMRpJlkFd1+MQh1pvupjiQuip42lc/VFvfUTMSKw==", + "dev": true, + "requires": { + "browserslist": "^4.16.1", + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "fraction.js": "^4.0.13", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.4.tgz", + "integrity": "sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.1102.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1102.9.tgz", + "integrity": "sha512-Nlup25swf7pSfBytZCQs5zUl4RC3Z07RVkaJvIK7qG5gvoq4Ae1vPgBT24gzCcX43UqRd3ywsF1+8I3CGOD8VA==", + "dev": true, + "requires": { + "loader-utils": "2.0.0", + "source-map": "0.7.3", + "tslib": "2.1.0", + "typescript": "4.1.5", + "webpack-sources": "2.2.0" + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1102.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1102.9.tgz", + "integrity": "sha512-RnLa5yDzoqQEAvpI9d4xX9s9FdWbDeMDN77CDg/CHFJ6MOtggzc/9GyH7wpynaSqtTCs1VmYeKtjPFhzkNIzuA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1102.9", + "@angular-devkit/core": "11.2.9", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.2.9.tgz", + "integrity": "sha512-TqihgUEKjX4C1hSd8RgUyCwuezFRdput9Ctcq8c4VgOcseEnXq3BkCSJbXtUh4Fln8WPxM7WHM8HClcWya/41g==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.2.9.tgz", + "integrity": "sha512-NqcBMK9ZbfXykj+2/cSlZcLVmbep/N+yYb+dUSfvRup3rW3uYSpMMJAnys3ro0m7TnUrI7h7t0UTgX8oxjlCow==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.9", + "ora": "5.3.0", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.2.10.tgz", + "integrity": "sha512-fnmZtbVJuWAchzAj1+wU0AlQfa5J4jA/2P7qo4QDCNshWvkWVplO0huAdBgb5K0UjOstpRKFhwjK3DhuKGM/0A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/cdk": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.2.9.tgz", + "integrity": "sha512-3gHobkgCQIJ4kJFkqexaKramI6k4OZ0/Vw5qvabGhpwWtICvrrfZyRejJzhecYKOcw+hiJNoDqP9TVNfkLme9g==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^2.0.0" + } + }, + "@angular/cli": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.2.9.tgz", + "integrity": "sha512-jSX8HFRYSbbamKLhzgPZ2zEsXDtJzspwnzFROJfOpe9fQkMFo8wiOkmY2amyaNzAMyooHXerRcRDWkRTyQj3Jg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1102.9", + "@angular-devkit/core": "11.2.9", + "@angular-devkit/schematics": "11.2.9", + "@schematics/angular": "11.2.9", + "@schematics/update": "0.1102.9", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.1", + "ini": "2.0.0", + "inquirer": "7.3.3", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.0", + "npm-pick-manifest": "6.1.0", + "open": "7.4.0", + "ora": "5.3.0", + "pacote": "11.2.4", + "resolve": "1.19.0", + "rimraf": "3.0.2", + "semver": "7.3.4", + "symbol-observable": "3.0.0", + "universal-analytics": "0.4.23", + "uuid": "8.3.2" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "@angular/common": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.2.10.tgz", + "integrity": "sha512-eguQEg5GQW1geUa9w00Nabz1BZKOj3rR1Wm6pYlLRF7KdWMDvpJ9xkG2P0X7YoqnWxX8GPqcsl2J3Ds+KDXJLA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.2.10.tgz", + "integrity": "sha512-+Ba/y0v5eIu1fEJthIpFK+DiIT/YTYSL7Jy1hhZrGLHDiAUxSnzF5/lgrnLAPuZWt/5w44+WPXx3d1xqvNWWNw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler-cli": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.2.10.tgz", + "integrity": "sha512-IrCH/5VxFVCwklQQU+bhAQUuwr5nc0Ts7eId5CUyBh3edCdP6vnQaDi7yiJ3yxIo/DAwS68Yel2T1/2KAxp5gg==", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, + "@angular/core": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.2.10.tgz", + "integrity": "sha512-1nZGSVZPvTA6rFJhoivcUKm2YBx9A+569cV1UTPlXjcpO+wNcrrXG+6yjxS2wAffTWEQ7xA0ajyo8mZrpqqw9Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/forms": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.2.10.tgz", + "integrity": "sha512-L8AJHdhonWbbZiqN9z18P9jfsPt/MfLzmkYfDY2QXLzAe8jhrWrWE/9ZOJDe849UBIyDpD1bke5lPW4Fq7W6ug==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/language-service": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.2.10.tgz", + "integrity": "sha512-foBArCVLW1csJhAyPJoIF5gYhSm4SJjsu9QbTaBsHdt3igPayZekEkYAKfwj4pu1Desk+87gZn5NLgdBXcorUw==", + "dev": true + }, + "@angular/material": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-11.2.9.tgz", + "integrity": "sha512-Pe1aScSX8fMOSs5hfF/V7NCJn9pt/60rFmwYxgtFser4BcJrO0Moz4eqxhNcR0PjiCQgKJpjjPxBept2+o5N5A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/material-moment-adapter": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-11.2.9.tgz", + "integrity": "sha512-qeZKzNIywqVfgmSj34wBBfuh/YIqLnICj3LFqSA2/odrxcBDFBKF6iu+R3GDNlTqivIoor1eyaODxB+jD2shSA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/platform-browser": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.2.10.tgz", + "integrity": "sha512-8viTrC6W0FWzGou0cLHQLnXtTcXdm3V4fQWYcc03SiJM7sM/EDrBdwDqXEBUG089xrgbX8iDb+Txk821lyCa8w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.10.tgz", + "integrity": "sha512-IehLiP3UakVb+A44riNe8I/OQjDHMbCzhV9SupoUDP2Z7JEvrdoQFm9ijiu2hZTLPNWpwQog2b5iHytCbMW9ww==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/router": { + "version": "11.2.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.2.10.tgz", + "integrity": "sha512-OYVErGuC4ECWHcnYw3hmy34YKJG5BpH0uzhj/DxmvHEhDv4LHxSye5IcApktqDn68AvPmbGSmyjB1rNnXCsbAg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "dev": true + }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "dev": true, + "requires": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + } + } + }, + "@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + } + } + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", + "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", + "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@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.7", + "@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.7", + "@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.11", + "@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.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@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.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@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/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", + "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.13", + "@babel/types": "^7.13.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz", + "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, + "@fullcalendar/angular": { + "version": "4.4.5-beta", + "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-4.4.5-beta.tgz", + "integrity": "sha512-L144YrgrgFr75/LGNcDDX9xKy465AZR/EqWPxkdNFgBSeeblH+kf8OMy8K6YcuJDlv4nXw4RucBqbMrrQKvbQw==", + "requires": { + "@fullcalendar/core": "~4.4.0", + "fast-deep-equal": "^3.1.1" + } + }, + "@fullcalendar/core": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-4.4.2.tgz", + "integrity": "sha512-vq7KQGuAJ1ieFG5tUqwxwUwmXYtblFOTjHaLAVHo6iEPB52mS7DS45VJfkhaQmX4+5/+BHRpg82G1qkuAINwtg==" + }, + "@fullcalendar/daygrid": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-4.4.2.tgz", + "integrity": "sha512-axjfMhxEXHShV3r2TZjf+2niJ1C6LdAxkHKmg7mVq4jXtUQHOldU5XsjV0v2lUAt1urJBFi2zajfK8798ukL3Q==" + }, + "@fullcalendar/interaction": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-4.4.2.tgz", + "integrity": "sha512-3ItpGFnxcYQT4NClqhq93QTQwOI8x3mlMf5M4DgK5avVaSzpv9g8p+opqeotK2yzpFeINps06cuQyB1h7vcv1Q==" + }, + "@fullcalendar/list": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-4.4.2.tgz", + "integrity": "sha512-buhfd0w0PavH3EVZ6DR6kvjb+wPDe16XEpNcPkTpvIxnAziwGBvcUeHUBd9KvtEhOcvs9sAKoYKbU4xwHFK0Wg==" + }, + "@fullcalendar/moment": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-4.4.2.tgz", + "integrity": "sha512-PBrjxxDEG3RO+8SOA3a1YA7yoGI3bgnltiGY3ehOtJwFIMsUQDSSr5aMoWyRpz7MXgp2YOQY5rzMEIp2A8eK9w==" + }, + "@fullcalendar/rrule": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/rrule/-/rrule-4.4.2.tgz", + "integrity": "sha512-pUKHFp62SZbW9X3vvxc8IMnoWpQ6Nt2IBwwPFPAWmebCnUhyDfMf3tpKaV9slUYvW0Cch4Y58tv0EySP27Q2jg==" + }, + "@fullcalendar/timegrid": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-4.4.2.tgz", + "integrity": "sha512-M5an7qii8OUmI4ogY47k5pn2j/qUbLp6sa6Vo0gO182HR5pb9YtrEZnoQhnScok+I0BkDkLFzMQoiAMTjBm2PQ==", + "requires": { + "@fullcalendar/daygrid": "~4.4.0" + } + }, + "@fullhuman/postcss-purgecss": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz", + "integrity": "sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==", + "dev": true, + "requires": { + "purgecss": "^3.1.3" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "@ngtools/webpack": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.9.tgz", + "integrity": "sha512-UdWtJCfGfwQd+MSOyAXUE/o8IOQFwnWeh1twoyVh0XTx4I5dcZfj4r3qFLEUF05zFh25j8lUCbNQN9v4IJmA/A==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.9", + "enhanced-resolve": "5.7.0", + "webpack-sources": "2.2.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", + "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", + "dev": true + }, + "@npmcli/git": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.7.tgz", + "integrity": "sha512-HUSqNDWYsTpboc7yV1C4yPd/jbaGXfWVmGoTyB+h3QQSKMpYPzTXLrqUMpz+LEA6Dt9usUeRtjytwcrfoBMJpg==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.2.tgz", + "integrity": "sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", + "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.4.tgz", + "integrity": "sha512-Yd9HXTtF1JGDXZw0+SOn+mWLYS0e7bHBHVC/2C8yqs4wUrs/k8rwBSinD7rfk+3WG/MFGRZKxjyoD34Pch2E/A==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + }, + "dependencies": { + "read-package-json-fast": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", + "integrity": "sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + } + } + }, + "@schematics/angular": { + "version": "11.2.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.2.9.tgz", + "integrity": "sha512-yiuWCf+naAaS8cib2a9KKAhkwLx4LVnxE4lpF1Q2mEE5znQ7npYwzQYxgMHD70eMuSrki/L5nM9s7ZdVr5OKyg==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.9", + "@angular-devkit/schematics": "11.2.9", + "jsonc-parser": "3.0.0" + } + }, + "@schematics/update": { + "version": "0.1102.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1102.9.tgz", + "integrity": "sha512-JIbuvX4a87h7G9d3lsKTUceKXhE/lXtJEkGaQ2jv2sxFRxBkmMO2o2OmsKRDpIMtSRs7VTUTccK6RAOVZJX66w==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.2.9", + "@angular-devkit/schematics": "11.2.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "2.0.0", + "npm-package-arg": "^8.0.0", + "pacote": "11.2.4", + "semver": "7.3.4", + "semver-intersect": "1.4.0" + } + }, + "@tailwindcss/aspect-ratio": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.2.0.tgz", + "integrity": "sha512-v5LyHkwXj/4lI74B06zUrmWEdmSqS43+jw717pkt3fAXqb7ALwu77A8t7j+Bej+ZbdlIIqNMYheGN7wSGV1A6w==", + "dev": true + }, + "@tailwindcss/line-clamp": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.2.0.tgz", + "integrity": "sha512-+jXSdRK3/9V/BCPCr+iNpMMhxWMMv62vn/AS2b3/ClmueGuhCijW3bUwO1IiHnE7uCaF74Sli8jUCv9djwvpLg==", + "dev": true + }, + "@tailwindcss/typography": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.0.tgz", + "integrity": "sha512-3BfOYT5MYNEq81Ism3L2qu/HRP2Q5vWqZtZRQqQrthHuaTK9qpuPfbMT5WATjAM5J1OePKBaI5pLoX4S1JGNMQ==", + "dev": true, + "requires": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/chroma-js": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz", + "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "dev": true + }, + "@types/crypto-js": { + "version": "3.1.47", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", + "integrity": "sha512-eI6gvpcGHLk3dAuHYnRCAjX+41gMv1nz/VP55wAe5HtmAKDOoPSfr3f6vkMc08ov1S0NsjvUBxDtHHxqQY1LGA==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/highlight.js": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-10.1.0.tgz", + "integrity": "sha512-77hF2dGBsOgnvZll1vymYiNUtqJ8cJfXPD6GG/2M0aLRc29PkvB7Au6sIDjIEFcSICBhCh2+Pyq6WSRS7LUm6A==", + "dev": true, + "requires": { + "highlight.js": "*" + } + }, + "@types/jasmine": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.8.tgz", + "integrity": "sha512-KTG8ONQC2qm679pJiuNzv7TlkMopSOUvGxZ9nz5M/QFrbWc/36A9mg7jQ76JgNWYogkHmTKaEPRP8MROvFZVwA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "dev": true + }, + "@types/lodash-es": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.4.tgz", + "integrity": "sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, + "@types/marked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.0.tgz", + "integrity": "sha512-kSOVa3R6HJvFdd3UIbTYvrSBTPHjXhNErh7/8oSCKOwqdOkk4Oj8N77n+f6dsgd1jW3j3SU5EhnmRxPhNKOmtQ==" + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/node": { + "version": "12.20.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.6.tgz", + "integrity": "sha512-sRVq8d+ApGslmkE9e3i+D3gFGk7aZHAT+G4cIpIEdLJYPsWiSPwcAnJEjddLQQDqV3Ra2jOclX/Sv6YrvGYiWA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apexcharts": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.26.0.tgz", + "integrity": "sha512-zdYHs3k3tgmCn1BpYLj7rhGEndBYF33Pq1+g0ora37xAr+3act5CJrpdXM2jx2boVUyXgavoSp6sa8WpK7RkSA==", + "requires": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "app-root-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz", + "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==", + "dev": true, + "requires": { + "browserslist": "^4.16.3", + "caniuse-lite": "^1.0.30001196", + "colorette": "^1.2.2", + "fraction.js": "^4.0.13", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@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.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "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": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001204", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", + "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chroma-js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.1.tgz", + "integrity": "sha512-gYc5/Dooshun2OikK7oY/hYnoEiZ0dxqRpXosEdYRYm505vU5mRsHFqIW062C9nMtr32DVErP6mlxuepo2kNkw==", + "dev": true, + "requires": { + "cross-env": "^6.0.3" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", + "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", + "dev": true, + "requires": { + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "dependencies": { + "@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "dev": true + }, + "@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", + "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "core-js": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", + "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", + "dev": true + }, + "core-js-compat": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.1.tgz", + "integrity": "sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg==", + "dev": true, + "requires": { + "browserslist": "^4.16.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "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" + } + }, + "critters": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.7.tgz", + "integrity": "sha512-qUF2SaAWFYjNPdCcPpu68p2DnHiosia84yx5mPTlUMQjkjChR+n6sO1/I7yn2U2qNDgSPTd2SoaTIDQcUL+EwQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css": "^3.0.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cross-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz", + "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==", + "dev": true, + "requires": { + "camelcase": "^6.2.0", + "cssesc": "^3.0.0", + "icss-utils": "^5.0.0", + "loader-utils": "^2.0.0", + "postcss": "^8.1.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + }, + "dependencies": { + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "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" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz", + "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emoji-toolkit": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-6.5.1.tgz", + "integrity": "sha512-oY5E81cXvRUxXkbVgOI8NxYHKF5FeWfJhFCIYUKhbVfSmdCH8+bmJzgDdhufExa7t1+WEzpUFdHwYxJTXS90vQ==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", + "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "dev": true, + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.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.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fraction.js": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", + "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "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" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", + "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "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-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "requires": { + "colors": "1.4.0" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "karma": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.1.2.tgz", + "integrity": "sha512-mKbxgsJrt3UHBPdKfCxC2eg3lpqyt6hQRFhNWJ2sk0wUnbnLPEiCpgIgiycuLSra0vC6TaK9OPJiMGATGzgH/A==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^3.1.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "^0.7.23", + "yargs": "^16.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "katex": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.13.0.tgz", + "integrity": "sha512-6cHbzbegYgS9vvVGuH8UA+o97X+ZshtboSqJJCdq7trBYzuD75JNwr7Ef606xkUjecPPhFnyB+afx1dVafielg==", + "requires": { + "commander": "^6.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, + "less": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "less-loader": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "license-webpack-plugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz", + "integrity": "sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "luxon": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz", + "integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==", + "optional": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "dependencies": { + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz", + "integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "dev": true, + "requires": { + "mime-db": "1.46.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.5.tgz", + "integrity": "sha512-tvmzcwqJJXau4OQE5vT72pRT18o2zF+tQJp8CWchqvfQnTlflkzS+dANYcRdyPRWUWRkfmeNTKltx0NZI/b5dQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "modern-normalize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.0.0.tgz", + "integrity": "sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw==", + "dev": true + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "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" + } + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "ng-apexcharts": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/ng-apexcharts/-/ng-apexcharts-1.5.9.tgz", + "integrity": "sha512-ZRsU9meBvXNPG1vhEolCJGRrhfR7Nnj37E6H5CHfWpUEAw9/89U5TK+yDD+myPhT0ubQbRb6fZJoG74dEebXYA==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "ngx-markdown": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-11.1.2.tgz", + "integrity": "sha512-T+FA8K2iN7VADx7hO4ytYhRnMJjyVNPHJizrtmVFpjhRcsOTCwCmM4e1qpx1XjxSEliN9Z3mux3a+IPM4jH6+Q==", + "requires": { + "@types/marked": "^2.0.0", + "emoji-toolkit": "^6.0.1", + "katex": "^0.13.0", + "marked": "^2.0.0", + "prismjs": "^1.23.0", + "tslib": "^2.0.0" + } + }, + "ngx-quill": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/ngx-quill/-/ngx-quill-13.2.0.tgz", + "integrity": "sha512-X7Nej3/WcyuR4LiO5hSgGohyaz6UnYyW4o2egaN1DU+Lh+9V/68pvZgYybLtZMIXYu1ynzHyXoEo4OTpBkYnxg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.5.tgz", + "integrity": "sha512-KCfK3Vi2F+PH1klYauoQzg81GQ8/GGjQRKYY6tRnpQUPKTs/1gBZSRWtTEd7jGdSn1LZL7gpAmJT+BcS55k2XQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "npm-registry-fetch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz", + "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "dev": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", + "dev": true + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.0.tgz", + "integrity": "sha512-PGoBCX/lclIWlpS/R2PQuIR4NJoXh6X5AwVzE7WXnWRGvHg7+4TBCgsujUgiPpm0K1y4qvQeWnCWVTpTKZBtvA==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.2.4.tgz", + "integrity": "sha512-GfTeVQGJ6WyBQbQD4t3ocHbyOmTQLmWjkCKSZPmKiGFKYKNUaM5U2gbLzUW8WG1XmS9yQFnsTFA0k3o1+q4klQ==", + "dev": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^9.0.0", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "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-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "perfect-scrollbar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz", + "integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz", + "integrity": "sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "requires": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-import": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz", + "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + } + }, + "postcss-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", + "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@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" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@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" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz", + "integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "prismjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "requires": { + "clipboard": "^2.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protractor": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "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" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "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" + } + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "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": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "purgecss": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-3.1.3.tgz", + "integrity": "sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==", + "dev": true, + "requires": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json-fast": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.2.2.tgz", + "integrity": "sha512-39DbPJjkltEzfXJXB6D8/Ir3GFOU2YbSKa2HaB/Y3nKrc/zY+0XrALpID6/13ezWyzqvOHrBbR4t4cjQuTdBVQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resolve-url-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "dev": true, + "requires": { + "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.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.38.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.4.tgz", + "integrity": "sha512-B0LcJhjiwKkTl79aGVF/u5KdzsH8IylVfV56Ut6c9ouWLJcUK17T83aZBetNYSnZtXf2OHD4+2PbmRW+Fp5ulg==", + "dev": true, + "requires": { + "fsevents": "~2.3.1" + } + }, + "rrule": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.8.tgz", + "integrity": "sha512-cUaXuUPrz9d1wdyzHsBfT1hptKlGgABeCINFXFvulEPqh9Np9BnF3C3lrv9uO54IIr8VDb58tsSF3LhsW+4VRw==", + "requires": { + "luxon": "^1.21.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.32.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.6.tgz", + "integrity": "sha512-1bcDHDcSqeFtMr0JXI3xc/CXX6c4p0wHHivJdru8W7waM7a1WjKMm4m/Z5sY7CbVw4Whi2Chpcw6DFfSWwGLzQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", + "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", + "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" + } + }, + "socket.io-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dev": true, + "requires": { + "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.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socks": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.0.tgz", + "integrity": "sha512-mNmr9owlinMplev0Wd7UHFlqI4ofnBnNzFuzrm63PPaHgbkqCFe4T5LzwKmtQ/f2tX0NTpcdVLyD/FHxFBstYw==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "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" + } + }, + "speed-measure-webpack-plugin": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.4.2.tgz", + "integrity": "sha512-AtVzD0bnIy2/B0fWqJpJgmhcrfWFhBlduzSo0uwplr/QvB33ZNZj2NEth3NONgdnZJqicK0W0mSxnLSbsVCDbw==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.3.tgz", + "integrity": "sha512-PpWB5PnCXUzW4WMYhCvNzAHJBjIBPMXwsdfkkKuA9W7k8OQFMl/19/AQvaWsxz2IptxUlCseyJ6TY/eEKJ4+UQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.4", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "requires": { + "svg.js": "^2.0.1" + } + }, + "svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha1-iqmUawqOJ4V6XEChDrpAkeVpHxI=", + "requires": { + "svg.js": ">=2.3.x" + } + }, + "svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha1-kQCOFROJ3ZIwd5/L5uLJo2LRwgM=", + "requires": { + "svg.js": "^2.2.5" + } + }, + "svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "requires": { + "svg.js": "^2.4.0" + } + }, + "svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "requires": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "dependencies": { + "svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "requires": { + "svg.js": "^2.2.5" + } + } + } + }, + "svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "requires": { + "svg.js": "^2.6.5" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "symbol-observable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", + "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", + "dev": true + }, + "tailwindcss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.1.1.tgz", + "integrity": "sha512-zZ6axGqpSZOCBS7wITm/WNHkBzDt5CIZlDlx0eCVldwTxFPELCVGbgh7Xpb3/kZp3cUxOmK7bZUjqhuMrbN6xQ==", + "dev": true, + "requires": { + "@fullhuman/postcss-purgecss": "^3.1.3", + "bytes": "^3.0.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "color": "^3.1.3", + "detective": "^5.2.0", + "didyoumean": "^1.2.1", + "dlv": "^1.1.3", + "fast-glob": "^3.2.5", + "fs-extra": "^9.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.0.0", + "node-emoji": "^1.8.1", + "normalize-path": "^3.0.0", + "object-hash": "^2.1.1", + "parse-glob": "^3.0.4", + "postcss-functions": "^3", + "postcss-js": "^3.0.3", + "postcss-nested": "5.0.5", + "postcss-selector-parser": "^6.0.4", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dev": true, + "requires": { + "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" + } + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", + "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.26", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.26.tgz", + "integrity": "sha512-VwIvGlFNmpKbjzRt51jpbbFTrKIEgGHxIwA8Y69K1Bqc6bTIV7TaGGABOkghSFQWsLmcRB4drGvpfv9z2szqoQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "request": "^2.88.2", + "uuid": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web-animations-js": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "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" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", + "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "requires": { + "tslib": "^2.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..1f695f1c --- /dev/null +++ b/package.json @@ -0,0 +1,83 @@ +{ + "name": "@fuse/demo", + "version": "12.0.0", + "license": "https://themeforest.net/licenses/standard", + "private": true, + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build --prod", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "dependencies": { + "@angular/animations": "11.2.10", + "@angular/cdk": "11.2.9", + "@angular/common": "11.2.10", + "@angular/compiler": "11.2.10", + "@angular/core": "11.2.10", + "@angular/forms": "11.2.10", + "@angular/material": "11.2.9", + "@angular/material-moment-adapter": "11.2.9", + "@angular/platform-browser": "11.2.10", + "@angular/platform-browser-dynamic": "11.2.10", + "@angular/router": "11.2.10", + "@fullcalendar/angular": "4.4.5-beta", + "@fullcalendar/core": "4.4.2", + "@fullcalendar/daygrid": "4.4.2", + "@fullcalendar/interaction": "4.4.2", + "@fullcalendar/list": "4.4.2", + "@fullcalendar/moment": "4.4.2", + "@fullcalendar/rrule": "4.4.2", + "@fullcalendar/timegrid": "4.4.2", + "apexcharts": "3.26.0", + "crypto-js": "3.3.0", + "highlight.js": "10.7.2", + "lodash-es": "4.17.21", + "moment": "2.29.1", + "ng-apexcharts": "1.5.9", + "ngx-markdown": "11.1.2", + "ngx-quill": "13.2.0", + "perfect-scrollbar": "1.5.0", + "quill": "1.3.7", + "rrule": "2.6.8", + "rxjs": "6.6.7", + "tslib": "2.1.0", + "web-animations-js": "2.3.2", + "zone.js": "0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "0.1102.9", + "@angular/cli": "11.2.9", + "@angular/compiler-cli": "11.2.10", + "@angular/language-service": "11.2.10", + "@tailwindcss/aspect-ratio": "0.2.0", + "@tailwindcss/line-clamp": "0.2.0", + "@tailwindcss/typography": "0.4.0", + "@types/chroma-js": "2.1.3", + "@types/crypto-js": "3.1.47", + "@types/highlight.js": "10.1.0", + "@types/jasmine": "3.6.8", + "@types/lodash": "4.14.168", + "@types/lodash-es": "4.17.4", + "@types/node": "12.20.6", + "autoprefixer": "10.2.5", + "chroma-js": "2.1.1", + "codelyzer": "6.0.1", + "jasmine-core": "3.6.0", + "jasmine-spec-reporter": "5.0.2", + "karma": "6.1.2", + "karma-chrome-launcher": "3.1.0", + "karma-coverage": "2.0.3", + "karma-jasmine": "4.0.1", + "karma-jasmine-html-reporter": "1.5.4", + "lodash": "4.17.21", + "postcss": "8.2.10", + "protractor": "7.0.0", + "tailwindcss": "2.1.1", + "ts-node": "8.3.0", + "tslint": "6.1.3", + "typescript": "4.1.5" + } +} diff --git a/src/@fuse/animations/defaults.ts b/src/@fuse/animations/defaults.ts new file mode 100644 index 00000000..61263cc5 --- /dev/null +++ b/src/@fuse/animations/defaults.ts @@ -0,0 +1,14 @@ +export class FuseAnimationCurves +{ + static STANDARD_CURVE = 'cubic-bezier(0.4, 0.0, 0.2, 1)'; + static DECELERATION_CURVE = 'cubic-bezier(0.0, 0.0, 0.2, 1)'; + static ACCELERATION_CURVE = 'cubic-bezier(0.4, 0.0, 1, 1)'; + static SHARP_CURVE = 'cubic-bezier(0.4, 0.0, 0.6, 1)'; +} + +export class FuseAnimationDurations +{ + static COMPLEX = '375ms'; + static ENTERING = '225ms'; + static EXITING = '195ms'; +} diff --git a/src/@fuse/animations/expand-collapse.ts b/src/@fuse/animations/expand-collapse.ts new file mode 100644 index 00000000..0ef88be6 --- /dev/null +++ b/src/@fuse/animations/expand-collapse.ts @@ -0,0 +1,34 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { FuseAnimationCurves, FuseAnimationDurations } from '@fuse/animations/defaults'; + +// ----------------------------------------------------------------------------------------------------- +// @ Expand / collapse +// ----------------------------------------------------------------------------------------------------- +const expandCollapse = trigger('expandCollapse', + [ + state('void, collapsed', + style({ + height: '0' + }) + ), + + state('*, expanded', + style('*') + ), + + // Prevent the transition if the state is false + transition('void <=> false, collapsed <=> false, expanded <=> false', []), + + // Transition + transition('void <=> *, collapsed <=> expanded', + animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +export { expandCollapse }; diff --git a/src/@fuse/animations/fade.ts b/src/@fuse/animations/fade.ts new file mode 100644 index 00000000..5a5457d3 --- /dev/null +++ b/src/@fuse/animations/fade.ts @@ -0,0 +1,330 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { FuseAnimationCurves, FuseAnimationDurations } from '@fuse/animations/defaults'; + +// ----------------------------------------------------------------------------------------------------- +// @ Fade in +// ----------------------------------------------------------------------------------------------------- +const fadeIn = trigger('fadeIn', + [ + state('void', + style({ + opacity: 0 + }) + ), + + state('*', + style({ + opacity: 1 + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade in top +// ----------------------------------------------------------------------------------------------------- +const fadeInTop = trigger('fadeInTop', + [ + state('void', + style({ + opacity : 0, + transform: 'translate3d(0, -100%, 0)' + }) + ), + + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade in bottom +// ----------------------------------------------------------------------------------------------------- +const fadeInBottom = trigger('fadeInBottom', + [ + state('void', + style({ + opacity : 0, + transform: 'translate3d(0, 100%, 0)' + }) + ), + + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade in left +// ----------------------------------------------------------------------------------------------------- +const fadeInLeft = trigger('fadeInLeft', + [ + state('void', + style({ + opacity : 0, + transform: 'translate3d(-100%, 0, 0)' + }) + ), + + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade in right +// ----------------------------------------------------------------------------------------------------- +const fadeInRight = trigger('fadeInRight', + [ + state('void', + style({ + opacity : 0, + transform: 'translate3d(100%, 0, 0)' + }) + ), + + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade out +// ----------------------------------------------------------------------------------------------------- +const fadeOut = trigger('fadeOut', + [ + state('*', + style({ + opacity: 1 + }) + ), + + state('void', + style({ + opacity: 0 + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade out top +// ----------------------------------------------------------------------------------------------------- +const fadeOutTop = trigger('fadeOutTop', + [ + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + opacity : 0, + transform: 'translate3d(0, -100%, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade out bottom +// ----------------------------------------------------------------------------------------------------- +const fadeOutBottom = trigger('fadeOutBottom', + [ + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + opacity : 0, + transform: 'translate3d(0, 100%, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade out left +// ----------------------------------------------------------------------------------------------------- +const fadeOutLeft = trigger('fadeOutLeft', + [ + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + opacity : 0, + transform: 'translate3d(-100%, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Fade out right +// ----------------------------------------------------------------------------------------------------- +const fadeOutRight = trigger('fadeOutRight', + [ + state('*', + style({ + opacity : 1, + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + opacity : 0, + transform: 'translate3d(100%, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +export { fadeIn, fadeInTop, fadeInBottom, fadeInLeft, fadeInRight, fadeOut, fadeOutTop, fadeOutBottom, fadeOutLeft, fadeOutRight }; diff --git a/src/@fuse/animations/index.ts b/src/@fuse/animations/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/src/@fuse/animations/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/src/@fuse/animations/public-api.ts b/src/@fuse/animations/public-api.ts new file mode 100644 index 00000000..0e908818 --- /dev/null +++ b/src/@fuse/animations/public-api.ts @@ -0,0 +1,15 @@ +import { expandCollapse } from './expand-collapse'; +import { fadeIn, fadeInBottom, fadeInLeft, fadeInRight, fadeInTop, fadeOut, fadeOutBottom, fadeOutLeft, fadeOutRight, fadeOutTop } from './fade'; +import { shake } from './shake'; +import { slideInBottom, slideInLeft, slideInRight, slideInTop, slideOutBottom, slideOutLeft, slideOutRight, slideOutTop } from './slide'; +import { zoomIn, zoomOut } from './zoom'; + +export const FuseAnimations = [ + expandCollapse, + fadeIn, fadeInTop, fadeInBottom, fadeInLeft, fadeInRight, + fadeOut, fadeOutTop, fadeOutBottom, fadeOutLeft, fadeOutRight, + shake, + slideInTop, slideInBottom, slideInLeft, slideInRight, + slideOutTop, slideOutBottom, slideOutLeft, slideOutRight, + zoomIn, zoomOut +]; diff --git a/src/@fuse/animations/shake.ts b/src/@fuse/animations/shake.ts new file mode 100644 index 00000000..2742345b --- /dev/null +++ b/src/@fuse/animations/shake.ts @@ -0,0 +1,73 @@ +import { animate, keyframes, style, transition, trigger } from '@angular/animations'; + +// ----------------------------------------------------------------------------------------------------- +// @ Shake +// ----------------------------------------------------------------------------------------------------- +const shake = trigger('shake', + [ + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *, * => true', + [ + animate('{{timings}}', + keyframes([ + style({ + transform: 'translate3d(0, 0, 0)', + offset : 0 + }), + style({ + transform: 'translate3d(-10px, 0, 0)', + offset : 0.1 + }), + style({ + transform: 'translate3d(10px, 0, 0)', + offset : 0.2 + }), + style({ + transform: 'translate3d(-10px, 0, 0)', + offset : 0.3 + }), + style({ + transform: 'translate3d(10px, 0, 0)', + offset : 0.4 + }), + style({ + transform: 'translate3d(-10px, 0, 0)', + offset : 0.5 + }), + style({ + transform: 'translate3d(10px, 0, 0)', + offset : 0.6 + }), + style({ + transform: 'translate3d(-10px, 0, 0)', + offset : 0.7 + }), + style({ + transform: 'translate3d(10px, 0, 0)', + offset : 0.8 + }), + style({ + transform: 'translate3d(-10px, 0, 0)', + offset : 0.9 + }), + style({ + transform: 'translate3d(0, 0, 0)', + offset : 1 + }) + ]) + ) + ], + { + params: { + timings: '0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955)' + } + } + ) + ] +); + +export { shake }; diff --git a/src/@fuse/animations/slide.ts b/src/@fuse/animations/slide.ts new file mode 100644 index 00000000..f9e07584 --- /dev/null +++ b/src/@fuse/animations/slide.ts @@ -0,0 +1,252 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { FuseAnimationCurves, FuseAnimationDurations } from '@fuse/animations/defaults'; + +// ----------------------------------------------------------------------------------------------------- +// @ Slide in top +// ----------------------------------------------------------------------------------------------------- +const slideInTop = trigger('slideInTop', + [ + state('void', + style({ + transform: 'translate3d(0, -100%, 0)' + }) + ), + + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide in bottom +// ----------------------------------------------------------------------------------------------------- +const slideInBottom = trigger('slideInBottom', + [ + state('void', + style({ + transform: 'translate3d(0, 100%, 0)' + }) + ), + + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide in left +// ----------------------------------------------------------------------------------------------------- +const slideInLeft = trigger('slideInLeft', + [ + state('void', + style({ + transform: 'translate3d(-100%, 0, 0)' + }) + ), + + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide in right +// ----------------------------------------------------------------------------------------------------- +const slideInRight = trigger('slideInRight', + [ + state('void', + style({ + transform: 'translate3d(100%, 0, 0)' + }) + ), + + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide out top +// ----------------------------------------------------------------------------------------------------- +const slideOutTop = trigger('slideOutTop', + [ + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + transform: 'translate3d(0, -100%, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide out bottom +// ----------------------------------------------------------------------------------------------------- +const slideOutBottom = trigger('slideOutBottom', + [ + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + transform: 'translate3d(0, 100%, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide out left +// ----------------------------------------------------------------------------------------------------- +const slideOutLeft = trigger('slideOutLeft', + [ + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + transform: 'translate3d(-100%, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Slide out right +// ----------------------------------------------------------------------------------------------------- +const slideOutRight = trigger('slideOutRight', + [ + state('*', + style({ + transform: 'translate3d(0, 0, 0)' + }) + ), + + state('void', + style({ + transform: 'translate3d(100%, 0, 0)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +export { slideInTop, slideInBottom, slideInLeft, slideInRight, slideOutTop, slideOutBottom, slideOutLeft, slideOutRight }; diff --git a/src/@fuse/animations/zoom.ts b/src/@fuse/animations/zoom.ts new file mode 100644 index 00000000..aff564dd --- /dev/null +++ b/src/@fuse/animations/zoom.ts @@ -0,0 +1,73 @@ +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { FuseAnimationCurves, FuseAnimationDurations } from '@fuse/animations/defaults'; + +// ----------------------------------------------------------------------------------------------------- +// @ Zoom in +// ----------------------------------------------------------------------------------------------------- +const zoomIn = trigger('zoomIn', + [ + + state('void', + style({ + opacity : 0, + transform: 'scale(0.5)' + }) + ), + + state('*', + style({ + opacity : 1, + transform: 'scale(1)' + }) + ), + + // Prevent the transition if the state is false + transition('void => false', []), + + // Transition + transition('void => *', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.ENTERING} ${FuseAnimationCurves.DECELERATION_CURVE}` + } + } + ) + ] +); + +// ----------------------------------------------------------------------------------------------------- +// @ Zoom out +// ----------------------------------------------------------------------------------------------------- +const zoomOut = trigger('zoomOut', + [ + + state('*', + style({ + opacity : 1, + transform: 'scale(1)' + }) + ), + + state('void', + style({ + opacity : 0, + transform: 'scale(0.5)' + }) + ), + + // Prevent the transition if the state is false + transition('false => void', []), + + // Transition + transition('* => void', animate('{{timings}}'), + { + params: { + timings: `${FuseAnimationDurations.EXITING} ${FuseAnimationCurves.ACCELERATION_CURVE}` + } + } + ) + ] +); + +export { zoomIn, zoomOut }; + diff --git a/src/@fuse/components/alert/alert.component.html b/src/@fuse/components/alert/alert.component.html new file mode 100644 index 00000000..6efa4c99 --- /dev/null +++ b/src/@fuse/components/alert/alert.component.html @@ -0,0 +1,82 @@ +
+ + +
+ + +
+ + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ + + + +
diff --git a/src/@fuse/components/alert/alert.component.scss b/src/@fuse/components/alert/alert.component.scss new file mode 100644 index 00000000..4b1a86ce --- /dev/null +++ b/src/@fuse/components/alert/alert.component.scss @@ -0,0 +1,1340 @@ +fuse-alert { + display: block; + + /* Common */ + .fuse-alert-container { + position: relative; + display: flex; + padding: 16px; + font-size: 14px; + line-height: 1; + + /* All icons */ + .mat-icon { + color: currentColor !important; + } + + /* Icon */ + .fuse-alert-icon { + display: flex; + align-items: flex-start; + + .fuse-alert-custom-icon, + .fuse-alert-default-icon { + display: none; + align-items: center; + justify-content: center; + border-radius: 50%; + + &:not(:empty) { + display: flex; + margin-right: 12px; + } + } + + .fuse-alert-default-icon { + + .mat-icon { + @apply icon-size-5; + } + } + + .fuse-alert-custom-icon { + display: none; + + &:not(:empty) { + display: flex; + + + .fuse-alert-default-icon { + display: none; + } + } + } + } + + /* Content */ + .fuse-alert-content { + display: flex; + flex-direction: column; + justify-content: center; + line-height: 1; + + /* Title */ + .fuse-alert-title { + display: none; + font-weight: 600; + line-height: 20px; + + &:not(:empty) { + display: block; + + /* Alert that comes after the title */ + + .fuse-alert-message { + + &:not(:empty) { + margin-top: 4px; + } + } + } + } + + /* Alert */ + .fuse-alert-message { + display: none; + line-height: 20px; + + &:not(:empty) { + display: block; + } + } + } + + /* Dismiss button */ + .fuse-alert-dismiss-button { + position: absolute; + top: 10px; + right: 10px; + width: 32px !important; + min-width: 32px !important; + height: 32px !important; + min-height: 32px !important; + line-height: 32px !important; + + .mat-icon { + @apply icon-size-4; + } + } + } + + /* Dismissible */ + &.fuse-alert-dismissible { + + .fuse-alert-container { + + .fuse-alert-content { + margin-right: 32px; + } + } + } + + &:not(.fuse-alert-dismissible) { + + .fuse-alert-container { + + .fuse-alert-dismiss-button { + display: none !important; + } + } + } + + /* Border */ + &.fuse-alert-appearance-border { + + .fuse-alert-container { + position: relative; + overflow: hidden; + border-radius: 6px; + @apply shadow-md bg-card; + + .fuse-alert-border { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 4px; + } + + .fuse-alert-message { + @apply text-gray-600; + } + } + + /* Primary */ + &.fuse-alert-type-primary { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-primary; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-primary; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-primary-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-primary-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Accent */ + &.fuse-alert-type-accent { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-accent; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-accent; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-accent-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-accent-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Warn */ + &.fuse-alert-type-warn { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-warn; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-warn; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-warn-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-warn-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Basic */ + &.fuse-alert-type-basic { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-gray-600; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-gray-600; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-gray-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-gray-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Info */ + &.fuse-alert-type-info { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-blue-600; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-blue-700; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-blue-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-blue-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Success */ + &.fuse-alert-type-success { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-green-500; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-green-500; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-green-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-green-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Warning */ + &.fuse-alert-type-warning { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-amber-500; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-amber-500; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-amber-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-amber-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + + /* Error */ + &.fuse-alert-type-error { + + .fuse-alert-container { + + .fuse-alert-border { + @apply bg-red-600; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-red-700; + } + + .dark & { + @apply bg-gray-700; + + .fuse-alert-border { + @apply bg-red-400; + } + + .fuse-alert-title, + .fuse-alert-icon { + @apply text-red-400; + } + + .fuse-alert-message { + @apply text-gray-300; + } + + code { + @apply bg-gray-400 text-gray-800; + } + } + } + } + } + + /* Fill */ + &.fuse-alert-appearance-fill { + + .fuse-alert-container { + border-radius: 6px; + + .fuse-alert-dismiss-button { + @apply text-white; + } + } + + /* Primary */ + &.fuse-alert-type-primary { + + .fuse-alert-container { + @apply bg-primary-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-primary-100; + } + + code { + @apply text-primary-800 bg-primary-200; + } + } + } + + /* Accent */ + &.fuse-alert-type-accent { + + .fuse-alert-container { + @apply bg-accent-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-accent-100; + } + + code { + @apply text-accent-800 bg-accent-200; + } + } + } + + /* Warn */ + &.fuse-alert-type-warn { + + .fuse-alert-container { + @apply bg-warn-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-warn-100; + } + + code { + @apply text-warn-800 bg-warn-200; + } + } + } + + /* Basic */ + &.fuse-alert-type-basic { + + .fuse-alert-container { + @apply bg-gray-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-gray-100; + } + + code { + @apply bg-gray-200 text-gray-800; + } + } + } + + /* Info */ + &.fuse-alert-type-info { + + .fuse-alert-container { + @apply bg-blue-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-blue-100; + } + + code { + @apply bg-blue-200 text-blue-800; + } + } + } + + /* Success */ + &.fuse-alert-type-success { + + .fuse-alert-container { + @apply bg-green-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-green-100; + } + + code { + @apply bg-green-200 text-gray-800; + } + } + } + + /* Warning */ + &.fuse-alert-type-warning { + + .fuse-alert-container { + @apply bg-amber-500; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-amber-100; + } + + code { + @apply bg-amber-200 text-amber-800; + } + } + } + + /* Error */ + &.fuse-alert-type-error { + + .fuse-alert-container { + @apply bg-red-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title { + @apply text-white; + } + + .fuse-alert-message { + @apply text-red-100; + } + + code { + @apply bg-red-200 text-red-800; + } + } + } + } + + /* Outline */ + &.fuse-alert-appearance-outline { + + .fuse-alert-container { + border-radius: 6px; + } + + /* Primary */ + &.fuse-alert-type-primary { + + .fuse-alert-container { + @apply bg-primary-50 ring-1 ring-primary-400 ring-inset; + + .fuse-alert-icon { + @apply text-primary-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-primary-900; + } + + .fuse-alert-message { + @apply text-primary-700; + } + + code { + @apply text-primary-800 bg-primary-200; + } + + .dark & { + @apply bg-primary-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-primary-200; + } + } + } + } + + /* Accent */ + &.fuse-alert-type-accent { + + .fuse-alert-container { + @apply bg-accent-100 ring-1 ring-accent-400 ring-inset; + + .fuse-alert-icon { + @apply text-accent-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-accent-900; + } + + .fuse-alert-message { + @apply text-accent-700; + } + + code { + @apply text-accent-800 bg-accent-200; + } + + .dark & { + @apply bg-accent-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-accent-200; + } + } + } + } + + /* Warn */ + &.fuse-alert-type-warn { + + .fuse-alert-container { + @apply bg-warn-50 ring-1 ring-warn-400 ring-inset; + + .fuse-alert-icon { + @apply text-warn-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-warn-900; + } + + .fuse-alert-message { + @apply text-warn-700; + } + + code { + @apply text-warn-800 bg-warn-200; + } + + .dark & { + @apply bg-warn-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-warn-200; + } + } + } + } + + /* Basic */ + &.fuse-alert-type-basic { + + .fuse-alert-container { + @apply bg-gray-100 ring-1 ring-gray-400 ring-inset; + + .fuse-alert-icon { + @apply text-gray-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-gray-900; + } + + .fuse-alert-message { + @apply text-gray-700; + } + + code { + @apply bg-gray-200 text-gray-800; + } + + .dark & { + @apply bg-gray-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-gray-200; + } + } + } + } + + /* Info */ + &.fuse-alert-type-info { + + .fuse-alert-container { + @apply bg-blue-50 ring-1 ring-blue-400 ring-inset; + + .fuse-alert-icon { + @apply text-blue-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-blue-900; + } + + .fuse-alert-message { + @apply text-blue-700; + } + + code { + @apply bg-blue-200 text-blue-800; + } + + .dark & { + @apply bg-blue-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-blue-200; + } + } + } + } + + /* Success */ + &.fuse-alert-type-success { + + .fuse-alert-container { + @apply bg-green-50 ring-1 ring-green-400 ring-inset; + + .fuse-alert-icon { + @apply text-green-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-green-900; + } + + .fuse-alert-message { + @apply text-green-700; + } + + code { + @apply bg-green-200 text-green-800; + } + + .dark & { + @apply bg-green-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-green-200; + } + } + } + } + + /* Warning */ + &.fuse-alert-type-warning { + + .fuse-alert-container { + @apply bg-amber-50 ring-1 ring-amber-400 ring-inset; + + .fuse-alert-icon { + @apply text-amber-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-amber-900; + } + + .fuse-alert-message { + @apply text-amber-700; + } + + code { + @apply bg-amber-200 text-amber-800; + } + + .dark & { + @apply bg-amber-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-amber-200; + } + } + } + } + + /* Error */ + &.fuse-alert-type-error { + + .fuse-alert-container { + @apply bg-red-50 ring-1 ring-red-400 ring-inset; + + .fuse-alert-icon { + @apply text-red-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-red-900; + } + + .fuse-alert-message { + @apply text-red-700; + } + + code { + @apply bg-red-200 text-red-800; + } + + .dark & { + @apply bg-red-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-red-200; + } + } + } + } + } + + /* Soft */ + &.fuse-alert-appearance-soft { + + .fuse-alert-container { + border-radius: 6px; + } + + /* Primary */ + &.fuse-alert-type-primary { + + .fuse-alert-container { + @apply bg-primary-50; + + .fuse-alert-icon { + @apply text-primary-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-primary-900; + } + + .fuse-alert-message { + @apply text-primary-700; + } + + code { + @apply text-primary-800 bg-primary-200; + } + + .dark & { + @apply bg-primary-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-primary-200; + } + } + } + } + + /* Accent */ + &.fuse-alert-type-accent { + + .fuse-alert-container { + @apply bg-accent-100; + + .fuse-alert-icon { + @apply text-accent-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-accent-900; + } + + .fuse-alert-message { + @apply text-accent-700; + } + + code { + @apply text-accent-800 bg-accent-200; + } + + .dark & { + @apply bg-accent-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-accent-200; + } + } + } + } + + /* Warn */ + &.fuse-alert-type-warn { + + .fuse-alert-container { + @apply bg-warn-50; + + .fuse-alert-icon { + @apply text-warn-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-warn-900; + } + + .fuse-alert-message { + @apply text-warn-700; + } + + code { + @apply text-warn-800 bg-warn-200; + } + + .dark & { + @apply bg-warn-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-warn-200; + } + } + } + } + + /* Basic */ + &.fuse-alert-type-basic { + + .fuse-alert-container { + @apply bg-gray-100; + + .fuse-alert-icon { + @apply text-gray-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-gray-900; + } + + .fuse-alert-message { + @apply text-gray-700; + } + + code { + @apply bg-gray-200 text-gray-800; + } + + .dark & { + @apply bg-gray-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-gray-200; + } + } + } + } + + /* Info */ + &.fuse-alert-type-info { + + .fuse-alert-container { + @apply bg-blue-50; + + .fuse-alert-icon { + @apply text-blue-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-blue-900; + } + + .fuse-alert-message { + @apply text-blue-700; + } + + code { + @apply bg-blue-200 text-blue-800; + } + + .dark & { + @apply bg-blue-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-blue-200; + } + } + } + } + + /* Success */ + &.fuse-alert-type-success { + + .fuse-alert-container { + @apply bg-green-50; + + .fuse-alert-icon { + @apply text-green-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-green-900; + } + + .fuse-alert-message { + @apply text-green-700; + } + + code { + @apply bg-green-200 text-green-800; + } + + .dark & { + @apply bg-green-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-green-200; + } + } + } + } + + /* Warning */ + &.fuse-alert-type-warning { + + .fuse-alert-container { + @apply bg-amber-50; + + .fuse-alert-icon { + @apply text-amber-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-amber-900; + } + + .fuse-alert-message { + @apply text-amber-700; + } + + code { + @apply bg-amber-200 text-amber-800; + } + + .dark & { + @apply bg-amber-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-amber-200; + } + } + } + } + + /* Error */ + &.fuse-alert-type-error { + + .fuse-alert-container { + @apply bg-red-50; + + .fuse-alert-icon { + @apply text-red-600; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-red-900; + } + + .fuse-alert-message { + @apply text-red-700; + } + + code { + @apply bg-red-200 text-red-800; + } + + .dark & { + @apply bg-red-600; + + .fuse-alert-icon { + @apply text-white; + } + + .fuse-alert-title, + .fuse-alert-dismiss-button { + @apply text-white; + } + + .fuse-alert-message { + @apply text-red-200; + } + } + } + } + } +} diff --git a/src/@fuse/components/alert/alert.component.ts b/src/@fuse/components/alert/alert.component.ts new file mode 100644 index 00000000..6a915f5e --- /dev/null +++ b/src/@fuse/components/alert/alert.component.ts @@ -0,0 +1,211 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertAppearance, FuseAlertType } from '@fuse/components/alert/alert.types'; +import { FuseAlertService } from '@fuse/components/alert/alert.service'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; + +@Component({ + selector : 'fuse-alert', + templateUrl : './alert.component.html', + styleUrls : ['./alert.component.scss'], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + animations : FuseAnimations, + exportAs : 'fuseAlert' +}) +export class FuseAlertComponent implements OnChanges, OnInit, OnDestroy +{ + static ngAcceptInputType_dismissible: BooleanInput; + static ngAcceptInputType_dismissed: BooleanInput; + static ngAcceptInputType_showIcon: BooleanInput; + + @Input() appearance: FuseAlertAppearance = 'soft'; + @Input() dismissed: boolean = false; + @Input() dismissible: boolean = false; + @Input() name: string = this._fuseUtilsService.randomId(); + @Input() showIcon: boolean = true; + @Input() type: FuseAlertType = 'primary'; + @Output() readonly dismissedChanged: EventEmitter = new EventEmitter(); + + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseAlertService: FuseAlertService, + private _fuseUtilsService: FuseUtilsService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'fuse-alert-appearance-border' : this.appearance === 'border', + 'fuse-alert-appearance-fill' : this.appearance === 'fill', + 'fuse-alert-appearance-outline': this.appearance === 'outline', + 'fuse-alert-appearance-soft' : this.appearance === 'soft', + 'fuse-alert-dismissed' : this.dismissed, + 'fuse-alert-dismissible' : this.dismissible, + 'fuse-alert-show-icon' : this.showIcon, + 'fuse-alert-type-primary' : this.type === 'primary', + 'fuse-alert-type-accent' : this.type === 'accent', + 'fuse-alert-type-warn' : this.type === 'warn', + 'fuse-alert-type-basic' : this.type === 'basic', + 'fuse-alert-type-info' : this.type === 'info', + 'fuse-alert-type-success' : this.type === 'success', + 'fuse-alert-type-warning' : this.type === 'warning', + 'fuse-alert-type-error' : this.type === 'error' + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Dismissed + if ( 'dismissed' in changes ) + { + // Coerce the value to a boolean + this.dismissed = coerceBooleanProperty(changes.dismissed.currentValue); + + // Dismiss/show the alert + this._toggleDismiss(this.dismissed); + } + + // Dismissible + if ( 'dismissible' in changes ) + { + // Coerce the value to a boolean + this.dismissible = coerceBooleanProperty(changes.dismissible.currentValue); + } + + // Show icon + if ( 'showIcon' in changes ) + { + // Coerce the value to a boolean + this.showIcon = coerceBooleanProperty(changes.showIcon.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the dismiss calls + this._fuseAlertService.onDismiss + .pipe( + filter((name) => this.name === name), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + + // Dismiss the alert + this.dismiss(); + }); + + // Subscribe to the show calls + this._fuseAlertService.onShow + .pipe( + filter((name) => this.name === name), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + + // Show the alert + this.show(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Dismiss the alert + */ + dismiss(): void + { + // Return if the alert is already dismissed + if ( this.dismissed ) + { + return; + } + + // Dismiss the alert + this._toggleDismiss(true); + } + + /** + * Show the dismissed alert + */ + show(): void + { + // Return if the alert is already showing + if ( !this.dismissed ) + { + return; + } + + // Show the alert + this._toggleDismiss(false); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Dismiss/show the alert + * + * @param dismissed + * @private + */ + private _toggleDismiss(dismissed: boolean): void + { + // Return if the alert is not dismissible + if ( !this.dismissible ) + { + return; + } + + // Set the dismissed + this.dismissed = dismissed; + + // Execute the observable + this.dismissedChanged.next(this.dismissed); + + // Notify the change detector + this._changeDetectorRef.markForCheck(); + } +} diff --git a/src/@fuse/components/alert/alert.module.ts b/src/@fuse/components/alert/alert.module.ts new file mode 100644 index 00000000..beecabdd --- /dev/null +++ b/src/@fuse/components/alert/alert.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { FuseAlertComponent } from '@fuse/components/alert/alert.component'; + +@NgModule({ + declarations: [ + FuseAlertComponent + ], + imports : [ + CommonModule, + MatButtonModule, + MatIconModule + ], + exports : [ + FuseAlertComponent + ] +}) +export class FuseAlertModule +{ +} diff --git a/src/@fuse/components/alert/alert.service.ts b/src/@fuse/components/alert/alert.service.ts new file mode 100644 index 00000000..a04dbe5c --- /dev/null +++ b/src/@fuse/components/alert/alert.service.ts @@ -0,0 +1,77 @@ +import { Injectable } from '@angular/core'; +import { Observable, ReplaySubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseAlertService +{ + private readonly _onDismiss: ReplaySubject = new ReplaySubject(1); + private readonly _onShow: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for onDismiss + */ + get onDismiss(): Observable + { + return this._onDismiss.asObservable(); + } + + /** + * Getter for onShow + */ + get onShow(): Observable + { + return this._onShow.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Dismiss the alert + * + * @param name + */ + dismiss(name: string): void + { + // Return if the name is not provided + if ( !name ) + { + return; + } + + // Execute the observable + this._onDismiss.next(name); + } + + /** + * Show the dismissed alert + * + * @param name + */ + show(name: string): void + { + // Return if the name is not provided + if ( !name ) + { + return; + } + + // Execute the observable + this._onShow.next(name); + } + +} diff --git a/src/@fuse/components/alert/alert.types.ts b/src/@fuse/components/alert/alert.types.ts new file mode 100644 index 00000000..fc3516e1 --- /dev/null +++ b/src/@fuse/components/alert/alert.types.ts @@ -0,0 +1,15 @@ +export type FuseAlertAppearance = + | 'border' + | 'fill' + | 'outline' + | 'soft'; + +export type FuseAlertType = + | 'primary' + | 'accent' + | 'warn' + | 'basic' + | 'info' + | 'success' + | 'warning' + | 'error'; diff --git a/src/@fuse/components/alert/index.ts b/src/@fuse/components/alert/index.ts new file mode 100644 index 00000000..c18a807a --- /dev/null +++ b/src/@fuse/components/alert/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/alert/public-api'; diff --git a/src/@fuse/components/alert/public-api.ts b/src/@fuse/components/alert/public-api.ts new file mode 100644 index 00000000..fdf984ae --- /dev/null +++ b/src/@fuse/components/alert/public-api.ts @@ -0,0 +1,4 @@ +export * from '@fuse/components/alert/alert.component'; +export * from '@fuse/components/alert/alert.module'; +export * from '@fuse/components/alert/alert.service'; +export * from '@fuse/components/alert/alert.types'; diff --git a/src/@fuse/components/card/card.component.html b/src/@fuse/components/card/card.component.html new file mode 100644 index 00000000..5728d204 --- /dev/null +++ b/src/@fuse/components/card/card.component.html @@ -0,0 +1,30 @@ + + + + +
+ +
+ + +
+ +
+ +
+ + + + + + + + +
+ +
+ +
diff --git a/src/@fuse/components/card/card.component.scss b/src/@fuse/components/card/card.component.scss new file mode 100644 index 00000000..2e2719d0 --- /dev/null +++ b/src/@fuse/components/card/card.component.scss @@ -0,0 +1,63 @@ +fuse-card { + position: relative; + display: flex; + overflow: hidden; + @apply rounded-2xl shadow bg-card; + + /* Flippable */ + &.fuse-card-flippable { + border-radius: 0; + overflow: visible; + transform-style: preserve-3d; + transition: transform 1s; + perspective: 600px; + background: transparent; + @apply shadow-none; + + &.fuse-card-face-back { + + .fuse-card-front { + visibility: hidden; + opacity: 0; + transform: rotateY(180deg); + } + + .fuse-card-back { + visibility: visible; + opacity: 1; + transform: rotateY(360deg); + } + } + + .fuse-card-front, + .fuse-card-back { + display: flex; + flex-direction: column; + flex: 1 1 auto; + z-index: 10; + transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, opacity 0s ease-in 0.2s; + backface-visibility: hidden; + @apply rounded-2xl shadow bg-card; + } + + .fuse-card-front { + position: relative; + opacity: 1; + visibility: visible; + transform: rotateY(0deg); + overflow: hidden; + } + + .fuse-card-back { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0; + visibility: hidden; + transform: rotateY(180deg); + overflow: hidden auto; + } + } +} diff --git a/src/@fuse/components/card/card.component.ts b/src/@fuse/components/card/card.component.ts new file mode 100644 index 00000000..b8649a16 --- /dev/null +++ b/src/@fuse/components/card/card.component.ts @@ -0,0 +1,72 @@ +import { Component, HostBinding, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseCardFace } from '@fuse/components/card/card.types'; + +@Component({ + selector : 'fuse-card', + templateUrl : './card.component.html', + styleUrls : ['./card.component.scss'], + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations, + exportAs : 'fuseCard' +}) +export class FuseCardComponent implements OnChanges +{ + static ngAcceptInputType_expanded: BooleanInput; + static ngAcceptInputType_flippable: BooleanInput; + + @Input() expanded: boolean = false; + @Input() face: FuseCardFace = 'front'; + @Input() flippable: boolean = false; + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'fuse-card-expanded' : this.expanded, + 'fuse-card-face-back' : this.flippable && this.face === 'back', + 'fuse-card-face-front': this.flippable && this.face === 'front', + 'fuse-card-flippable' : this.flippable + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Expanded + if ( 'expanded' in changes ) + { + // Coerce the value to a boolean + this.expanded = coerceBooleanProperty(changes.expanded.currentValue); + } + + // Flippable + if ( 'flippable' in changes ) + { + // Coerce the value to a boolean + this.flippable = coerceBooleanProperty(changes.flippable.currentValue); + } + } +} diff --git a/src/@fuse/components/card/card.module.ts b/src/@fuse/components/card/card.module.ts new file mode 100644 index 00000000..c600e30c --- /dev/null +++ b/src/@fuse/components/card/card.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FuseCardComponent } from '@fuse/components/card/card.component'; + +@NgModule({ + declarations: [ + FuseCardComponent + ], + imports : [ + CommonModule + ], + exports : [ + FuseCardComponent + ] +}) +export class FuseCardModule +{ +} diff --git a/src/@fuse/components/card/card.types.ts b/src/@fuse/components/card/card.types.ts new file mode 100644 index 00000000..d9256426 --- /dev/null +++ b/src/@fuse/components/card/card.types.ts @@ -0,0 +1,3 @@ +export type FuseCardFace = + | 'front' + | 'back'; diff --git a/src/@fuse/components/card/index.ts b/src/@fuse/components/card/index.ts new file mode 100644 index 00000000..ac978a78 --- /dev/null +++ b/src/@fuse/components/card/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/card/public-api'; diff --git a/src/@fuse/components/card/public-api.ts b/src/@fuse/components/card/public-api.ts new file mode 100644 index 00000000..ee2ca6e8 --- /dev/null +++ b/src/@fuse/components/card/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/components/card/card.component'; +export * from '@fuse/components/card/card.module'; diff --git a/src/@fuse/components/date-range/date-range.component.html b/src/@fuse/components/date-range/date-range.component.html new file mode 100644 index 00000000..a6cf1a87 --- /dev/null +++ b/src/@fuse/components/date-range/date-range.component.html @@ -0,0 +1,101 @@ +
+ +
+
{{range.startDate}}
+
{{range.startTime}}
+
+ +
-
+ +
+
{{range.endDate}}
+
{{range.endTime}}
+
+ +
+ + + + +
+ +
+
+ +
{{getMonthLabel(1)}}
+
+ + +
+ + + + Start time + + +
+ + +
+ +
+
+
{{getMonthLabel(2)}}
+ +
+ + +
+ + + + End time + + +
+ +
diff --git a/src/@fuse/components/date-range/date-range.component.scss b/src/@fuse/components/date-range/date-range.component.scss new file mode 100644 index 00000000..fa657db9 --- /dev/null +++ b/src/@fuse/components/date-range/date-range.component.scss @@ -0,0 +1,292 @@ +/* Variables */ +$body-cell-padding: 2px; + +fuse-date-range { + display: flex; + + .range { + display: flex; + align-items: center; + height: 48px; + min-height: 48px; + max-height: 48px; + cursor: pointer; + + .start, + .end { + display: flex; + align-items: center; + height: 100%; + padding: 0 16px; + border-radius: 6px; + border-width: 1px; + line-height: 1; + @apply shadow-sm border-gray-300 dark:bg-black dark:bg-opacity-5 dark:border-gray-500; + + .date { + white-space: nowrap; + + + .time { + margin-left: 8px; + } + } + + .time { + white-space: nowrap; + } + } + + .separator { + margin: 0 2px; + + @screen sm { + margin: 0 12px; + } + } + } +} + +.fuse-date-range-panel { + border-radius: 4px; + padding: 24px; + @apply shadow-2xl bg-card; + + .start, + .end { + display: flex; + flex-direction: column; + + .month { + max-width: 196px; + min-width: 196px; + width: 196px; + + .month-header { + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: 32px; + margin-bottom: 16px; + + .previous-button, + .next-button { + position: absolute; + width: 24px !important; + height: 24px !important; + min-height: 24px !important; + max-height: 24px !important; + line-height: 24px !important; + + .mat-icon { + @apply icon-size-5; + } + } + + .previous-button { + left: 0; + } + + .next-button { + right: 0; + } + + .month-label { + font-weight: 500; + @apply text-secondary; + } + } + + mat-month-view { + display: flex; + min-height: 188px; + + .mat-calendar-table { + width: 100%; + border-collapse: collapse; + + tbody { + + tr { + + &[aria-hidden=true] { + display: none !important; + } + + &:first-child { + + td:first-child { + + &[aria-hidden=true] { + visibility: hidden; + pointer-events: none; + opacity: 0; + } + } + } + + td, + td:hover { + + &.fuse-date-range { + + &:before { + @apply bg-primary-200; + } + + .mat-calendar-body-cell-content { + background-color: transparent; + } + } + + &.fuse-date-range-start, + &.fuse-date-range-end { + + .mat-calendar-body-cell-content { + @apply bg-primary text-on-primary; + } + } + + .mat-calendar-body-today { + border: none; + } + } + + td.mat-calendar-body-cell { + width: 28px !important; + height: 28px !important; + padding: $body-cell-padding !important; + + &.fuse-date-range { + position: relative; + + &:before { + content: ''; + position: absolute; + top: $body-cell-padding; + right: 0; + bottom: $body-cell-padding; + left: 0; + } + + &.fuse-date-range-start { + + &:before { + left: $body-cell-padding; + border-radius: 999px 0 0 999px; + } + + &.fuse-date-range-end, + &:last-child { + + &:before { + right: $body-cell-padding; + border-radius: 999px; + } + } + } + + &.fuse-date-range-end { + + &:before { + right: $body-cell-padding; + border-radius: 0 999px 999px 0; + } + + &:first-child { + + &:before { + left: $body-cell-padding; + border-radius: 999px; + } + } + } + + &:first-child { + + &:before { + border-radius: 999px 0 0 999px; + } + } + + &:last-child { + + &:before { + border-radius: 0 999px 999px 0; + } + } + } + + .mat-calendar-body-cell-content { + position: relative; + top: 0; + left: 0; + width: 24px; + height: 24px; + font-size: 12px; + } + } + + td.mat-calendar-body-label { + + + td.mat-calendar-body-cell { + + &.fuse-date-range { + + &:before { + border-radius: 999px 0 0 999px; + } + + &.fuse-date-range-start { + + &.fuse-date-range-end { + border-radius: 999px; + } + } + + &.fuse-date-range-end { + + &:before { + left: $body-cell-padding; + border-radius: 999px; + } + } + } + } + } + } + } + } + } + } + + .time { + width: 100%; + max-width: 196px; + } + } + + .start { + align-items: flex-start; + margin-right: 20px; + + .month { + + .month-label { + margin-left: 8px; + } + } + } + + .end { + align-items: flex-end; + margin-left: 20px; + + .month { + + .month-label { + margin-right: 8px; + } + } + } +} diff --git a/src/@fuse/components/date-range/date-range.component.ts b/src/@fuse/components/date-range/date-range.component.ts new file mode 100644 index 00000000..a2e7aecc --- /dev/null +++ b/src/@fuse/components/date-range/date-range.component.ts @@ -0,0 +1,685 @@ +import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Input, OnDestroy, OnInit, Output, Renderer2, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; +import { Overlay } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { MatCalendarCellCssClasses, MatMonthView } from '@angular/material/datepicker'; +import { Subject } from 'rxjs'; +import * as moment from 'moment'; +import { Moment } from 'moment'; + +@Component({ + selector : 'fuse-date-range', + templateUrl : './date-range.component.html', + styleUrls : ['./date-range.component.scss'], + encapsulation: ViewEncapsulation.None, + exportAs : 'fuseDateRange', + providers : [ + { + provide : NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FuseDateRangeComponent), + multi : true + } + ] +}) +export class FuseDateRangeComponent implements ControlValueAccessor, OnInit, OnDestroy +{ + @Output() readonly rangeChanged: EventEmitter<{ start: string, end: string }> = new EventEmitter<{ start: string; end: string }>(); + @ViewChild('matMonthView1') private _matMonthView1: MatMonthView; + @ViewChild('matMonthView2') private _matMonthView2: MatMonthView; + @ViewChild('pickerPanelOrigin', {read: ElementRef}) private _pickerPanelOrigin: ElementRef; + @ViewChild('pickerPanel') private _pickerPanel: TemplateRef; + @HostBinding('class.fuse-date-range') private _defaultClassNames = true; + + activeDates: { month1: Moment | null, month2: Moment | null } = { + month1: null, + month2: null + }; + setWhichDate: 'start' | 'end' = 'start'; + startTimeFormControl: FormControl; + endTimeFormControl: FormControl; + private _dateFormat: string; + private _onChange: (value: any) => void; + private _onTouched: (value: any) => void; + private _programmaticChange!: boolean; + private _range: { start: Moment | null, end: Moment | null } = { + start: null, + end : null + }; + private _timeFormat: string; + private _timeRange: boolean; + private readonly _timeRegExp: RegExp = new RegExp('^(0[0-9]|1[0-9]|2[0-4]|[0-9]):([0-5][0-9])(A|(?:AM)|P|(?:PM))?$', 'i'); + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _elementRef: ElementRef, + private _overlay: Overlay, + private _renderer2: Renderer2, + private _viewContainerRef: ViewContainerRef + ) + { + this._onChange = () => { + }; + this._onTouched = () => { + }; + this.dateFormat = 'DD/MM/YYYY'; + this.timeFormat = '12'; + + // Initialize the component + this._init(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Setter & getter for dateFormat input + * + * @param value + */ + @Input() + set dateFormat(value: string) + { + // Return if the values are the same + if ( this._dateFormat === value ) + { + return; + } + + // Store the value + this._dateFormat = value; + } + + get dateFormat(): string + { + return this._dateFormat; + } + + /** + * Setter & getter for timeFormat input + * + * @param value + */ + @Input() + set timeFormat(value: string) + { + // Return if the values are the same + if ( this._timeFormat === value ) + { + return; + } + + // Set format based on the time format input + this._timeFormat = value === '12' ? 'hh:mmA' : 'HH:mm'; + } + + get timeFormat(): string + { + return this._timeFormat; + } + + /** + * Setter & getter for timeRange input + * + * @param value + */ + @Input() + set timeRange(value: boolean) + { + // Return if the values are the same + if ( this._timeRange === value ) + { + return; + } + + // Store the value + this._timeRange = value; + + // If the time range turned off... + if ( !value ) + { + this.range = { + start: this._range.start.clone().startOf('day'), + end : this._range.end.clone().endOf('day') + }; + } + } + + get timeRange(): boolean + { + return this._timeRange; + } + + /** + * Setter & getter for range input + * + * @param value + */ + @Input() + set range(value) + { + if ( !value ) + { + return; + } + + // Check if the value is an object and has 'start' and 'end' values + if ( !value.start || !value.end ) + { + console.error('Range input must have "start" and "end" properties!'); + + return; + } + + // Check if we are setting an individual date or both of them + const whichDate = value.whichDate || null; + + // Get the start and end dates as moment + const start = moment(value.start); + const end = moment(value.end); + + // If we are only setting the start date... + if ( whichDate === 'start' ) + { + // Set the start date + this._range.start = start.clone(); + + // If the selected start date is after the end date... + if ( this._range.start.isAfter(this._range.end) ) + { + // Set the end date to the start date but keep the end date's time + const endDate = start.clone().hours(this._range.end.hours()).minutes(this._range.end.minutes()).seconds(this._range.end.seconds()); + + // Test this new end date to see if it's ahead of the start date + if ( this._range.start.isBefore(endDate) ) + { + // If it's, set the new end date + this._range.end = endDate; + } + else + { + // Otherwise, set the end date same as the start date + this._range.end = start.clone(); + } + } + } + + // If we are only setting the end date... + if ( whichDate === 'end' ) + { + // Set the end date + this._range.end = end.clone(); + + // If the selected end date is before the start date... + if ( this._range.start.isAfter(this._range.end) ) + { + // Set the start date to the end date but keep the start date's time + const startDate = end.clone().hours(this._range.start.hours()).minutes(this._range.start.minutes()).seconds(this._range.start.seconds()); + + // Test this new end date to see if it's ahead of the start date + if ( this._range.end.isAfter(startDate) ) + { + // If it's, set the new start date + this._range.start = startDate; + } + else + { + // Otherwise, set the start date same as the end date + this._range.start = end.clone(); + } + } + } + + // If we are setting both dates... + if ( !whichDate ) + { + // Set the start date + this._range.start = start.clone(); + + // If the start date is before the end date, set the end date as normal. + // If the start date is after the end date, set the end date same as the start date. + this._range.end = start.isBefore(end) ? end.clone() : start.clone(); + } + + // Prepare another range object that holds the ISO formatted range dates + const range = { + start: this._range.start.clone().toISOString(), + end : this._range.end.clone().toISOString() + }; + + // Emit the range changed event with the range + this.rangeChanged.emit(range); + + // Update the model with the range if the change was not a programmatic change + // Because programmatic changes trigger writeValue which triggers onChange and onTouched + // internally causing them to trigger twice which breaks the form's pristine and touched + // statuses. + if ( !this._programmaticChange ) + { + this._onTouched(range); + this._onChange(range); + } + + // Set the active dates + this.activeDates = { + month1: this._range.start.clone(), + month2: this._range.start.clone().add(1, 'month') + }; + + // Set the time form controls + this.startTimeFormControl.setValue(this._range.start.clone().format(this._timeFormat).toString()); + this.endTimeFormControl.setValue(this._range.end.clone().format(this._timeFormat).toString()); + + // Run ngAfterContentInit on month views to trigger + // re-render on month views if they are available + if ( this._matMonthView1 && this._matMonthView2 ) + { + this._matMonthView1.ngAfterContentInit(); + this._matMonthView2.ngAfterContentInit(); + } + + // Reset the programmatic change status + this._programmaticChange = false; + } + + get range(): any + { + // Clone the range start and end + const start = this._range.start.clone(); + const end = this._range.end.clone(); + + // Build and return the range object + return { + startDate: start.clone().format(this.dateFormat), + startTime: this.timeRange ? start.clone().format(this.timeFormat) : null, + endDate : end.clone().format(this.dateFormat), + endTime : this.timeRange ? end.clone().format(this.timeFormat) : null + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Control Value Accessor + // ----------------------------------------------------------------------------------------------------- + + /** + * Update the form model on change + * + * @param fn + */ + registerOnChange(fn: any): void + { + this._onChange = fn; + } + + /** + * Update the form model on blur + * + * @param fn + */ + registerOnTouched(fn: any): void + { + this._onTouched = fn; + } + + /** + * Write to view from model when the form model changes programmatically + * + * @param range + */ + writeValue(range: { start: string, end: string }): void + { + // Set this change as a programmatic one + this._programmaticChange = true; + + // Set the range + this.range = range; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // @ TODO: Workaround until "angular/issues/20007" resolved + this.writeValue = () => { + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the picker panel + */ + openPickerPanel(): void + { + // Create the overlay + const overlayRef = this._overlay.create({ + panelClass : 'fuse-date-range-panel', + backdropClass : '', + hasBackdrop : true, + scrollStrategy : this._overlay.scrollStrategies.reposition(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._pickerPanelOrigin) + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top', + offsetY : 8 + }, + { + originX : 'start', + originY : 'top', + overlayX: 'start', + overlayY: 'bottom', + offsetY : -8 + } + ]) + }); + + // Create a portal from the template + const templatePortal = new TemplatePortal(this._pickerPanel, this._viewContainerRef); + + // On backdrop click + overlayRef.backdropClick().subscribe(() => { + + // If template portal exists and attached... + if ( templatePortal && templatePortal.isAttached ) + { + // Detach it + templatePortal.detach(); + } + + // If overlay exists and attached... + if ( overlayRef && overlayRef.hasAttached() ) + { + // Detach it + overlayRef.detach(); + overlayRef.dispose(); + } + }); + + // Attach the portal to the overlay + overlayRef.attach(templatePortal); + } + + /** + * Get month label + * + * @param month + */ + getMonthLabel(month: number): string + { + if ( month === 1 ) + { + return this.activeDates.month1.clone().format('MMMM Y'); + } + + return this.activeDates.month2.clone().format('MMMM Y'); + } + + /** + * Date class function to add/remove class names to calendar days + */ + dateClass(): any + { + return (date: Moment): MatCalendarCellCssClasses => { + + // If the date is both start and end date... + if ( date.isSame(this._range.start, 'day') && date.isSame(this._range.end, 'day') ) + { + return ['fuse-date-range', 'fuse-date-range-start', 'fuse-date-range-end']; + } + + // If the date is the start date... + if ( date.isSame(this._range.start, 'day') ) + { + return ['fuse-date-range', 'fuse-date-range-start']; + } + + // If the date is the end date... + if ( date.isSame(this._range.end, 'day') ) + { + return ['fuse-date-range', 'fuse-date-range-end']; + } + + // If the date is in between start and end dates... + if ( date.isBetween(this._range.start, this._range.end, 'day') ) + { + return ['fuse-date-range', 'fuse-date-range-mid']; + } + + return undefined; + }; + } + + /** + * Date filter to enable/disable calendar days + */ + dateFilter(): any + { + return (date: Moment): boolean => { + + // If we are selecting the end date, disable all the dates that comes before the start date + return !(this.setWhichDate === 'end' && date.isBefore(this._range.start, 'day')); + }; + } + + /** + * On selected date change + * + * @param date + */ + onSelectedDateChange(date: Moment): void + { + // Create a new range object + const newRange = { + start : this._range.start.clone().toISOString(), + end : this._range.end.clone().toISOString(), + whichDate: null + }; + + // Replace either the start or the end date with the new one + // depending on which date we are setting + if ( this.setWhichDate === 'start' ) + { + newRange.start = moment(newRange.start).year(date.year()).month(date.month()).date(date.date()).toISOString(); + } + else + { + newRange.end = moment(newRange.end).year(date.year()).month(date.month()).date(date.date()).toISOString(); + } + + // Append the which date to the new range object + newRange.whichDate = this.setWhichDate; + + // Switch which date to set on the next run + this.setWhichDate = this.setWhichDate === 'start' ? 'end' : 'start'; + + // Set the range + this.range = newRange; + } + + /** + * Go to previous month on both views + */ + prev(): void + { + this.activeDates.month1 = moment(this.activeDates.month1).subtract(1, 'month'); + this.activeDates.month2 = moment(this.activeDates.month2).subtract(1, 'month'); + } + + /** + * Go to next month on both views + */ + next(): void + { + this.activeDates.month1 = moment(this.activeDates.month1).add(1, 'month'); + this.activeDates.month2 = moment(this.activeDates.month2).add(1, 'month'); + } + + /** + * Update the start time + * + * @param event + */ + updateStartTime(event): void + { + // Parse the time + const parsedTime = this._parseTime(event.target.value); + + // Go back to the previous value if the form control is not valid + if ( this.startTimeFormControl.invalid ) + { + // Override the time + const time = this._range.start.clone().format(this._timeFormat); + + // Set the time + this.startTimeFormControl.setValue(time); + + // Do not update the range + return; + } + + // Append the new time to the start date + const startDate = this._range.start.clone().hours(parsedTime.hours()).minutes(parsedTime.minutes()); + + // If the new start date is after the current end date, + // use the end date's time and set the start date again + if ( startDate.isAfter(this._range.end) ) + { + const endDateHours = this._range.end.hours(); + const endDateMinutes = this._range.end.minutes(); + + // Set the start date + startDate.hours(endDateHours).minutes(endDateMinutes); + } + + // If everything is okay, set the new date + this.range = { + start : startDate.toISOString(), + end : this._range.end.clone().toISOString(), + whichDate: 'start' + }; + } + + /** + * Update the end time + * + * @param event + */ + updateEndTime(event): void + { + // Parse the time + const parsedTime = this._parseTime(event.target.value); + + // Go back to the previous value if the form control is not valid + if ( this.endTimeFormControl.invalid ) + { + // Override the time + const time = this._range.end.clone().format(this._timeFormat); + + // Set the time + this.endTimeFormControl.setValue(time); + + // Do not update the range + return; + } + + // Append the new time to the end date + const endDate = this._range.end.clone().hours(parsedTime.hours()).minutes(parsedTime.minutes()); + + // If the new end date is before the current start date, + // use the start date's time and set the end date again + if ( endDate.isBefore(this._range.start) ) + { + const startDateHours = this._range.start.hours(); + const startDateMinutes = this._range.start.minutes(); + + // Set the end date + endDate.hours(startDateHours).minutes(startDateMinutes); + } + + // If everything is okay, set the new date + this.range = { + start : this._range.start.clone().toISOString(), + end : endDate.toISOString(), + whichDate: 'end' + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void + { + // Start and end time form controls + this.startTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]); + this.endTimeFormControl = new FormControl('', [Validators.pattern(this._timeRegExp)]); + + // Set the default range + this._programmaticChange = true; + this.range = { + start: moment().startOf('day').toISOString(), + end : moment().add(1, 'day').endOf('day').toISOString() + }; + + // Set the default time range + this._programmaticChange = true; + this.timeRange = true; + } + + /** + * Parse the time from the inputs + * + * @param value + * @private + */ + private _parseTime(value: string): Moment + { + // Parse the time using the time regexp + const timeArr = value.split(this._timeRegExp).filter((part) => part !== ''); + + // Get the meridiem + const meridiem = timeArr[2] || null; + + // If meridiem exists... + if ( meridiem ) + { + // Create a moment using 12-hours format and return it + return moment(value, 'hh:mmA').seconds(0); + } + + // If meridiem doesn't exist, create a moment using 24-hours format and return in + return moment(value, 'HH:mm').seconds(0); + } +} diff --git a/src/@fuse/components/date-range/date-range.module.ts b/src/@fuse/components/date-range/date-range.module.ts new file mode 100644 index 00000000..76344d34 --- /dev/null +++ b/src/@fuse/components/date-range/date-range.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { FuseDateRangeComponent } from '@fuse/components/date-range/date-range.component'; + +@NgModule({ + declarations: [ + FuseDateRangeComponent + ], + imports : [ + CommonModule, + ReactiveFormsModule, + MatButtonModule, + MatDatepickerModule, + MatFormFieldModule, + MatInputModule, + MatIconModule, + MatMomentDateModule + ], + exports : [ + FuseDateRangeComponent + ] +}) +export class FuseDateRangeModule +{ +} diff --git a/src/@fuse/components/date-range/index.ts b/src/@fuse/components/date-range/index.ts new file mode 100644 index 00000000..fab54ec0 --- /dev/null +++ b/src/@fuse/components/date-range/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/date-range/public-api'; diff --git a/src/@fuse/components/date-range/public-api.ts b/src/@fuse/components/date-range/public-api.ts new file mode 100644 index 00000000..5d772a4d --- /dev/null +++ b/src/@fuse/components/date-range/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/components/date-range/date-range.component'; +export * from '@fuse/components/date-range/date-range.module'; diff --git a/src/@fuse/components/drawer/drawer.component.html b/src/@fuse/components/drawer/drawer.component.html new file mode 100644 index 00000000..b3a8acc4 --- /dev/null +++ b/src/@fuse/components/drawer/drawer.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/@fuse/components/drawer/drawer.component.scss b/src/@fuse/components/drawer/drawer.component.scss new file mode 100644 index 00000000..79a2938f --- /dev/null +++ b/src/@fuse/components/drawer/drawer.component.scss @@ -0,0 +1,131 @@ +/* Variables */ +$fuse-drawer-width: 320; + +fuse-drawer { + position: relative; + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: #{$fuse-drawer-width}px; + min-width: #{$fuse-drawer-width}px; + max-width: #{$fuse-drawer-width}px; + z-index: 300; + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .35); + @apply bg-card; + + /* Animations */ + &.fuse-drawer-animations-enabled { + transition-duration: 400ms; + transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + transition-property: visibility, margin-left, margin-right, transform, width, max-width, min-width; + + .fuse-drawer-content { + transition-duration: 400ms; + transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + transition-property: width, max-width, min-width; + } + } + + /* Over mode */ + &.fuse-drawer-mode-over { + position: absolute; + top: 0; + bottom: 0; + + /* Fixed mode */ + &.fuse-drawer-fixed { + position: fixed; + } + } + + /* Left position */ + &.fuse-drawer-position-left { + + /* Side mode */ + &.fuse-drawer-mode-side { + margin-left: -#{$fuse-drawer-width}px; + + &.fuse-drawer-opened { + margin-left: 0; + } + } + + /* Over mode */ + &.fuse-drawer-mode-over { + left: 0; + transform: translate3d(-100%, 0, 0); + + &.fuse-drawer-opened { + transform: translate3d(0, 0, 0); + } + } + + /* Content */ + .fuse-drawer-content { + left: 0; + } + } + + /* Right position */ + &.fuse-drawer-position-right { + + /* Side mode */ + &.fuse-drawer-mode-side { + margin-right: -#{$fuse-drawer-width}px; + + &.fuse-drawer-opened { + margin-right: 0; + } + } + + /* Over mode */ + &.fuse-drawer-mode-over { + right: 0; + transform: translate3d(100%, 0, 0); + + &.fuse-drawer-opened { + transform: translate3d(0, 0, 0); + } + } + + /* Content */ + .fuse-drawer-content { + right: 0; + } + } + + /* Content */ + .fuse-drawer-content { + position: absolute; + display: flex; + flex: 1 1 auto; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + overflow: hidden; + @apply bg-card; + } +} + +/* Overlay */ +.fuse-drawer-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 299; + opacity: 0; + background-color: rgba(0, 0, 0, 0.6); + + /* Fixed mode */ + &.fuse-drawer-overlay-fixed { + position: fixed; + } + + /* Transparent overlay */ + &.fuse-drawer-overlay-transparent { + background-color: transparent; + } +} diff --git a/src/@fuse/components/drawer/drawer.component.ts b/src/@fuse/components/drawer/drawer.component.ts new file mode 100644 index 00000000..e2dc0943 --- /dev/null +++ b/src/@fuse/components/drawer/drawer.component.ts @@ -0,0 +1,412 @@ +import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations'; +import { FuseDrawerMode, FuseDrawerPosition } from '@fuse/components/drawer/drawer.types'; +import { FuseDrawerService } from '@fuse/components/drawer/drawer.service'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; + +@Component({ + selector : 'fuse-drawer', + templateUrl : './drawer.component.html', + styleUrls : ['./drawer.component.scss'], + encapsulation: ViewEncapsulation.None, + exportAs : 'fuseDrawer' +}) +export class FuseDrawerComponent implements OnChanges, OnInit, OnDestroy +{ + static ngAcceptInputType_fixed: BooleanInput; + static ngAcceptInputType_opened: BooleanInput; + static ngAcceptInputType_transparentOverlay: BooleanInput; + + @Input() fixed: boolean = false; + @Input() mode: FuseDrawerMode = 'side'; + @Input() name: string = this._fuseUtilsService.randomId(); + @Input() opened: boolean = false; + @Input() position: FuseDrawerPosition = 'left'; + @Input() transparentOverlay: boolean = false; + @Output() readonly fixedChanged: EventEmitter = new EventEmitter(); + @Output() readonly modeChanged: EventEmitter = new EventEmitter(); + @Output() readonly openedChanged: EventEmitter = new EventEmitter(); + @Output() readonly positionChanged: EventEmitter = new EventEmitter(); + + private _animationsEnabled: boolean = false; + private _hovered: boolean = false; + private _overlay: HTMLElement; + private _player: AnimationPlayer; + + /** + * Constructor + */ + constructor( + private _animationBuilder: AnimationBuilder, + private _elementRef: ElementRef, + private _renderer2: Renderer2, + private _fuseDrawerService: FuseDrawerService, + private _fuseUtilsService: FuseUtilsService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'fuse-drawer-animations-enabled' : this._animationsEnabled, + 'fuse-drawer-fixed' : this.fixed, + 'fuse-drawer-hover' : this._hovered, + [`fuse-drawer-mode-${this.mode}`] : true, + 'fuse-drawer-opened' : this.opened, + [`fuse-drawer-position-${this.position}`]: true + }; + } + + /** + * Host binding for component inline styles + */ + @HostBinding('style') get styleList(): any + { + return { + 'visibility': this.opened ? 'visible' : 'hidden' + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Fixed + if ( 'fixed' in changes ) + { + // Coerce the value to a boolean + this.fixed = coerceBooleanProperty(changes.fixed.currentValue); + + // Execute the observable + this.fixedChanged.next(this.fixed); + } + + // Mode + if ( 'mode' in changes ) + { + // Get the previous and current values + const previousMode = changes.mode.previousValue; + const currentMode = changes.mode.currentValue; + + // Disable the animations + this._disableAnimations(); + + // If the mode changes: 'over -> side' + if ( previousMode === 'over' && currentMode === 'side' ) + { + // Hide the overlay + this._hideOverlay(); + } + + // If the mode changes: 'side -> over' + if ( previousMode === 'side' && currentMode === 'over' ) + { + // If the drawer is opened + if ( this.opened ) + { + // Show the overlay + this._showOverlay(); + } + } + + // Execute the observable + this.modeChanged.next(currentMode); + + // Enable the animations after a delay + // The delay must be bigger than the current transition-duration + // to make sure nothing will be animated while the mode is changing + setTimeout(() => { + this._enableAnimations(); + }, 500); + } + + // Opened + if ( 'opened' in changes ) + { + // Coerce the value to a boolean + const open = coerceBooleanProperty(changes.opened.currentValue); + + // Open/close the drawer + this._toggleOpened(open); + } + + // Position + if ( 'position' in changes ) + { + // Execute the observable + this.positionChanged.next(this.position); + } + + // Transparent overlay + if ( 'transparentOverlay' in changes ) + { + // Coerce the value to a boolean + this.transparentOverlay = coerceBooleanProperty(changes.transparentOverlay.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Register the drawer + this._fuseDrawerService.registerComponent(this.name, this); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Deregister the drawer from the registry + this._fuseDrawerService.deregisterComponent(this.name); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the drawer + */ + open(): void + { + // Return if the drawer has already opened + if ( this.opened ) + { + return; + } + + // Open the drawer + this._toggleOpened(true); + } + + /** + * Close the drawer + */ + close(): void + { + // Return if the drawer has already closed + if ( !this.opened ) + { + return; + } + + // Close the drawer + this._toggleOpened(false); + } + + /** + * Toggle the drawer + */ + toggle(): void + { + if ( this.opened ) + { + this.close(); + } + else + { + this.open(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Enable the animations + * + * @private + */ + private _enableAnimations(): void + { + // Return if the animations are already enabled + if ( this._animationsEnabled ) + { + return; + } + + // Enable the animations + this._animationsEnabled = true; + } + + /** + * Disable the animations + * + * @private + */ + private _disableAnimations(): void + { + // Return if the animations are already disabled + if ( !this._animationsEnabled ) + { + return; + } + + // Disable the animations + this._animationsEnabled = false; + } + + /** + * Show the backdrop + * + * @private + */ + private _showOverlay(): void + { + // Create the backdrop element + this._overlay = this._renderer2.createElement('div'); + + // Return if overlay couldn't be create for some reason + if ( !this._overlay ) + { + return; + } + + // Add a class to the backdrop element + this._overlay.classList.add('fuse-drawer-overlay'); + + // Add a class depending on the fixed option + if ( this.fixed ) + { + this._overlay.classList.add('fuse-drawer-overlay-fixed'); + } + + // Add a class depending on the transparentOverlay option + if ( this.transparentOverlay ) + { + this._overlay.classList.add('fuse-drawer-overlay-transparent'); + } + + // Append the backdrop to the parent of the drawer + this._renderer2.appendChild(this._elementRef.nativeElement.parentElement, this._overlay); + + // Create the enter animation and attach it to the player + this._player = this._animationBuilder.build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 1})) + ]).create(this._overlay); + + // Play the animation + this._player.play(); + + // Add an event listener to the overlay + this._overlay.addEventListener('click', () => { + this.close(); + }); + } + + /** + * Hide the backdrop + * + * @private + */ + private _hideOverlay(): void + { + if ( !this._overlay ) + { + return; + } + + // Create the leave animation and attach it to the player + this._player = this._animationBuilder.build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 0})) + ]).create(this._overlay); + + // Play the animation + this._player.play(); + + // Once the animation is done... + this._player.onDone(() => { + + // If the backdrop still exists... + if ( this._overlay ) + { + // Remove the backdrop + this._overlay.parentNode.removeChild(this._overlay); + this._overlay = null; + } + }); + } + + /** + * On mouseenter + * + * @private + */ + @HostListener('mouseenter') + private _onMouseenter(): void + { + // Enable the animations + this._enableAnimations(); + + // Set the hovered + this._hovered = true; + } + + /** + * On mouseleave + * + * @private + */ + @HostListener('mouseleave') + private _onMouseleave(): void + { + // Enable the animations + this._enableAnimations(); + + // Set the hovered + this._hovered = false; + } + + /** + * Open/close the drawer + * + * @param open + * @private + */ + private _toggleOpened(open: boolean): void + { + // Set the opened + this.opened = open; + + // Enable the animations + this._enableAnimations(); + + // If the mode is 'over' + if ( this.mode === 'over' ) + { + // If the drawer opens, show the overlay + if ( open ) + { + this._showOverlay(); + } + // Otherwise, close the overlay + else + { + this._hideOverlay(); + } + } + + // Execute the observable + this.openedChanged.next(open); + } +} diff --git a/src/@fuse/components/drawer/drawer.module.ts b/src/@fuse/components/drawer/drawer.module.ts new file mode 100644 index 00000000..d8383a07 --- /dev/null +++ b/src/@fuse/components/drawer/drawer.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FuseDrawerComponent } from '@fuse/components/drawer/drawer.component'; + +@NgModule({ + declarations: [ + FuseDrawerComponent + ], + imports : [ + CommonModule + ], + exports : [ + FuseDrawerComponent + ] +}) +export class FuseDrawerModule +{ +} diff --git a/src/@fuse/components/drawer/drawer.service.ts b/src/@fuse/components/drawer/drawer.service.ts new file mode 100644 index 00000000..7de348aa --- /dev/null +++ b/src/@fuse/components/drawer/drawer.service.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@angular/core'; +import { FuseDrawerComponent } from '@fuse/components/drawer/drawer.component'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseDrawerService +{ + private _componentRegistry: Map = new Map(); + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register drawer component + * + * @param name + * @param component + */ + registerComponent(name: string, component: FuseDrawerComponent): void + { + this._componentRegistry.set(name, component); + } + + /** + * Deregister drawer component + * + * @param name + */ + deregisterComponent(name: string): void + { + this._componentRegistry.delete(name); + } + + /** + * Get drawer component from the registry + * + * @param name + */ + getComponent(name: string): FuseDrawerComponent | undefined + { + return this._componentRegistry.get(name); + } +} diff --git a/src/@fuse/components/drawer/drawer.types.ts b/src/@fuse/components/drawer/drawer.types.ts new file mode 100644 index 00000000..40e2ee39 --- /dev/null +++ b/src/@fuse/components/drawer/drawer.types.ts @@ -0,0 +1,7 @@ +export type FuseDrawerMode = + | 'over' + | 'side'; + +export type FuseDrawerPosition = + | 'left' + | 'right'; diff --git a/src/@fuse/components/drawer/index.ts b/src/@fuse/components/drawer/index.ts new file mode 100644 index 00000000..3611d47d --- /dev/null +++ b/src/@fuse/components/drawer/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/drawer/public-api'; diff --git a/src/@fuse/components/drawer/public-api.ts b/src/@fuse/components/drawer/public-api.ts new file mode 100644 index 00000000..2439ec12 --- /dev/null +++ b/src/@fuse/components/drawer/public-api.ts @@ -0,0 +1,4 @@ +export * from '@fuse/components/drawer/drawer.component'; +export * from '@fuse/components/drawer/drawer.module'; +export * from '@fuse/components/drawer/drawer.service'; +export * from '@fuse/components/drawer/drawer.types'; diff --git a/src/@fuse/components/highlight/highlight.component.html b/src/@fuse/components/highlight/highlight.component.html new file mode 100644 index 00000000..da345b9b --- /dev/null +++ b/src/@fuse/components/highlight/highlight.component.html @@ -0,0 +1,9 @@ + + + + +
+
+
+
+ diff --git a/src/@fuse/components/highlight/highlight.component.scss b/src/@fuse/components/highlight/highlight.component.scss new file mode 100644 index 00000000..b433c6ff --- /dev/null +++ b/src/@fuse/components/highlight/highlight.component.scss @@ -0,0 +1,3 @@ +textarea[fuse-highlight] { + display: none; +} diff --git a/src/@fuse/components/highlight/highlight.component.ts b/src/@fuse/components/highlight/highlight.component.ts new file mode 100644 index 00000000..13923796 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.component.ts @@ -0,0 +1,132 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EmbeddedViewRef, Input, OnChanges, Renderer2, SecurityContext, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { FuseHighlightService } from '@fuse/components/highlight/highlight.service'; + +@Component({ + selector : 'textarea[fuse-highlight]', + templateUrl : './highlight.component.html', + styleUrls : ['./highlight.component.scss'], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'fuseHighlight' +}) +export class FuseHighlightComponent implements OnChanges, AfterViewInit +{ + @Input() code: string; + @Input() lang: string; + @ViewChild(TemplateRef) templateRef: TemplateRef; + + highlightedCode: string; + private _viewRef: EmbeddedViewRef; + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _domSanitizer: DomSanitizer, + private _elementRef: ElementRef, + private _renderer2: Renderer2, + private _fuseHighlightService: FuseHighlightService, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Code & Lang + if ( 'code' in changes || 'lang' in changes ) + { + // Return if the viewContainerRef is not available + if ( !this._viewContainerRef.length ) + { + return; + } + + // Highlight and insert the code + this._highlightAndInsert(); + } + } + + /** + * After view init + */ + ngAfterViewInit(): void + { + // Return if there is no language set + if ( !this.lang ) + { + return; + } + + // If there is no code input, get the code from + // the textarea + if ( !this.code ) + { + // Get the code + this.code = this._elementRef.nativeElement.value; + } + + // Highlight and insert + this._highlightAndInsert(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Highlight and insert the highlighted code + * + * @private + */ + private _highlightAndInsert(): void + { + // Return if the template reference is not available + if ( !this.templateRef ) + { + return; + } + + // Return if the code or language is not defined + if ( !this.code || !this.lang ) + { + return; + } + + // Destroy the component if there is already one + if ( this._viewRef ) + { + this._viewRef.destroy(); + this._viewRef = null; + } + + // Highlight and sanitize the code just in case + this.highlightedCode = this._domSanitizer.sanitize(SecurityContext.HTML, this._fuseHighlightService.highlight(this.code, this.lang)); + + // Return if the highlighted code is null + if ( this.highlightedCode === null ) + { + return; + } + + // Render and insert the template + this._viewRef = this._viewContainerRef.createEmbeddedView(this.templateRef, { + highlightedCode: this.highlightedCode, + lang : this.lang + }); + + // Detect the changes + this._viewRef.detectChanges(); + } +} diff --git a/src/@fuse/components/highlight/highlight.module.ts b/src/@fuse/components/highlight/highlight.module.ts new file mode 100644 index 00000000..a61149d1 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FuseHighlightComponent } from '@fuse/components/highlight/highlight.component'; + +@NgModule({ + declarations: [ + FuseHighlightComponent + ], + imports : [ + CommonModule + ], + exports : [ + FuseHighlightComponent + ] +}) +export class FuseHighlightModule +{ +} diff --git a/src/@fuse/components/highlight/highlight.service.ts b/src/@fuse/components/highlight/highlight.service.ts new file mode 100644 index 00000000..b97d64f7 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.service.ts @@ -0,0 +1,82 @@ +import { Injectable } from '@angular/core'; +import * as hljs from 'highlight.js'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseHighlightService +{ + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Highlight + */ + highlight(code: string, language: string): string + { + // Format the code + code = this._format(code); + + // Highlight and return the code + return hljs.highlight(code, {language}).value; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Remove the empty lines around the code block + * and re-align the indentation based on the first + * non-whitespace indented character + * + * @param code + * @private + */ + private _format(code: string): string + { + let indentation = 0; + + // Split the code into lines and store the lines + const lines = code.split('\n'); + + // Trim the empty lines around the code block + while ( lines.length && lines[0].trim() === '' ) + { + lines.shift(); + } + + while ( lines.length && lines[lines.length - 1].trim() === '' ) + { + lines.pop(); + } + + // Iterate through the lines + lines.filter((line) => line.length) + .forEach((line, index) => { + + // Always get the indentation of the first line so we can + // have something to compare with + if ( index === 0 ) + { + indentation = line.search(/\S|$/); + return; + } + + // Look at all the remaining lines to figure out the smallest indentation. + indentation = Math.min(line.search(/\S|$/), indentation); + }); + + // Iterate through the lines one more time, remove the extra + // indentation, join them together and return it + return lines.map((line) => line.substring(indentation)).join('\n'); + } +} diff --git a/src/@fuse/components/highlight/index.ts b/src/@fuse/components/highlight/index.ts new file mode 100644 index 00000000..46f52e2e --- /dev/null +++ b/src/@fuse/components/highlight/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/highlight/public-api'; diff --git a/src/@fuse/components/highlight/public-api.ts b/src/@fuse/components/highlight/public-api.ts new file mode 100644 index 00000000..15c2edc1 --- /dev/null +++ b/src/@fuse/components/highlight/public-api.ts @@ -0,0 +1,3 @@ +export * from '@fuse/components/highlight/highlight.component'; +export * from '@fuse/components/highlight/highlight.module'; +export * from '@fuse/components/highlight/highlight.service'; diff --git a/src/@fuse/components/navigation/horizontal/components/basic/basic.component.html b/src/@fuse/components/navigation/horizontal/components/basic/basic.component.html new file mode 100644 index 00000000..14f8acd9 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/basic/basic.component.html @@ -0,0 +1,111 @@ + +
+ + +
+ +
+ + + + + + + +
+ +
+ + +
+ +
+ + + + + + + +
+ +
+ + +
+ +
+ +
+ + + + + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+ +
diff --git a/src/@fuse/components/navigation/horizontal/components/basic/basic.component.ts b/src/@fuse/components/navigation/horizontal/components/basic/basic.component.ts new file mode 100644 index 00000000..8d4e2883 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/basic/basic.component.ts @@ -0,0 +1,63 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseHorizontalNavigationComponent } from '@fuse/components/navigation/horizontal/horizontal.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-horizontal-navigation-basic-item', + templateUrl : './basic.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseHorizontalNavigationBasicItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseHorizontalNavigationComponent: FuseHorizontalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseHorizontalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseHorizontalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/horizontal/components/branch/branch.component.html b/src/@fuse/components/navigation/horizontal/components/branch/branch.component.html new file mode 100644 index 00000000..29fd9350 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/branch/branch.component.html @@ -0,0 +1,115 @@ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ + + + +
+ +
+ + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+
+
+ +
diff --git a/src/@fuse/components/navigation/horizontal/components/branch/branch.component.ts b/src/@fuse/components/navigation/horizontal/components/branch/branch.component.ts new file mode 100644 index 00000000..26983272 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/branch/branch.component.ts @@ -0,0 +1,82 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { BooleanInput } from '@angular/cdk/coercion'; +import { MatMenu } from '@angular/material/menu'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseHorizontalNavigationComponent } from '@fuse/components/navigation/horizontal/horizontal.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-horizontal-navigation-branch-item', + templateUrl : './branch.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseHorizontalNavigationBranchItemComponent implements OnInit, OnDestroy +{ + static ngAcceptInputType_child: BooleanInput; + + @Input() child: boolean = false; + @Input() item: FuseNavigationItem; + @Input() name: string; + @ViewChild('matMenu', {static: true}) matMenu: MatMenu; + + private _fuseHorizontalNavigationComponent: FuseHorizontalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseHorizontalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseHorizontalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Trigger the change detection + */ + triggerChangeDetection(): void + { + // Mark for check + this._changeDetectorRef.markForCheck(); + } +} diff --git a/src/@fuse/components/navigation/horizontal/components/divider/divider.component.html b/src/@fuse/components/navigation/horizontal/components/divider/divider.component.html new file mode 100644 index 00000000..5675966a --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/divider/divider.component.html @@ -0,0 +1,4 @@ + +
diff --git a/src/@fuse/components/navigation/horizontal/components/divider/divider.component.ts b/src/@fuse/components/navigation/horizontal/components/divider/divider.component.ts new file mode 100644 index 00000000..6601023a --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/divider/divider.component.ts @@ -0,0 +1,63 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseHorizontalNavigationComponent } from '@fuse/components/navigation/horizontal/horizontal.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-horizontal-navigation-divider-item', + templateUrl : './divider.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseHorizontalNavigationDividerItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseHorizontalNavigationComponent: FuseHorizontalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseHorizontalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseHorizontalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.html b/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.html new file mode 100644 index 00000000..97fbd30f --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.html @@ -0,0 +1,4 @@ + +
diff --git a/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.ts b/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.ts new file mode 100644 index 00000000..f43fb652 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/components/spacer/spacer.component.ts @@ -0,0 +1,63 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseHorizontalNavigationComponent } from '@fuse/components/navigation/horizontal/horizontal.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-horizontal-navigation-spacer-item', + templateUrl : './spacer.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseHorizontalNavigationSpacerItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseHorizontalNavigationComponent: FuseHorizontalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseHorizontalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseHorizontalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/horizontal/horizontal.component.html b/src/@fuse/components/navigation/horizontal/horizontal.component.html new file mode 100644 index 00000000..6e5a326d --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/horizontal.component.html @@ -0,0 +1,33 @@ +
+ + + + + + + + + + + + + + + + + + + +
diff --git a/src/@fuse/components/navigation/horizontal/horizontal.component.scss b/src/@fuse/components/navigation/horizontal/horizontal.component.scss new file mode 100644 index 00000000..dc003054 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/horizontal.component.scss @@ -0,0 +1,180 @@ +/* Root navigation specific */ +fuse-horizontal-navigation { + + .fuse-horizontal-navigation-wrapper { + display: flex; + align-items: center; + + /* Basic, Branch */ + fuse-horizontal-navigation-basic-item, + fuse-horizontal-navigation-branch-item { + + @screen sm { + + &:hover { + + .fuse-horizontal-navigation-item-wrapper { + @apply bg-hover; + } + } + } + + .fuse-horizontal-navigation-item-wrapper { + border-radius: 4px; + overflow: hidden; + + .fuse-horizontal-navigation-item { + padding: 0 16px; + cursor: pointer; + user-select: none; + + .fuse-horizontal-navigation-item-icon { + margin-right: 12px; + } + } + } + } + + /* Basic - When item active (current link) */ + fuse-horizontal-navigation-basic-item { + + .fuse-horizontal-navigation-item-active, + .fuse-horizontal-navigation-item-active-forced { + + .fuse-horizontal-navigation-item-title { + @apply text-primary #{'!important'}; + } + + .fuse-horizontal-navigation-item-subtitle { + @apply text-primary-400 #{'!important'}; + + .dark & { + @apply text-primary-600 #{'!important'}; + } + } + + .fuse-horizontal-navigation-item-icon { + @apply text-primary #{'!important'}; + } + } + } + + /* Branch - When menu open */ + fuse-horizontal-navigation-branch-item { + + .fuse-horizontal-navigation-menu-active, + .fuse-horizontal-navigation-menu-active-forced { + + .fuse-horizontal-navigation-item-wrapper { + @apply bg-hover; + } + } + } + + /* Spacer */ + fuse-horizontal-navigation-spacer-item { + margin: 12px 0; + } + } +} + +/* Menu panel specific */ +.fuse-horizontal-navigation-menu-panel { + + .fuse-horizontal-navigation-menu-item { + height: auto; + min-height: 0; + line-height: normal; + white-space: normal; + + /* Basic, Branch */ + fuse-horizontal-navigation-basic-item, + fuse-horizontal-navigation-branch-item, + fuse-horizontal-navigation-divider-item { + display: flex; + flex: 1 1 auto; + } + + /* Divider */ + fuse-horizontal-navigation-divider-item { + margin: 8px -16px; + + .fuse-horizontal-navigation-item-wrapper { + height: 1px; + box-shadow: 0 1px 0 0; + } + } + } +} + +/* Navigation menu item common */ +.fuse-horizontal-navigation-menu-item { + + /* Basic - When item active (current link) */ + fuse-horizontal-navigation-basic-item { + + .fuse-horizontal-navigation-item-active, + .fuse-horizontal-navigation-item-active-forced { + + .fuse-horizontal-navigation-item-title { + @apply text-primary #{'!important'}; + } + + .fuse-horizontal-navigation-item-subtitle { + @apply text-primary-400 #{'!important'}; + + .dark & { + @apply text-primary-600 #{'!important'}; + } + } + + .fuse-horizontal-navigation-item-icon { + @apply text-primary #{'!important'}; + } + } + } + + .fuse-horizontal-navigation-item-wrapper { + width: 100%; + + &.fuse-horizontal-navigation-item-has-subtitle { + + .fuse-horizontal-navigation-item { + min-height: 56px; + } + } + + .fuse-horizontal-navigation-item { + position: relative; + display: flex; + align-items: center; + justify-content: flex-start; + min-height: 48px; + width: 100%; + font-size: 13px; + font-weight: 500; + text-decoration: none; + + .fuse-horizontal-navigation-item-title-wrapper { + + .fuse-horizontal-navigation-item-subtitle { + font-size: 12px; + } + } + + .fuse-horizontal-navigation-item-badge { + margin-left: auto; + + .fuse-horizontal-navigation-item-badge-content { + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 600; + white-space: nowrap; + height: 20px; + } + } + } + } +} diff --git a/src/@fuse/components/navigation/horizontal/horizontal.component.ts b/src/@fuse/components/navigation/horizontal/horizontal.component.ts new file mode 100644 index 00000000..094900c5 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/horizontal.component.ts @@ -0,0 +1,109 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { ReplaySubject, Subject } from 'rxjs'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; + +@Component({ + selector : 'fuse-horizontal-navigation', + templateUrl : './horizontal.component.html', + styleUrls : ['./horizontal.component.scss'], + animations : FuseAnimations, + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'fuseHorizontalNavigation' +}) +export class FuseHorizontalNavigationComponent implements OnChanges, OnInit, OnDestroy +{ + @Input() name: string = this._fuseUtilsService.randomId(); + @Input() navigation: FuseNavigationItem[]; + + onRefreshed: ReplaySubject = new ReplaySubject(1); + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService, + private _fuseUtilsService: FuseUtilsService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Navigation + if ( 'navigation' in changes ) + { + // Mark for check + this._changeDetectorRef.markForCheck(); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Make sure the name input is not an empty string + if ( this.name === '' ) + { + this.name = this._fuseUtilsService.randomId(); + } + + // Register the navigation component + this._fuseNavigationService.registerComponent(this.name, this); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Deregister the navigation component from the registry + this._fuseNavigationService.deregisterComponent(this.name); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Refresh the component to apply the changes + */ + refresh(): void + { + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Execute the observable + this.onRefreshed.next(true); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/@fuse/components/navigation/index.ts b/src/@fuse/components/navigation/index.ts new file mode 100644 index 00000000..2598d801 --- /dev/null +++ b/src/@fuse/components/navigation/index.ts @@ -0,0 +1 @@ +export * from '@fuse/components/navigation/public-api'; diff --git a/src/@fuse/components/navigation/navigation.module.ts b/src/@fuse/components/navigation/navigation.module.ts new file mode 100644 index 00000000..d93c6b7b --- /dev/null +++ b/src/@fuse/components/navigation/navigation.module.ts @@ -0,0 +1,55 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { FuseScrollbarModule } from '@fuse/directives/scrollbar/public-api'; +import { FuseHorizontalNavigationBasicItemComponent } from '@fuse/components/navigation/horizontal/components/basic/basic.component'; +import { FuseHorizontalNavigationBranchItemComponent } from '@fuse/components/navigation/horizontal/components/branch/branch.component'; +import { FuseHorizontalNavigationDividerItemComponent } from '@fuse/components/navigation/horizontal/components/divider/divider.component'; +import { FuseHorizontalNavigationSpacerItemComponent } from '@fuse/components/navigation/horizontal/components/spacer/spacer.component'; +import { FuseHorizontalNavigationComponent } from '@fuse/components/navigation/horizontal/horizontal.component'; +import { FuseVerticalNavigationAsideItemComponent } from '@fuse/components/navigation/vertical/components/aside/aside.component'; +import { FuseVerticalNavigationBasicItemComponent } from '@fuse/components/navigation/vertical/components/basic/basic.component'; +import { FuseVerticalNavigationCollapsableItemComponent } from '@fuse/components/navigation/vertical/components/collapsable/collapsable.component'; +import { FuseVerticalNavigationDividerItemComponent } from '@fuse/components/navigation/vertical/components/divider/divider.component'; +import { FuseVerticalNavigationGroupItemComponent } from '@fuse/components/navigation/vertical/components/group/group.component'; +import { FuseVerticalNavigationSpacerItemComponent } from '@fuse/components/navigation/vertical/components/spacer/spacer.component'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; + +@NgModule({ + declarations: [ + FuseHorizontalNavigationBasicItemComponent, + FuseHorizontalNavigationBranchItemComponent, + FuseHorizontalNavigationDividerItemComponent, + FuseHorizontalNavigationSpacerItemComponent, + FuseHorizontalNavigationComponent, + FuseVerticalNavigationAsideItemComponent, + FuseVerticalNavigationBasicItemComponent, + FuseVerticalNavigationCollapsableItemComponent, + FuseVerticalNavigationDividerItemComponent, + FuseVerticalNavigationGroupItemComponent, + FuseVerticalNavigationSpacerItemComponent, + FuseVerticalNavigationComponent + ], + imports : [ + CommonModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + MatTooltipModule, + FuseScrollbarModule + ], + exports : [ + FuseHorizontalNavigationComponent, + FuseVerticalNavigationComponent + ] +}) +export class FuseNavigationModule +{ +} diff --git a/src/@fuse/components/navigation/navigation.service.ts b/src/@fuse/components/navigation/navigation.service.ts new file mode 100644 index 00000000..8d195c41 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.service.ts @@ -0,0 +1,188 @@ +import { Injectable } from '@angular/core'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseNavigationService +{ + private _componentRegistry: Map = new Map(); + private _navigationStore: Map = new Map(); + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register navigation component + * + * @param name + * @param component + */ + registerComponent(name: string, component: any): void + { + this._componentRegistry.set(name, component); + } + + /** + * Deregister navigation component + * + * @param name + */ + deregisterComponent(name: string): void + { + this._componentRegistry.delete(name); + } + + /** + * Get navigation component from the registry + * + * @param name + */ + getComponent(name: string): any + { + return this._componentRegistry.get(name); + } + + /** + * Store the given navigation with the given key + * + * @param key + * @param navigation + */ + storeNavigation(key: string, navigation: FuseNavigationItem[]): void + { + // Add to the store + this._navigationStore.set(key, navigation); + } + + /** + * Get navigation from storage by key + * + * @param key + * @returns {any} + */ + getNavigation(key: string): FuseNavigationItem[] + { + return this._navigationStore.get(key) ?? []; + } + + /** + * Delete the navigation from the storage + * + * @param key + */ + deleteNavigation(key: string): void + { + // Check if the navigation exists + if ( !this._navigationStore.has(key) ) + { + console.warn(`Navigation with the key '${key}' does not exist in the store.`); + } + + // Delete from the storage + this._navigationStore.delete(key); + } + + /** + * Utility function that returns a flattened + * version of the given navigation array + * + * @param navigation + * @param flatNavigation + * @returns {FuseNavigationItem[]} + */ + getFlatNavigation(navigation: FuseNavigationItem[], flatNavigation: FuseNavigationItem[] = []): FuseNavigationItem[] + { + for ( const item of navigation ) + { + if ( item.type === 'basic' ) + { + flatNavigation.push(item); + continue; + } + + if ( item.type === 'aside' || item.type === 'collapsable' || item.type === 'group' ) + { + if ( item.children ) + { + this.getFlatNavigation(item.children, flatNavigation); + } + } + } + + return flatNavigation; + } + + /** + * Utility function that returns the item + * with the given id from given navigation + * + * @param id + * @param navigation + */ + getItem(id: string, navigation: FuseNavigationItem[]): FuseNavigationItem | null + { + for ( const item of navigation ) + { + if ( item.id === id ) + { + return item; + } + + if ( item.children ) + { + const childItem = this.getItem(id, item.children); + + if ( childItem ) + { + return childItem; + } + } + } + + return null; + } + + /** + * Utility function that returns the item's parent + * with the given id from given navigation + * + * @param id + * @param navigation + * @param parent + */ + getItemParent( + id: string, + navigation: FuseNavigationItem[], + parent: FuseNavigationItem[] | FuseNavigationItem + ): FuseNavigationItem[] | FuseNavigationItem | null + { + for ( const item of navigation ) + { + if ( item.id === id ) + { + return parent; + } + + if ( item.children ) + { + const childItem = this.getItemParent(id, item.children, item); + + if ( childItem ) + { + return childItem; + } + } + } + + return null; + } +} diff --git a/src/@fuse/components/navigation/navigation.types.ts b/src/@fuse/components/navigation/navigation.types.ts new file mode 100644 index 00000000..2d729842 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.types.ts @@ -0,0 +1,47 @@ +export interface FuseNavigationItem +{ + id?: string; + title?: string; + subtitle?: string; + type: + | 'aside' + | 'basic' + | 'collapsable' + | 'divider' + | 'group' + | 'spacer'; + hidden?: (item: FuseNavigationItem) => boolean; + active?: boolean; + disabled?: boolean; + link?: string; + externalLink?: boolean; + exactMatch?: boolean; + function?: (item: FuseNavigationItem) => void; + classes?: { + title?: string; + subtitle?: string; + icon?: string; + wrapper?: string; + }; + icon?: string; + badge?: { + title?: string; + classes?: string; + }; + children?: FuseNavigationItem[]; + meta?: any; +} + +export type FuseVerticalNavigationAppearance = + | 'default' + | 'compact' + | 'dense' + | 'thin'; + +export type FuseVerticalNavigationMode = + | 'over' + | 'side'; + +export type FuseVerticalNavigationPosition = + | 'left' + | 'right'; diff --git a/src/@fuse/components/navigation/public-api.ts b/src/@fuse/components/navigation/public-api.ts new file mode 100644 index 00000000..032e3ef6 --- /dev/null +++ b/src/@fuse/components/navigation/public-api.ts @@ -0,0 +1,5 @@ +export * from '@fuse/components/navigation/horizontal/horizontal.component'; +export * from '@fuse/components/navigation/vertical/vertical.component'; +export * from '@fuse/components/navigation/navigation.module'; +export * from '@fuse/components/navigation/navigation.service'; +export * from '@fuse/components/navigation/navigation.types'; diff --git a/src/@fuse/components/navigation/vertical/components/aside/aside.component.html b/src/@fuse/components/navigation/vertical/components/aside/aside.component.html new file mode 100644 index 00000000..c78997cb --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/aside/aside.component.html @@ -0,0 +1,96 @@ +
+ +
+ + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+ +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
diff --git a/src/@fuse/components/navigation/vertical/components/aside/aside.component.ts b/src/@fuse/components/navigation/vertical/components/aside/aside.component.ts new file mode 100644 index 00000000..b4d332a1 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/aside/aside.component.ts @@ -0,0 +1,186 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { BooleanInput } from '@angular/cdk/coercion'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-vertical-navigation-aside-item', + templateUrl : './aside.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationAsideItemComponent implements OnChanges, OnInit, OnDestroy +{ + static ngAcceptInputType_autoCollapse: BooleanInput; + static ngAcceptInputType_skipChildren: BooleanInput; + + @Input() activeItemId: string; + @Input() autoCollapse: boolean; + @Input() item: FuseNavigationItem; + @Input() name: string; + @Input() skipChildren: boolean; + + active: boolean = false; + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _router: Router, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Active item id + if ( 'activeItemId' in changes ) + { + // Mark if active + this._markIfActive(this._router.url); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Mark if active + this._markIfActive(this._router.url); + + // Attach a listener to the NavigationEnd event + this._router.events + .pipe( + filter((event): event is NavigationEnd => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe((event: NavigationEnd) => { + + // Mark if active + this._markIfActive(event.urlAfterRedirects); + }); + + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Check if the given item has the given url + * in one of its children + * + * @param item + * @param currentUrl + * @private + */ + private _hasActiveChild(item: FuseNavigationItem, currentUrl: string): boolean + { + const children = item.children; + + if ( !children ) + { + return false; + } + + for ( const child of children ) + { + if ( child.children ) + { + if ( this._hasActiveChild(child, currentUrl) ) + { + return true; + } + } + + // Skip items other than 'basic' + if ( child.type !== 'basic' ) + { + continue; + } + + // Check if the child has a link and is active + if ( child.link && this._router.isActive(child.link, child.exactMatch || false) ) + { + return true; + } + } + + return false; + } + + /** + * Decide and mark if the item is active + * + * @private + */ + private _markIfActive(currentUrl: string): void + { + // Check if the activeItemId is equals to this item id + this.active = this.activeItemId === this.item.id; + + // If the aside has a children that is active, + // always mark it as active + if ( this._hasActiveChild(this.item, currentUrl) ) + { + this.active = true; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/@fuse/components/navigation/vertical/components/basic/basic.component.html b/src/@fuse/components/navigation/vertical/components/basic/basic.component.html new file mode 100644 index 00000000..364215c1 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/basic/basic.component.html @@ -0,0 +1,110 @@ + +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+ + + + + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+ +
diff --git a/src/@fuse/components/navigation/vertical/components/basic/basic.component.ts b/src/@fuse/components/navigation/vertical/components/basic/basic.component.ts new file mode 100644 index 00000000..8fad0032 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/basic/basic.component.ts @@ -0,0 +1,65 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; + +@Component({ + selector : 'fuse-vertical-navigation-basic-item', + templateUrl : './basic.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationBasicItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService, + private _fuseUtilsService: FuseUtilsService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.html b/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.html new file mode 100644 index 00000000..bd8df37a --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.html @@ -0,0 +1,99 @@ +
+ +
+ + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+ + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.ts b/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.ts new file mode 100644 index 00000000..dbf81b68 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/collapsable/collapsable.component.ts @@ -0,0 +1,346 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { BooleanInput } from '@angular/cdk/coercion'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-vertical-navigation-collapsable-item', + templateUrl : './collapsable.component.html', + styles : [], + animations : FuseAnimations, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationCollapsableItemComponent implements OnInit, OnDestroy +{ + static ngAcceptInputType_autoCollapse: BooleanInput; + + @Input() autoCollapse: boolean; + @Input() item: FuseNavigationItem; + @Input() name: string; + + isCollapsed: boolean = true; + isExpanded: boolean = false; + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _router: Router, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'fuse-vertical-navigation-item-collapsed': this.isCollapsed, + 'fuse-vertical-navigation-item-expanded' : this.isExpanded + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // If the item has a children that has a matching url with the current url, expand... + if ( this._hasActiveChild(this.item, this._router.url) ) + { + this.expand(); + } + // Otherwise... + else + { + // If the autoCollapse is on, collapse... + if ( this.autoCollapse ) + { + this.collapse(); + } + } + + // Listen for the onCollapsableItemCollapsed from the service + this._fuseVerticalNavigationComponent.onCollapsableItemCollapsed + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((collapsedItem) => { + + // Check if the collapsed item is null + if ( collapsedItem === null ) + { + return; + } + + // Collapse if this is a children of the collapsed item + if ( this._isChildrenOf(collapsedItem, this.item) ) + { + this.collapse(); + } + }); + + // Listen for the onCollapsableItemExpanded from the service if the autoCollapse is on + if ( this.autoCollapse ) + { + this._fuseVerticalNavigationComponent.onCollapsableItemExpanded + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((expandedItem) => { + + // Check if the expanded item is null + if ( expandedItem === null ) + { + return; + } + + // Check if this is a parent of the expanded item + if ( this._isChildrenOf(this.item, expandedItem) ) + { + return; + } + + // Check if this has a children with a matching url with the current active url + if ( this._hasActiveChild(this.item, this._router.url) ) + { + return; + } + + // Check if this is the expanded item + if ( this.item === expandedItem ) + { + return; + } + + // If none of the above conditions are matched, collapse this item + this.collapse(); + }); + } + + // Attach a listener to the NavigationEnd event + this._router.events + .pipe( + filter((event): event is NavigationEnd => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe((event: NavigationEnd) => { + + // If the item has a children that has a matching url with the current url, expand... + if ( this._hasActiveChild(this.item, event.urlAfterRedirects) ) + { + this.expand(); + } + // Otherwise... + else + { + // If the autoCollapse is on, collapse... + if ( this.autoCollapse ) + { + this.collapse(); + } + } + }); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Check if the given item has the given url + * in one of its children + * + * @param item + * @param currentUrl + * @private + */ + private _hasActiveChild(item: FuseNavigationItem, currentUrl: string): boolean + { + const children = item.children; + + if ( !children ) + { + return false; + } + + for ( const child of children ) + { + if ( child.children ) + { + if ( this._hasActiveChild(child, currentUrl) ) + { + return true; + } + } + + // Check if the child has a link and is active + if ( child.link && this._router.isActive(child.link, child.exactMatch || false) ) + { + return true; + } + } + + return false; + } + + /** + * Check if this is a children + * of the given item + * + * @param parent + * @param item + * @return {boolean} + * @private + */ + private _isChildrenOf(parent: FuseNavigationItem, item: FuseNavigationItem): boolean + { + const children = parent.children; + + if ( !children ) + { + return false; + } + + if ( children.indexOf(item) > -1 ) + { + return true; + } + + for ( const child of children ) + { + if ( child.children ) + { + if ( this._isChildrenOf(child, item) ) + { + return true; + } + } + } + + return false; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Collapse + */ + collapse(): void + { + // Return if the item is disabled + if ( this.item.disabled ) + { + return; + } + + // Return if the item is already collapsed + if ( this.isCollapsed ) + { + return; + } + + // Collapse it + this.isCollapsed = true; + this.isExpanded = !this.isCollapsed; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Execute the observable + this._fuseVerticalNavigationComponent.onCollapsableItemCollapsed.next(this.item); + } + + /** + * Expand + */ + expand(): void + { + // Return if the item is disabled + if ( this.item.disabled ) + { + return; + } + + // Return if the item is already expanded + if ( !this.isCollapsed ) + { + return; + } + + // Expand it + this.isCollapsed = false; + this.isExpanded = !this.isCollapsed; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Execute the observable + this._fuseVerticalNavigationComponent.onCollapsableItemExpanded.next(this.item); + } + + /** + * Toggle collapsable + */ + toggleCollapsable(): void + { + // Toggle collapse/expand + if ( this.isCollapsed ) + { + this.expand(); + } + else + { + this.collapse(); + } + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/@fuse/components/navigation/vertical/components/divider/divider.component.html b/src/@fuse/components/navigation/vertical/components/divider/divider.component.html new file mode 100644 index 00000000..f786705f --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/divider/divider.component.html @@ -0,0 +1,4 @@ + +
diff --git a/src/@fuse/components/navigation/vertical/components/divider/divider.component.ts b/src/@fuse/components/navigation/vertical/components/divider/divider.component.ts new file mode 100644 index 00000000..d5178ee6 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/divider/divider.component.ts @@ -0,0 +1,63 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-vertical-navigation-divider-item', + templateUrl : './divider.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationDividerItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/vertical/components/group/group.component.html b/src/@fuse/components/navigation/vertical/components/group/group.component.html new file mode 100644 index 00000000..1322ddb7 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/group/group.component.html @@ -0,0 +1,85 @@ + +
+ +
+ + + + + +
+
+ + {{item.title}} + +
+
+ + {{item.subtitle}} + +
+
+ + +
+
+ {{item.badge.title}} +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/@fuse/components/navigation/vertical/components/group/group.component.ts b/src/@fuse/components/navigation/vertical/components/group/group.component.ts new file mode 100644 index 00000000..d9145b98 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/group/group.component.ts @@ -0,0 +1,82 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { BooleanInput } from '@angular/cdk/coercion'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-vertical-navigation-group-item', + templateUrl : './group.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationGroupItemComponent implements OnInit, OnDestroy +{ + static ngAcceptInputType_autoCollapse: BooleanInput; + + @Input() autoCollapse: boolean; + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.html b/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.html new file mode 100644 index 00000000..719ed674 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.html @@ -0,0 +1,4 @@ + +
diff --git a/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.ts b/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.ts new file mode 100644 index 00000000..ca927031 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/components/spacer/spacer.component.ts @@ -0,0 +1,63 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseVerticalNavigationComponent } from '@fuse/components/navigation/vertical/vertical.component'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'fuse-vertical-navigation-spacer-item', + templateUrl : './spacer.component.html', + styles : [], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseVerticalNavigationSpacerItemComponent implements OnInit, OnDestroy +{ + @Input() item: FuseNavigationItem; + @Input() name: string; + + private _fuseVerticalNavigationComponent: FuseVerticalNavigationComponent; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the parent navigation component + this._fuseVerticalNavigationComponent = this._fuseNavigationService.getComponent(this.name); + + // Subscribe to onRefreshed on the navigation component + this._fuseVerticalNavigationComponent.onRefreshed.pipe( + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/vertical/styles/appearances/compact.scss b/src/@fuse/components/navigation/vertical/styles/appearances/compact.scss new file mode 100644 index 00000000..056a81e4 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/styles/appearances/compact.scss @@ -0,0 +1,110 @@ +/* Variables */ +$fuse-vertical-navigation-compact-width: 112; + +fuse-vertical-navigation { + + /* Compact appearance overrides */ + &.fuse-vertical-navigation-appearance-compact { + width: #{$fuse-vertical-navigation-compact-width}px; + min-width: #{$fuse-vertical-navigation-compact-width}px; + max-width: #{$fuse-vertical-navigation-compact-width}px; + + /* Left positioned */ + &.fuse-vertical-navigation-position-left { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-left: -#{$fuse-vertical-navigation-compact-width}px; + } + + /* Opened */ + &.fuse-vertical-navigation-opened { + margin-left: 0; + } + } + + /* Right positioned */ + &.fuse-vertical-navigation-position-right { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-right: -#{$fuse-vertical-navigation-compact-width}px; + } + + /* Opened */ + &.fuse-vertical-navigation-opened { + margin-right: 0; + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + left: auto; + right: #{$fuse-vertical-navigation-compact-width}px; + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + + /* Content */ + .fuse-vertical-navigation-content { + + > fuse-vertical-navigation-aside-item, + > fuse-vertical-navigation-basic-item { + + .fuse-vertical-navigation-item-wrapper { + margin: 4px 8px 0 8px; + + .fuse-vertical-navigation-item { + flex-direction: column; + justify-content: center; + padding: 12px; + border-radius: 6px; + + .fuse-vertical-navigation-item-icon { + margin-right: 0; + } + + .fuse-vertical-navigation-item-title-wrapper { + margin-top: 8px; + + .fuse-vertical-navigation-item-title { + font-size: 12px; + font-weight: 500; + text-align: center; + line-height: 16px; + } + + .fuse-vertical-navigation-item-subtitle { + display: none !important; + } + } + + .fuse-vertical-navigation-item-badge { + position: absolute; + top: 12px; + left: 64px; + } + } + } + + > fuse-vertical-navigation-collapsable-item { + display: none + } + + > fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + display: none + } + } + } + } + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + left: #{$fuse-vertical-navigation-compact-width}px; + } + } +} diff --git a/src/@fuse/components/navigation/vertical/styles/appearances/default.scss b/src/@fuse/components/navigation/vertical/styles/appearances/default.scss new file mode 100644 index 00000000..9c3580ca --- /dev/null +++ b/src/@fuse/components/navigation/vertical/styles/appearances/default.scss @@ -0,0 +1,591 @@ +/* Variables */ +$fuse-vertical-navigation-width: 280; + +fuse-vertical-navigation { + position: sticky; + display: flex; + flex-direction: column; + flex: 1 0 auto; + top: 0; + width: #{$fuse-vertical-navigation-width}px; + min-width: #{$fuse-vertical-navigation-width}px; + max-width: #{$fuse-vertical-navigation-width}px; + height: 100vh; + min-height: 100vh; + max-height: 100vh; + z-index: 200; + + /* ----------------------------------------------------------------------------------------------------- */ + /* @ Navigation Drawer + /* ----------------------------------------------------------------------------------------------------- */ + + /* Animations */ + &.fuse-vertical-navigation-animations-enabled { + transition-duration: 400ms; + transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + transition-property: visibility, margin-left, margin-right, transform, width, max-width, min-width; + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + transition-duration: 400ms; + transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + transition-property: width, max-width, min-width; + } + } + + /* Over mode */ + &.fuse-vertical-navigation-mode-over { + position: fixed; + top: 0; + bottom: 0; + } + + /* Left position */ + &.fuse-vertical-navigation-position-left { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-left: -#{$fuse-vertical-navigation-width}px; + + &.fuse-vertical-navigation-opened { + margin-left: 0; + } + } + + /* Over mode */ + &.fuse-vertical-navigation-mode-over { + left: 0; + transform: translate3d(-100%, 0, 0); + + &.fuse-vertical-navigation-opened { + transform: translate3d(0, 0, 0); + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + left: 0; + } + } + + /* Right position */ + &.fuse-vertical-navigation-position-right { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-right: -#{$fuse-vertical-navigation-width}px; + + &.fuse-vertical-navigation-opened { + margin-right: 0; + } + } + + /* Over mode */ + &.fuse-vertical-navigation-mode-over { + right: 0; + transform: translate3d(100%, 0, 0); + + &.fuse-vertical-navigation-opened { + transform: translate3d(0, 0, 0); + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + right: 0; + } + } + + /* Inner mode */ + &.fuse-vertical-navigation-inner { + position: relative; + width: auto; + min-width: 0; + max-width: none; + height: auto; + min-height: 0; + max-height: none; + box-shadow: none; + + .fuse-vertical-navigation-wrapper { + position: relative; + overflow: visible; + height: auto; + + .fuse-vertical-navigation-content { + overflow: visible !important; + } + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + position: absolute; + display: flex; + flex: 1 1 auto; + flex-direction: column; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 10; + background: inherit; + box-shadow: inset -1px 0 0 var(--fuse-border); + + /* Header */ + .fuse-vertical-navigation-header { + + } + + /* Content */ + .fuse-vertical-navigation-content { + flex: 1 1 auto; + overflow-x: hidden; + overflow-y: auto; + overscroll-behavior: contain; + + /* Divider */ + > fuse-vertical-navigation-divider-item { + margin: 24px 0; + } + + /* Group */ + > fuse-vertical-navigation-group-item { + margin-top: 24px; + } + } + + /* Footer */ + .fuse-vertical-navigation-footer { + + } + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + position: absolute; + display: flex; + flex: 1 1 auto; + flex-direction: column; + top: 0; + bottom: 0; + left: #{$fuse-vertical-navigation-width}px; + width: #{$fuse-vertical-navigation-width}px; + height: 100%; + z-index: 5; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + transition-duration: 400ms; + transition-property: left, right; + transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + background: inherit; + + > fuse-vertical-navigation-aside-item { + padding: 24px 0; + + /* First item of the aside */ + > .fuse-vertical-navigation-item-wrapper { + display: none !important; + } + } + } + + &.fuse-vertical-navigation-position-right { + + .fuse-vertical-navigation-aside-wrapper { + left: auto; + right: #{$fuse-vertical-navigation-width}px; + } + } + + /* ----------------------------------------------------------------------------------------------------- */ + /* @ Navigation Items + /* ----------------------------------------------------------------------------------------------------- */ + + /* Navigation items common */ + fuse-vertical-navigation-aside-item, + fuse-vertical-navigation-basic-item, + fuse-vertical-navigation-collapsable-item, + fuse-vertical-navigation-divider-item, + fuse-vertical-navigation-group-item, + fuse-vertical-navigation-spacer-item { + display: flex; + flex-direction: column; + flex: 1 0 auto; + user-select: none; + + .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + position: relative; + display: flex; + align-items: center; + justify-content: flex-start; + padding: 10px 16px; + font-size: 13px; + font-weight: 500; + line-height: 20px; + text-decoration: none; + border-radius: 6px; + + /* Disabled state */ + &.fuse-vertical-navigation-item-disabled { + cursor: default; + opacity: 0.4; + } + + .fuse-vertical-navigation-item-icon { + margin-right: 16px; + } + + .fuse-vertical-navigation-item-title-wrapper { + + .fuse-vertical-navigation-item-subtitle { + font-size: 11px; + line-height: 1.5; + } + } + + .fuse-vertical-navigation-item-badge { + margin-left: auto; + + .fuse-vertical-navigation-item-badge-content { + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + font-weight: 600; + white-space: nowrap; + height: 20px; + } + } + } + } + } + + /* Aside, Basic, Collapsable, Group */ + fuse-vertical-navigation-aside-item, + fuse-vertical-navigation-basic-item, + fuse-vertical-navigation-collapsable-item, + fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + margin: 0 12px; + } + } + + /* Aside, Basic, Collapsable */ + fuse-vertical-navigation-aside-item, + fuse-vertical-navigation-basic-item, + fuse-vertical-navigation-collapsable-item { + margin-bottom: 4px; + + .fuse-vertical-navigation-item { + cursor: pointer; + } + } + + /* Aside */ + fuse-vertical-navigation-aside-item { + + } + + /* Basic */ + fuse-vertical-navigation-basic-item { + + } + + /* Collapsable */ + fuse-vertical-navigation-collapsable-item { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-badge { + + + .fuse-vertical-navigation-item-arrow { + margin-left: 8px; + } + } + + .fuse-vertical-navigation-item-arrow { + height: 20px; + line-height: 20px; + margin-left: auto; + transition: transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1), + color 375ms cubic-bezier(0.25, 0.8, 0.25, 1); + } + } + } + + &.fuse-vertical-navigation-item-expanded { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-arrow { + transform: rotate(90deg); + } + } + } + } + + > .fuse-vertical-navigation-item-children { + + > *:last-child { + padding-bottom: 6px; + + > .fuse-vertical-navigation-item-children { + + > *:last-child { + padding-bottom: 0; + } + } + } + + .fuse-vertical-navigation-item { + padding: 10px 16px; + } + } + + /* 1st level */ + .fuse-vertical-navigation-item-children { + overflow: hidden; + + .fuse-vertical-navigation-item { + padding-left: 56px; + } + + /* 2nd level */ + .fuse-vertical-navigation-item-children { + + .fuse-vertical-navigation-item { + padding-left: 72px; + } + + /* 3rd level */ + .fuse-vertical-navigation-item-children { + + .fuse-vertical-navigation-item { + padding-left: 88px; + } + + /* 4th level */ + .fuse-vertical-navigation-item-children { + + .fuse-vertical-navigation-item { + padding-left: 104px; + } + } + } + } + } + } + + /* Divider */ + fuse-vertical-navigation-divider-item { + margin: 12px 0; + + .fuse-vertical-navigation-item-wrapper { + height: 1px; + box-shadow: 0 1px 0 0; + } + } + + /* Group */ + fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-badge, + .fuse-vertical-navigation-item-icon { + display: none !important; + } + + .fuse-vertical-navigation-item-title-wrapper { + + .fuse-vertical-navigation-item-title { + font-size: 12px; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; + } + } + } + } + } + + /* Spacer */ + fuse-vertical-navigation-spacer-item { + margin: 6px 0; + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Overlay +/* ----------------------------------------------------------------------------------------------------- */ +.fuse-vertical-navigation-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 170; + opacity: 0; + background-color: rgba(0, 0, 0, 0.6); + + + .fuse-vertical-navigation-aside-overlay { + background-color: transparent; + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Aside overlay +/* ----------------------------------------------------------------------------------------------------- */ +.fuse-vertical-navigation-aside-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 169; + opacity: 0; + background-color: rgba(0, 0, 0, 0.3); +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Navigation Items Colors +/* ----------------------------------------------------------------------------------------------------- */ + +/* Navigation items common */ +fuse-vertical-navigation-aside-item, +fuse-vertical-navigation-basic-item, +fuse-vertical-navigation-collapsable-item, +fuse-vertical-navigation-group-item { + + .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + color: currentColor; + + .fuse-vertical-navigation-item-icon { + @apply text-current opacity-60; + } + + .fuse-vertical-navigation-item-title-wrapper { + + .fuse-vertical-navigation-item-title { + @apply text-current opacity-80; + } + + .fuse-vertical-navigation-item-subtitle { + @apply text-current opacity-50; + } + } + } + } +} + +/* Aside, Basic, Collapsable */ +fuse-vertical-navigation-aside-item, +fuse-vertical-navigation-basic-item, +fuse-vertical-navigation-collapsable-item { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + /* Active state */ + &:not(.fuse-vertical-navigation-item-disabled) { + + &.fuse-vertical-navigation-item-active, + &.fuse-vertical-navigation-item-active-forced { + @apply bg-gray-800 bg-opacity-5 dark:bg-white dark:bg-opacity-12; + + .fuse-vertical-navigation-item-icon { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-title { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-subtitle { + @apply opacity-100; + } + } + } + + /* Hover state */ + &:not(.fuse-vertical-navigation-item-active-forced):not(.fuse-vertical-navigation-item-active):not(.fuse-vertical-navigation-item-disabled) { + + &:hover { + @apply bg-gray-800 bg-opacity-5 dark:bg-white dark:bg-opacity-12; + + .fuse-vertical-navigation-item-icon { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-title, + .fuse-vertical-navigation-item-arrow { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-subtitle { + @apply opacity-100; + } + } + } + } + } +} + +/* Collapsable */ +fuse-vertical-navigation-collapsable-item { + + /* Expanded state */ + &.fuse-vertical-navigation-item-expanded { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-icon { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-title, + .fuse-vertical-navigation-item-arrow { + @apply opacity-100; + } + + .fuse-vertical-navigation-item-subtitle { + @apply opacity-100; + } + } + } + } +} + +/* Group */ +fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-title-wrapper { + + .fuse-vertical-navigation-item-title { + @apply opacity-100 text-primary-600 dark:text-primary-400; + } + } + } + } +} diff --git a/src/@fuse/components/navigation/vertical/styles/appearances/dense.scss b/src/@fuse/components/navigation/vertical/styles/appearances/dense.scss new file mode 100644 index 00000000..34790fcb --- /dev/null +++ b/src/@fuse/components/navigation/vertical/styles/appearances/dense.scss @@ -0,0 +1,189 @@ +/* Variables */ +$fuse-vertical-navigation-width: 280; +$fuse-vertical-navigation-dense-width: 80; + +fuse-vertical-navigation { + + /* Dense appearance overrides */ + &.fuse-vertical-navigation-appearance-dense { + + &:not(.fuse-vertical-navigation-mode-over) { + width: #{$fuse-vertical-navigation-dense-width}px; + min-width: #{$fuse-vertical-navigation-dense-width}px; + max-width: #{$fuse-vertical-navigation-dense-width}px; + + /* Left positioned */ + &.fuse-vertical-navigation-position-left { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-left: -#{$fuse-vertical-navigation-dense-width}px; + } + + /* Opened */ + &.fuse-vertical-navigation-opened { + margin-left: 0; + } + } + + /* Right positioned */ + &.fuse-vertical-navigation-position-right { + + /* Side mode */ + &.fuse-vertical-navigation-mode-side { + margin-right: -#{$fuse-vertical-navigation-dense-width}px; + } + + /* Opened */ + &.fuse-vertical-navigation-opened { + margin-right: 0; + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + left: auto; + right: #{$fuse-vertical-navigation-dense-width}px; + } + + &.fuse-vertical-navigation-hover { + + .fuse-vertical-navigation-aside-wrapper { + left: auto; + right: #{$fuse-vertical-navigation-width}px; + } + } + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + + /* Content */ + .fuse-vertical-navigation-content { + + fuse-vertical-navigation-aside-item, + fuse-vertical-navigation-basic-item, + fuse-vertical-navigation-collapsable-item, + fuse-vertical-navigation-group-item { + + .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + width: #{$fuse-vertical-navigation-width}px - 24px; + min-width: #{$fuse-vertical-navigation-width}px - 24px; + max-width: #{$fuse-vertical-navigation-width}px - 24px; + + .fuse-vertical-navigation-item-arrow, + .fuse-vertical-navigation-item-badge, + .fuse-vertical-navigation-item-title-wrapper { + transition: opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1); + } + } + } + } + + fuse-vertical-navigation-group-item { + + &:first-of-type { + margin-top: 0; + } + } + } + } + + &:not(.fuse-vertical-navigation-hover):not(.fuse-vertical-navigation-mode-over) { + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + + /* Content */ + .fuse-vertical-navigation-content { + + .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + padding: 10px 16px; + + .fuse-vertical-navigation-item-arrow, + .fuse-vertical-navigation-item-badge, + .fuse-vertical-navigation-item-title-wrapper { + white-space: nowrap; + opacity: 0; + } + } + } + + fuse-vertical-navigation-collapsable-item { + + .fuse-vertical-navigation-item-children { + display: none; + } + } + + fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + &:before { + content: ''; + position: absolute; + top: 20px; + width: 23px; + border-top-width: 2px; + } + } + } + } + } + } + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + left: #{$fuse-vertical-navigation-dense-width}px; + } + + /* Hover */ + &.fuse-vertical-navigation-hover { + + .fuse-vertical-navigation-wrapper { + width: #{$fuse-vertical-navigation-width}px; + + .fuse-vertical-navigation-content { + + .fuse-vertical-navigation-item-wrapper { + + .fuse-vertical-navigation-item { + + .fuse-vertical-navigation-item-arrow, + .fuse-vertical-navigation-item-badge, + .fuse-vertical-navigation-item-title-wrapper { + white-space: nowrap; + animation: removeWhiteSpaceNoWrap 1ms linear 350ms; + animation-fill-mode: forwards; + } + } + } + } + } + + .fuse-vertical-navigation-aside-wrapper { + left: #{$fuse-vertical-navigation-width}px; + } + } + } +} + +@keyframes removeWhiteSpaceNoWrap { + 0% { + white-space: nowrap + } + 99% { + white-space: nowrap + } + 100% { + white-space: normal; + } +} diff --git a/src/@fuse/components/navigation/vertical/styles/appearances/thin.scss b/src/@fuse/components/navigation/vertical/styles/appearances/thin.scss new file mode 100644 index 00000000..47c2bf79 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/styles/appearances/thin.scss @@ -0,0 +1,97 @@ +/* Variables */ +$fuse-vertical-navigation-thin-width: 80; + +fuse-vertical-navigation { + + /* Thin appearance overrides */ + &.fuse-vertical-navigation-appearance-thin { + width: #{$fuse-vertical-navigation-thin-width}px; + min-width: #{$fuse-vertical-navigation-thin-width}px; + max-width: #{$fuse-vertical-navigation-thin-width}px; + + /* Left positioned */ + &.fuse-vertical-navigation-position-left { + + &.fuse-vertical-navigation-mode-side { + margin-left: -#{$fuse-vertical-navigation-thin-width}px; + } + + &.fuse-vertical-navigation-opened { + margin-left: 0; + } + } + + /* Right positioned */ + &.fuse-vertical-navigation-position-right { + + &.fuse-vertical-navigation-mode-side { + margin-right: -#{$fuse-vertical-navigation-thin-width}px; + } + + &.fuse-vertical-navigation-opened { + margin-right: 0; + } + + .fuse-vertical-navigation-aside-wrapper { + left: auto; + right: #{$fuse-vertical-navigation-thin-width}px; + } + } + + /* Wrapper */ + .fuse-vertical-navigation-wrapper { + + /* Content */ + .fuse-vertical-navigation-content { + + > fuse-vertical-navigation-aside-item, + > fuse-vertical-navigation-basic-item { + flex-direction: column; + justify-content: center; + height: 64px; + min-height: 64px; + max-height: 64px; + padding: 0 16px; + + .fuse-vertical-navigation-item-wrapper { + display: flex; + align-items: center; + justify-content: center; + + .fuse-vertical-navigation-item { + justify-content: center; + padding: 12px; + border-radius: 4px; + + .fuse-vertical-navigation-item-icon { + margin: 0; + } + + .fuse-vertical-navigation-item-arrow, + .fuse-vertical-navigation-item-badge-content, + .fuse-vertical-navigation-item-title-wrapper { + display: none; + } + } + } + } + + > fuse-vertical-navigation-collapsable-item { + display: none + } + + > fuse-vertical-navigation-group-item { + + > .fuse-vertical-navigation-item-wrapper { + display: none + } + } + } + } + + /* Aside wrapper */ + .fuse-vertical-navigation-aside-wrapper { + left: #{$fuse-vertical-navigation-thin-width}px; + } + } +} diff --git a/src/@fuse/components/navigation/vertical/vertical.component.html b/src/@fuse/components/navigation/vertical/vertical.component.html new file mode 100644 index 00000000..79def1f9 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/vertical.component.html @@ -0,0 +1,114 @@ +
+ + +
+ +
+ + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + + + + + + + + + + + + +
diff --git a/src/@fuse/components/navigation/vertical/vertical.component.scss b/src/@fuse/components/navigation/vertical/vertical.component.scss new file mode 100644 index 00000000..8a50cef9 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/vertical.component.scss @@ -0,0 +1,4 @@ +@import 'styles/appearances/default'; +@import 'styles/appearances/compact'; +@import 'styles/appearances/dense'; +@import 'styles/appearances/thin'; diff --git a/src/@fuse/components/navigation/vertical/vertical.component.ts b/src/@fuse/components/navigation/vertical/vertical.component.ts new file mode 100644 index 00000000..88efb054 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/vertical.component.ts @@ -0,0 +1,736 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, QueryList, Renderer2, SimpleChanges, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core'; +import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations'; +import { NavigationEnd, Router } from '@angular/router'; +import { ScrollStrategy, ScrollStrategyOptions } from '@angular/cdk/overlay'; +import { merge, ReplaySubject, Subject, Subscription } from 'rxjs'; +import { delay, filter, takeUntil } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseNavigationItem, FuseVerticalNavigationAppearance, FuseVerticalNavigationMode, FuseVerticalNavigationPosition } from '@fuse/components/navigation/navigation.types'; +import { FuseNavigationService } from '@fuse/components/navigation/navigation.service'; +import { FuseScrollbarDirective } from '@fuse/directives/scrollbar/scrollbar.directive'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; + +@Component({ + selector : 'fuse-vertical-navigation', + templateUrl : './vertical.component.html', + styleUrls : ['./vertical.component.scss'], + animations : FuseAnimations, + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'fuseVerticalNavigation' +}) +export class FuseVerticalNavigationComponent implements OnChanges, OnInit, AfterViewInit, OnDestroy +{ + static ngAcceptInputType_inner: BooleanInput; + static ngAcceptInputType_opened: BooleanInput; + static ngAcceptInputType_transparentOverlay: BooleanInput; + + @Input() appearance: FuseVerticalNavigationAppearance = 'default'; + @Input() autoCollapse: boolean = true; + @Input() inner: boolean = false; + @Input() mode: FuseVerticalNavigationMode = 'side'; + @Input() name: string = this._fuseUtilsService.randomId(); + @Input() navigation: FuseNavigationItem[]; + @Input() opened: boolean = true; + @Input() position: FuseVerticalNavigationPosition = 'left'; + @Input() transparentOverlay: boolean = false; + @Output() readonly appearanceChanged: EventEmitter = new EventEmitter(); + @Output() readonly modeChanged: EventEmitter = new EventEmitter(); + @Output() readonly openedChanged: EventEmitter = new EventEmitter(); + @Output() readonly positionChanged: EventEmitter = new EventEmitter(); + @ViewChild('navigationContent') private _navigationContentEl: ElementRef; + + activeAsideItemId: string | null = null; + onCollapsableItemCollapsed: ReplaySubject = new ReplaySubject(1); + onCollapsableItemExpanded: ReplaySubject = new ReplaySubject(1); + onRefreshed: ReplaySubject = new ReplaySubject(1); + private _animationsEnabled: boolean = false; + private _asideOverlay: HTMLElement; + private readonly _handleAsideOverlayClick: any; + private readonly _handleOverlayClick: any; + private _hovered: boolean = false; + private _overlay: HTMLElement; + private _player: AnimationPlayer; + private _scrollStrategy: ScrollStrategy = this._scrollStrategyOptions.block(); + private _fuseScrollbarDirectives!: QueryList; + private _fuseScrollbarDirectivesSubscription: Subscription; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _animationBuilder: AnimationBuilder, + private _changeDetectorRef: ChangeDetectorRef, + private _elementRef: ElementRef, + private _renderer2: Renderer2, + private _router: Router, + private _scrollStrategyOptions: ScrollStrategyOptions, + private _fuseNavigationService: FuseNavigationService, + private _fuseUtilsService: FuseUtilsService + ) + { + this._handleAsideOverlayClick = () => { + this.closeAside(); + }; + this._handleOverlayClick = () => { + this.close(); + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'fuse-vertical-navigation-animations-enabled' : this._animationsEnabled, + [`fuse-vertical-navigation-appearance-${this.appearance}`]: true, + 'fuse-vertical-navigation-hover' : this._hovered, + 'fuse-vertical-navigation-inner' : this.inner, + 'fuse-vertical-navigation-mode-over' : this.mode === 'over', + 'fuse-vertical-navigation-mode-side' : this.mode === 'side', + 'fuse-vertical-navigation-opened' : this.opened, + 'fuse-vertical-navigation-position-left' : this.position === 'left', + 'fuse-vertical-navigation-position-right' : this.position === 'right' + }; + } + + /** + * Host binding for component inline styles + */ + @HostBinding('style') get styleList(): any + { + return { + 'visibility': this.opened ? 'visible' : 'hidden' + }; + } + + /** + * Setter for fuseScrollbarDirectives + */ + @ViewChildren(FuseScrollbarDirective) + set fuseScrollbarDirectives(fuseScrollbarDirectives: QueryList) + { + // Store the directives + this._fuseScrollbarDirectives = fuseScrollbarDirectives; + + // Return if there are no directives + if ( fuseScrollbarDirectives.length === 0 ) + { + return; + } + + // Unsubscribe the previous subscriptions + if ( this._fuseScrollbarDirectivesSubscription ) + { + this._fuseScrollbarDirectivesSubscription.unsubscribe(); + } + + // Update the scrollbars on collapsable items' collapse/expand + this._fuseScrollbarDirectivesSubscription = + merge( + this.onCollapsableItemCollapsed, + this.onCollapsableItemExpanded + ) + .pipe( + takeUntil(this._unsubscribeAll), + delay(250) + ) + .subscribe(() => { + + // Loop through the scrollbars and update them + fuseScrollbarDirectives.forEach((fuseScrollbarDirective) => { + fuseScrollbarDirective.update(); + }); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Appearance + if ( 'appearance' in changes ) + { + // Execute the observable + this.appearanceChanged.next(changes.appearance.currentValue); + } + + // Inner + if ( 'inner' in changes ) + { + // Coerce the value to a boolean + this.inner = coerceBooleanProperty(changes.inner.currentValue); + } + + // Mode + if ( 'mode' in changes ) + { + // Get the previous and current values + const currentMode = changes.mode.currentValue; + const previousMode = changes.mode.previousValue; + + // Disable the animations + this._disableAnimations(); + + // If the mode changes: 'over -> side' + if ( previousMode === 'over' && currentMode === 'side' ) + { + // Hide the overlay + this._hideOverlay(); + } + + // If the mode changes: 'side -> over' + if ( previousMode === 'side' && currentMode === 'over' ) + { + // Close the aside + this.closeAside(); + + // If the navigation is opened + if ( this.opened ) + { + // Show the overlay + this._showOverlay(); + } + } + + // Execute the observable + this.modeChanged.next(currentMode); + + // Enable the animations after a delay + // The delay must be bigger than the current transition-duration + // to make sure nothing will be animated while the mode changing + setTimeout(() => { + this._enableAnimations(); + }, 500); + } + + // Navigation + if ( 'navigation' in changes ) + { + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + // Opened + if ( 'opened' in changes ) + { + // Coerce the value to a boolean + this.opened = coerceBooleanProperty(changes.opened.currentValue); + + // Open/close the navigation + this._toggleOpened(this.opened); + } + + // Position + if ( 'position' in changes ) + { + // Execute the observable + this.positionChanged.next(changes.position.currentValue); + } + + // Transparent overlay + if ( 'transparentOverlay' in changes ) + { + // Coerce the value to a boolean + this.transparentOverlay = coerceBooleanProperty(changes.transparentOverlay.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Make sure the name input is not an empty string + if ( this.name === '' ) + { + this.name = this._fuseUtilsService.randomId(); + } + + // Register the navigation component + this._fuseNavigationService.registerComponent(this.name, this); + + // Subscribe to the 'NavigationEnd' event + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + + // If the mode is 'over' and the navigation is opened... + if ( this.mode === 'over' && this.opened ) + { + // Close the navigation + this.close(); + } + + // If the mode is 'side' and the aside is active... + if ( this.mode === 'side' && this.activeAsideItemId ) + { + // Close the aside + this.closeAside(); + } + }); + } + + /** + * After view init + */ + ngAfterViewInit(): void + { + setTimeout(() => { + + // Return if 'navigation content' element does not exist + if ( !this._navigationContentEl ) + { + return; + } + + // If 'navigation content' element doesn't have + // perfect scrollbar activated on it... + if ( !this._navigationContentEl.nativeElement.classList.contains('ps') ) + { + // Find the active item + const activeItem = this._navigationContentEl.nativeElement.querySelector('.fuse-vertical-navigation-item-active'); + + // If the active item exists, scroll it into view + if ( activeItem ) + { + activeItem.scrollIntoView(); + } + } + // Otherwise + else + { + // Go through all the scrollbar directives + this._fuseScrollbarDirectives.forEach((fuseScrollbarDirective) => { + + // Skip if not enabled + if ( !fuseScrollbarDirective.isEnabled() ) + { + return; + } + + // Scroll to the active element + fuseScrollbarDirective.scrollToElement('.fuse-vertical-navigation-item-active', -120, true); + }); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Deregister the navigation component from the registry + this._fuseNavigationService.deregisterComponent(this.name); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Refresh the component to apply the changes + */ + refresh(): void + { + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Execute the observable + this.onRefreshed.next(true); + } + + /** + * Open the navigation + */ + open(): void + { + // Return if the navigation is already open + if ( this.opened ) + { + return; + } + + // Set the opened + this._toggleOpened(true); + } + + /** + * Close the navigation + */ + close(): void + { + // Return if the navigation is already closed + if ( !this.opened ) + { + return; + } + + // Close the aside + this.closeAside(); + + // Set the opened + this._toggleOpened(false); + } + + /** + * Toggle the navigation + */ + toggle(): void + { + // Toggle + if ( this.opened ) + { + this.close(); + } + else + { + this.open(); + } + } + + /** + * Open the aside + * + * @param item + */ + openAside(item: FuseNavigationItem): void + { + // Return if the item is disabled + if ( item.disabled || !item.id ) + { + return; + } + + // Open + this.activeAsideItemId = item.id; + + // Show the aside overlay + this._showAsideOverlay(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Close the aside + */ + closeAside(): void + { + // Close + this.activeAsideItemId = null; + + // Hide the aside overlay + this._hideAsideOverlay(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle the aside + * + * @param item + */ + toggleAside(item: FuseNavigationItem): void + { + // Toggle + if ( this.activeAsideItemId === item.id ) + { + this.closeAside(); + } + else + { + this.openAside(item); + } + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Enable the animations + * + * @private + */ + private _enableAnimations(): void + { + // Return if the animations are already enabled + if ( this._animationsEnabled ) + { + return; + } + + // Enable the animations + this._animationsEnabled = true; + } + + /** + * Disable the animations + * + * @private + */ + private _disableAnimations(): void + { + // Return if the animations are already disabled + if ( !this._animationsEnabled ) + { + return; + } + + // Disable the animations + this._animationsEnabled = false; + } + + /** + * Show the overlay + * + * @private + */ + private _showOverlay(): void + { + // Return if there is already an overlay + if ( this._asideOverlay ) + { + return; + } + + // Create the overlay element + this._overlay = this._renderer2.createElement('div'); + + // Add a class to the overlay element + this._overlay.classList.add('fuse-vertical-navigation-overlay'); + + // Add a class depending on the transparentOverlay option + if ( this.transparentOverlay ) + { + this._overlay.classList.add('fuse-vertical-navigation-overlay-transparent'); + } + + // Append the overlay to the parent of the navigation + this._renderer2.appendChild(this._elementRef.nativeElement.parentElement, this._overlay); + + // Enable block scroll strategy + this._scrollStrategy.enable(); + + // Create the enter animation and attach it to the player + this._player = this._animationBuilder.build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 1})) + ]).create(this._overlay); + + // Play the animation + this._player.play(); + + // Add an event listener to the overlay + this._overlay.addEventListener('click', this._handleOverlayClick); + } + + /** + * Hide the overlay + * + * @private + */ + private _hideOverlay(): void + { + if ( !this._overlay ) + { + return; + } + + // Create the leave animation and attach it to the player + this._player = this._animationBuilder.build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 0})) + ]).create(this._overlay); + + // Play the animation + this._player.play(); + + // Once the animation is done... + this._player.onDone(() => { + + // If the overlay still exists... + if ( this._overlay ) + { + // Remove the event listener + this._overlay.removeEventListener('click', this._handleOverlayClick); + + // Remove the overlay + this._overlay.parentNode.removeChild(this._overlay); + this._overlay = null; + } + + // Disable block scroll strategy + this._scrollStrategy.disable(); + }); + } + + /** + * Show the aside overlay + * + * @private + */ + private _showAsideOverlay(): void + { + // Return if there is already an overlay + if ( this._asideOverlay ) + { + return; + } + + // Create the aside overlay element + this._asideOverlay = this._renderer2.createElement('div'); + + // Add a class to the aside overlay element + this._asideOverlay.classList.add('fuse-vertical-navigation-aside-overlay'); + + // Append the aside overlay to the parent of the navigation + this._renderer2.appendChild(this._elementRef.nativeElement.parentElement, this._asideOverlay); + + // Create the enter animation and attach it to the player + this._player = + this._animationBuilder + .build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 1})) + ]).create(this._asideOverlay); + + // Play the animation + this._player.play(); + + // Add an event listener to the aside overlay + this._asideOverlay.addEventListener('click', this._handleAsideOverlayClick); + } + + /** + * Hide the aside overlay + * + * @private + */ + private _hideAsideOverlay(): void + { + if ( !this._asideOverlay ) + { + return; + } + + // Create the leave animation and attach it to the player + this._player = + this._animationBuilder + .build([ + animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 0})) + ]).create(this._asideOverlay); + + // Play the animation + this._player.play(); + + // Once the animation is done... + this._player.onDone(() => { + + // If the aside overlay still exists... + if ( this._asideOverlay ) + { + // Remove the event listener + this._asideOverlay.removeEventListener('click', this._handleAsideOverlayClick); + + // Remove the aside overlay + this._asideOverlay.parentNode.removeChild(this._asideOverlay); + this._asideOverlay = null; + } + }); + } + + /** + * On mouseenter + * + * @private + */ + @HostListener('mouseenter') + private _onMouseenter(): void + { + // Enable the animations + this._enableAnimations(); + + // Set the hovered + this._hovered = true; + } + + /** + * On mouseleave + * + * @private + */ + @HostListener('mouseleave') + private _onMouseleave(): void + { + // Enable the animations + this._enableAnimations(); + + // Set the hovered + this._hovered = false; + } + + /** + * Open/close the navigation + * + * @param open + * @private + */ + private _toggleOpened(open: boolean): void + { + // Set the opened + this.opened = open; + + // Enable the animations + this._enableAnimations(); + + // If the navigation opened, and the mode + // is 'over', show the overlay + if ( this.mode === 'over' ) + { + if ( this.opened ) + { + this._showOverlay(); + } + else + { + this._hideOverlay(); + } + } + + // Execute the observable + this.openedChanged.next(open); + } +} diff --git a/src/@fuse/directives/autogrow/autogrow.directive.ts b/src/@fuse/directives/autogrow/autogrow.directive.ts new file mode 100644 index 00000000..3f62401f --- /dev/null +++ b/src/@fuse/directives/autogrow/autogrow.directive.ts @@ -0,0 +1,114 @@ +import { ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Input, NgZone, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Directive({ + selector: 'textarea[fuseAutogrow]', + exportAs: 'fuseAutogrow' +}) +export class FuseAutogrowDirective implements OnChanges, OnInit, OnDestroy +{ + // tslint:disable-next-line:no-input-rename + @Input('fuseAutogrowVerticalPadding') padding: number = 8; + @HostBinding('rows') private _rows: number = 1; + + private _height: string = 'auto'; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _elementRef: ElementRef, + private _changeDetectorRef: ChangeDetectorRef, + private _ngZone: NgZone + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component inline styles + */ + @HostBinding('style') get styleList(): any + { + return { + 'height' : this._height, + 'overflow': 'hidden', + 'resize' : 'none' + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Padding + if ( 'fuseAutogrowVerticalPadding' in changes ) + { + // Resize + this._resize(); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Resize for the first time + this._resize(); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resize on 'input' and 'ngModelChange' events + * + * @private + */ + @HostListener('input') + @HostListener('ngModelChange') + private _resize(): void + { + // This doesn't need to trigger Angular's change detection by itself + this._ngZone.runOutsideAngular(() => { + + setTimeout(() => { + + // Set the height to 'auto' so we can correctly read the scrollHeight + this._height = 'auto'; + + // Detect the changes so the height is applied + this._changeDetectorRef.detectChanges(); + + // Get the scrollHeight and subtract the vertical padding + this._height = `${this._elementRef.nativeElement.scrollHeight - this.padding}px`; + + // Detect the changes one more time to apply the final height + this._changeDetectorRef.detectChanges(); + }); + }); + } +} diff --git a/src/@fuse/directives/autogrow/autogrow.module.ts b/src/@fuse/directives/autogrow/autogrow.module.ts new file mode 100644 index 00000000..15d08b86 --- /dev/null +++ b/src/@fuse/directives/autogrow/autogrow.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { FuseAutogrowDirective } from '@fuse/directives/autogrow/autogrow.directive'; + +@NgModule({ + declarations: [ + FuseAutogrowDirective + ], + exports : [ + FuseAutogrowDirective + ] +}) +export class FuseAutogrowModule +{ +} diff --git a/src/@fuse/directives/autogrow/index.ts b/src/@fuse/directives/autogrow/index.ts new file mode 100644 index 00000000..c689e4bb --- /dev/null +++ b/src/@fuse/directives/autogrow/index.ts @@ -0,0 +1 @@ +export * from '@fuse/directives/autogrow/public-api'; diff --git a/src/@fuse/directives/autogrow/public-api.ts b/src/@fuse/directives/autogrow/public-api.ts new file mode 100644 index 00000000..1bb75d2d --- /dev/null +++ b/src/@fuse/directives/autogrow/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/directives/autogrow/autogrow.directive'; +export * from '@fuse/directives/autogrow/autogrow.module'; diff --git a/src/@fuse/directives/scroll-reset/index.ts b/src/@fuse/directives/scroll-reset/index.ts new file mode 100644 index 00000000..f1f563bc --- /dev/null +++ b/src/@fuse/directives/scroll-reset/index.ts @@ -0,0 +1 @@ +export * from '@fuse/directives/scroll-reset/public-api'; diff --git a/src/@fuse/directives/scroll-reset/public-api.ts b/src/@fuse/directives/scroll-reset/public-api.ts new file mode 100644 index 00000000..c394b43c --- /dev/null +++ b/src/@fuse/directives/scroll-reset/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/directives/scroll-reset/scroll-reset.directive'; +export * from '@fuse/directives/scroll-reset/scroll-reset.module'; diff --git a/src/@fuse/directives/scroll-reset/scroll-reset.directive.ts b/src/@fuse/directives/scroll-reset/scroll-reset.directive.ts new file mode 100644 index 00000000..4fead838 --- /dev/null +++ b/src/@fuse/directives/scroll-reset/scroll-reset.directive.ts @@ -0,0 +1,53 @@ +import { Directive, ElementRef, OnDestroy, OnInit } from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; + +@Directive({ + selector: '[fuseScrollReset]', + exportAs: 'fuseScrollReset' +}) +export class FuseScrollResetDirective implements OnInit, OnDestroy +{ + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _elementRef: ElementRef, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to NavigationEnd event + this._router.events.pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Reset the element's scroll position to the top + this._elementRef.nativeElement.scrollTop = 0; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/directives/scroll-reset/scroll-reset.module.ts b/src/@fuse/directives/scroll-reset/scroll-reset.module.ts new file mode 100644 index 00000000..48715be3 --- /dev/null +++ b/src/@fuse/directives/scroll-reset/scroll-reset.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { FuseScrollResetDirective } from '@fuse/directives/scroll-reset/scroll-reset.directive'; + +@NgModule({ + declarations: [ + FuseScrollResetDirective + ], + exports : [ + FuseScrollResetDirective + ] +}) +export class FuseScrollResetModule +{ +} diff --git a/src/@fuse/directives/scrollbar/index.ts b/src/@fuse/directives/scrollbar/index.ts new file mode 100644 index 00000000..9aba5806 --- /dev/null +++ b/src/@fuse/directives/scrollbar/index.ts @@ -0,0 +1 @@ +export * from '@fuse/directives/scrollbar/public-api'; diff --git a/src/@fuse/directives/scrollbar/public-api.ts b/src/@fuse/directives/scrollbar/public-api.ts new file mode 100644 index 00000000..c74ff507 --- /dev/null +++ b/src/@fuse/directives/scrollbar/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/directives/scrollbar/scrollbar.directive'; +export * from '@fuse/directives/scrollbar/scrollbar.module'; diff --git a/src/@fuse/directives/scrollbar/scrollbar.directive.ts b/src/@fuse/directives/scrollbar/scrollbar.directive.ts new file mode 100644 index 00000000..c4c9c053 --- /dev/null +++ b/src/@fuse/directives/scrollbar/scrollbar.directive.ts @@ -0,0 +1,465 @@ +import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { Router } from '@angular/router'; +import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion'; +import { Platform } from '@angular/cdk/platform'; +import { fromEvent, Subject } from 'rxjs'; +import { debounceTime, takeUntil } from 'rxjs/operators'; +import PerfectScrollbar from 'perfect-scrollbar'; +import { merge } from 'lodash-es'; +import { ScrollbarGeometry, ScrollbarPosition } from '@fuse/directives/scrollbar/scrollbar.types'; + +/** + * Wrapper directive for the Perfect Scrollbar: https://github.com/mdbootstrap/perfect-scrollbar + */ +@Directive({ + selector: '[fuseScrollbar]', + exportAs: 'fuseScrollbar' +}) +export class FuseScrollbarDirective implements OnChanges, OnInit, OnDestroy +{ + static ngAcceptInputType_fuseScrollbar: BooleanInput; + + @Input() fuseScrollbar: boolean = true; + @Input() fuseScrollbarOptions: PerfectScrollbar.Options; + + private _animation: number; + private _options: PerfectScrollbar.Options; + private _ps: PerfectScrollbar; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _elementRef: ElementRef, + private _platform: Platform, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for _elementRef + */ + get elementRef(): ElementRef + { + return this._elementRef; + } + + /** + * Getter for _ps + */ + get ps(): PerfectScrollbar | null + { + return this._ps; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Enabled + if ( 'fuseScrollbar' in changes ) + { + // Interpret empty string as 'true' + this.fuseScrollbar = coerceBooleanProperty(changes.fuseScrollbar.currentValue); + + // If enabled, init the directive + if ( this.fuseScrollbar ) + { + this._init(); + } + // Otherwise destroy it + else + { + this._destroy(); + } + } + + // Scrollbar options + if ( 'fuseScrollbarOptions' in changes ) + { + // Merge the options + this._options = merge({}, this._options, changes.fuseScrollbarOptions.currentValue); + + // Return if not initialized + if ( !this._ps ) + { + return; + } + + // Destroy and re-init the PerfectScrollbar to update its options + setTimeout(() => { + this._destroy(); + }); + + setTimeout(() => { + this._init(); + }); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to window resize event + fromEvent(window, 'resize') + .pipe( + takeUntil(this._unsubscribeAll), + debounceTime(150) + ) + .subscribe(() => { + + // Update the PerfectScrollbar + this.update(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + this._destroy(); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Is enabled + */ + isEnabled(): boolean + { + return this.fuseScrollbar; + } + + /** + * Update the scrollbar + */ + update(): void + { + // Return if not initialized + if ( !this._ps ) + { + return; + } + + // Update the PerfectScrollbar + this._ps.update(); + } + + /** + * Destroy the scrollbar + */ + destroy(): void + { + this.ngOnDestroy(); + } + + /** + * Returns the geometry of the scrollable element + * + * @param prefix + */ + geometry(prefix: string = 'scroll'): ScrollbarGeometry + { + return new ScrollbarGeometry( + this._elementRef.nativeElement[prefix + 'Left'], + this._elementRef.nativeElement[prefix + 'Top'], + this._elementRef.nativeElement[prefix + 'Width'], + this._elementRef.nativeElement[prefix + 'Height']); + } + + /** + * Returns the position of the scrollable element + * + * @param absolute + */ + position(absolute: boolean = false): ScrollbarPosition + { + let scrollbarPosition; + + if ( !absolute && this._ps ) + { + scrollbarPosition = new ScrollbarPosition( + this._ps.reach.x || 0, + this._ps.reach.y || 0 + ); + } + else + { + scrollbarPosition = new ScrollbarPosition( + this._elementRef.nativeElement.scrollLeft, + this._elementRef.nativeElement.scrollTop + ); + } + + return scrollbarPosition; + } + + /** + * Scroll to + * + * @param x + * @param y + * @param speed + */ + scrollTo(x: number, y?: number, speed?: number): void + { + if ( y == null && speed == null ) + { + this.animateScrolling('scrollTop', x, speed); + } + else + { + if ( x != null ) + { + this.animateScrolling('scrollLeft', x, speed); + } + + if ( y != null ) + { + this.animateScrolling('scrollTop', y, speed); + } + } + } + + /** + * Scroll to X + * + * @param {number} x + * @param {number} speed + */ + scrollToX(x: number, speed?: number): void + { + this.animateScrolling('scrollLeft', x, speed); + } + + /** + * Scroll to Y + * + * @param {number} y + * @param {number} speed + */ + scrollToY(y: number, speed?: number): void + { + this.animateScrolling('scrollTop', y, speed); + } + + /** + * Scroll to top + * + * @param {number} offset + * @param {number} speed + */ + scrollToTop(offset: number = 0, speed?: number): void + { + this.animateScrolling('scrollTop', offset, speed); + } + + /** + * Scroll to bottom + * + * @param {number} offset + * @param {number} speed + */ + scrollToBottom(offset: number = 0, speed?: number): void + { + const top = this._elementRef.nativeElement.scrollHeight - this._elementRef.nativeElement.clientHeight; + this.animateScrolling('scrollTop', top - offset, speed); + } + + /** + * Scroll to left + * + * @param {number} offset + * @param {number} speed + */ + scrollToLeft(offset: number = 0, speed?: number): void + { + this.animateScrolling('scrollLeft', offset, speed); + } + + /** + * Scroll to right + * + * @param {number} offset + * @param {number} speed + */ + scrollToRight(offset: number = 0, speed?: number): void + { + const left = this._elementRef.nativeElement.scrollWidth - this._elementRef.nativeElement.clientWidth; + this.animateScrolling('scrollLeft', left - offset, speed); + } + + /** + * Scroll to element + * + * @param {string} qs + * @param {number} offset + * @param {boolean} ignoreVisible If true, scrollToElement won't happen if element is already inside the current viewport + * @param {number} speed + */ + scrollToElement(qs: string, offset: number = 0, ignoreVisible: boolean = false, speed?: number): void + { + const element = this._elementRef.nativeElement.querySelector(qs); + + if ( !element ) + { + return; + } + + const elementPos = element.getBoundingClientRect(); + const scrollerPos = this._elementRef.nativeElement.getBoundingClientRect(); + + if ( this._elementRef.nativeElement.classList.contains('ps--active-x') ) + { + if ( ignoreVisible && elementPos.right <= (scrollerPos.right - Math.abs(offset)) ) + { + return; + } + + const currentPos = this._elementRef.nativeElement['scrollLeft']; + const position = elementPos.left - scrollerPos.left + currentPos; + + this.animateScrolling('scrollLeft', position + offset, speed); + } + + if ( this._elementRef.nativeElement.classList.contains('ps--active-y') ) + { + if ( ignoreVisible && elementPos.bottom <= (scrollerPos.bottom - Math.abs(offset)) ) + { + return; + } + + const currentPos = this._elementRef.nativeElement['scrollTop']; + const position = elementPos.top - scrollerPos.top + currentPos; + + this.animateScrolling('scrollTop', position + offset, speed); + } + } + + /** + * Animate scrolling + * + * @param target + * @param value + * @param speed + */ + animateScrolling(target: string, value: number, speed?: number): void + { + if ( this._animation ) + { + window.cancelAnimationFrame(this._animation); + this._animation = null; + } + + if ( !speed || typeof window === 'undefined' ) + { + this._elementRef.nativeElement[target] = value; + } + else if ( value !== this._elementRef.nativeElement[target] ) + { + let newValue = 0; + let scrollCount = 0; + + let oldTimestamp = performance.now(); + let oldValue = this._elementRef.nativeElement[target]; + + const cosParameter = (oldValue - value) / 2; + + const step = (newTimestamp: number) => { + scrollCount += Math.PI / (speed / (newTimestamp - oldTimestamp)); + newValue = Math.round(value + cosParameter + cosParameter * Math.cos(scrollCount)); + + // Only continue animation if scroll position has not changed + if ( this._elementRef.nativeElement[target] === oldValue ) + { + if ( scrollCount >= Math.PI ) + { + this.animateScrolling(target, value, 0); + } + else + { + this._elementRef.nativeElement[target] = newValue; + + // On a zoomed out page the resulting offset may differ + oldValue = this._elementRef.nativeElement[target]; + oldTimestamp = newTimestamp; + + this._animation = window.requestAnimationFrame(step); + } + } + }; + + window.requestAnimationFrame(step); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void + { + // Return if already initialized + if ( this._ps ) + { + return; + } + + // Return if on mobile or not on browser + if ( this._platform.ANDROID || this._platform.IOS || !this._platform.isBrowser ) + { + this.fuseScrollbar = false; + return; + } + + // Initialize the PerfectScrollbar + this._ps = new PerfectScrollbar(this._elementRef.nativeElement, {...this._options}); + } + + /** + * Destroy + * + * @private + */ + private _destroy(): void + { + // Return if not initialized + if ( !this._ps ) + { + return; + } + + // Destroy the PerfectScrollbar + this._ps.destroy(); + + // Clean up + this._ps = null; + } +} diff --git a/src/@fuse/directives/scrollbar/scrollbar.module.ts b/src/@fuse/directives/scrollbar/scrollbar.module.ts new file mode 100644 index 00000000..628645b6 --- /dev/null +++ b/src/@fuse/directives/scrollbar/scrollbar.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { FuseScrollbarDirective } from '@fuse/directives/scrollbar/scrollbar.directive'; + +@NgModule({ + declarations: [ + FuseScrollbarDirective + ], + exports : [ + FuseScrollbarDirective + ] +}) +export class FuseScrollbarModule +{ +} diff --git a/src/@fuse/directives/scrollbar/scrollbar.types.ts b/src/@fuse/directives/scrollbar/scrollbar.types.ts new file mode 100644 index 00000000..11694a95 --- /dev/null +++ b/src/@fuse/directives/scrollbar/scrollbar.types.ts @@ -0,0 +1,28 @@ +export class ScrollbarGeometry +{ + public x: number; + public y: number; + + public w: number; + public h: number; + + constructor(x: number, y: number, w: number, h: number) + { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } +} + +export class ScrollbarPosition +{ + public x: number | 'start' | 'end'; + public y: number | 'start' | 'end'; + + constructor(x: number | 'start' | 'end', y: number | 'start' | 'end') + { + this.x = x; + this.y = y; + } +} diff --git a/src/@fuse/fuse.module.ts b/src/@fuse/fuse.module.ts new file mode 100644 index 00000000..3bd69876 --- /dev/null +++ b/src/@fuse/fuse.module.ts @@ -0,0 +1,37 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; +import { FuseMediaWatcherModule } from '@fuse/services/media-watcher/media-watcher.module'; +import { FuseSplashScreenModule } from '@fuse/services/splash-screen/splash-screen.module'; +import { FuseTailwindConfigModule } from '@fuse/services/tailwind/tailwind.module'; +import { FuseUtilsModule } from '@fuse/services/utils/utils.module'; + +@NgModule({ + imports : [ + FuseMediaWatcherModule, + FuseSplashScreenModule, + FuseTailwindConfigModule, + FuseUtilsModule + ], + providers: [ + { + // Use the 'fill' appearance on Angular Material form fields by default + provide : MAT_FORM_FIELD_DEFAULT_OPTIONS, + useValue: { + appearance: 'fill' + } + } + ] +}) +export class FuseModule +{ + /** + * Constructor + */ + constructor(@Optional() @SkipSelf() parentModule?: FuseModule) + { + if ( parentModule ) + { + throw new Error('FuseModule has already been loaded. Import this module in the AppModule only!'); + } + } +} diff --git a/src/@fuse/index.ts b/src/@fuse/index.ts new file mode 100644 index 00000000..b172fb6f --- /dev/null +++ b/src/@fuse/index.ts @@ -0,0 +1 @@ +export * from './fuse.module'; diff --git a/src/@fuse/lib/mock-api/index.ts b/src/@fuse/lib/mock-api/index.ts new file mode 100644 index 00000000..121e0f72 --- /dev/null +++ b/src/@fuse/lib/mock-api/index.ts @@ -0,0 +1 @@ +export * from '@fuse/lib/mock-api/public-api'; diff --git a/src/@fuse/lib/mock-api/mock-api.constants.ts b/src/@fuse/lib/mock-api/mock-api.constants.ts new file mode 100644 index 00000000..de7440fd --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.constants.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const FUSE_MOCK_API_DEFAULT_DELAY = new InjectionToken('FUSE_MOCK_API_DEFAULT_DELAY'); diff --git a/src/@fuse/lib/mock-api/mock-api.interceptor.ts b/src/@fuse/lib/mock-api/mock-api.interceptor.ts new file mode 100644 index 00000000..4673e0d1 --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.interceptor.ts @@ -0,0 +1,97 @@ +import { Inject, Injectable } from '@angular/core'; +import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http'; +import { Observable, of, throwError } from 'rxjs'; +import { delay, switchMap } from 'rxjs/operators'; +import { FUSE_MOCK_API_DEFAULT_DELAY } from '@fuse/lib/mock-api/mock-api.constants'; +import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseMockApiInterceptor implements HttpInterceptor +{ + /** + * Constructor + */ + constructor( + @Inject(FUSE_MOCK_API_DEFAULT_DELAY) private _defaultDelay: number, + private _fuseMockApiService: FuseMockApiService + ) + { + } + + /** + * Intercept + * + * @param request + * @param next + */ + intercept(request: HttpRequest, next: HttpHandler): Observable> + { + // Try to get the request handler + const { + handler, + urlParams + } = this._fuseMockApiService.findHandler(request.method.toUpperCase(), request.url); + + // Pass through if the request handler does not exist + if ( !handler ) + { + return next.handle(request); + } + + // Set the intercepted request on the handler + handler.request = request; + + // Set the url params on the handler + handler.urlParams = urlParams; + + // Subscribe to the response function observable + return handler.response.pipe( + delay(handler.delay ?? this._defaultDelay ?? 0), + switchMap((response) => { + + // If there is no response mock-api, + // throw an error response + if ( !response ) + { + response = new HttpErrorResponse({ + error : 'NOT FOUND', + status : 404, + statusText: 'NOT FOUND' + }); + + return throwError(response); + } + + // Parse the response mock-api + const data = { + status: response[0], + body : response[1] + }; + + // If the status code is in between 200 and 300, + // return a success response + if ( data.status >= 200 && data.status < 300 ) + { + response = new HttpResponse({ + body : data.body, + status : data.status, + statusText: 'OK' + }); + + return of(response); + } + + // For other status codes, + // throw an error response + response = new HttpErrorResponse({ + error : data.body.error, + status : data.status, + statusText: 'ERROR' + }); + + return throwError(response); + })); + } +} diff --git a/src/@fuse/lib/mock-api/mock-api.module.ts b/src/@fuse/lib/mock-api/mock-api.module.ts new file mode 100644 index 00000000..bbb91251 --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.module.ts @@ -0,0 +1,42 @@ +import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { FUSE_MOCK_API_DEFAULT_DELAY } from '@fuse/lib/mock-api/mock-api.constants'; +import { FuseMockApiInterceptor } from '@fuse/lib/mock-api/mock-api.interceptor'; + +@NgModule({ + providers: [ + { + provide : HTTP_INTERCEPTORS, + useClass: FuseMockApiInterceptor, + multi : true + } + ] +}) +export class FuseMockApiModule +{ + /** + * FuseMockApi module default configuration. + * + * @param mockApiServices - Array of services that register mock API handlers + * @param config - Configuration options + * @param config.delay - Default delay value in milliseconds to apply all responses + */ + static forRoot(mockApiServices: any[], config?: { delay?: number }): ModuleWithProviders + { + return { + ngModule : FuseMockApiModule, + providers: [ + { + provide : APP_INITIALIZER, + deps : [...mockApiServices], + useFactory: () => () => null, + multi : true + }, + { + provide : FUSE_MOCK_API_DEFAULT_DELAY, + useValue: config?.delay ?? 0 + } + ] + }; + } +} diff --git a/src/@fuse/lib/mock-api/mock-api.request-handler.ts b/src/@fuse/lib/mock-api/mock-api.request-handler.ts new file mode 100644 index 00000000..bf6acce3 --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.request-handler.ts @@ -0,0 +1,100 @@ +import { HttpRequest } from '@angular/common/http'; +import { Observable, of, throwError } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { FuseMockApiReplyCallback } from '@fuse/lib/mock-api/mock-api.types'; + +export class FuseMockApiHandler +{ + request!: HttpRequest; + urlParams!: { [key: string]: string }; + + // Private + private _reply: FuseMockApiReplyCallback = undefined; + private _replyCount = 0; + private _replied = 0; + + /** + * Constructor + */ + constructor( + public url: string, + public delay?: number + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for response callback + */ + get response(): Observable + { + // If the execution limit has been reached, throw an error + if ( this._replyCount > 0 && this._replyCount <= this._replied ) + { + return throwError('Execution limit has been reached!'); + } + + // If the response callback has not been set, throw an error + if ( !this._reply ) + { + return throwError('Response callback function does not exist!'); + } + + // If the request has not been set, throw an error + if ( !this.request ) + { + return throwError('Request does not exist!'); + } + + // Increase the replied count + this._replied++; + + // Execute the reply callback + const replyResult = this._reply({ + request : this.request, + urlParams: this.urlParams + }); + + // If the result of the reply callback is an observable... + if ( replyResult instanceof Observable ) + { + // Return the result as it is + return replyResult.pipe(take(1)); + } + + // Otherwise, return the result as an observable + return of(replyResult).pipe(take(1)); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reply + * + * @param callback + */ + reply(callback: FuseMockApiReplyCallback): void + { + // Store the reply + this._reply = callback; + } + + /** + * Reply count + * + * @param count + */ + replyCount(count: number): void + { + // Store the reply count + this._replyCount = count; + } +} + + diff --git a/src/@fuse/lib/mock-api/mock-api.service.ts b/src/@fuse/lib/mock-api/mock-api.service.ts new file mode 100644 index 00000000..e317f486 --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.service.ts @@ -0,0 +1,166 @@ +import { Injectable } from '@angular/core'; +import { compact, fromPairs } from 'lodash-es'; +import { FuseMockApiHandler } from '@fuse/lib/mock-api/mock-api.request-handler'; +import { FuseMockApiMethods } from '@fuse/lib/mock-api/mock-api.types'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseMockApiService +{ + private _handlers: { [key: string]: Map } = { + DELETE: new Map(), + GET : new Map(), + PATCH : new Map(), + POST : new Map(), + PUT : new Map() + }; + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Find the handler from the service + * with the given method and url + * + * @param method + * @param url + */ + findHandler(method: string, url: string): { handler: FuseMockApiHandler | undefined, urlParams: { [key: string]: string } } + { + // Prepare the return object + const matchingHandler: { handler: FuseMockApiHandler | undefined, urlParams: { [key: string]: string } } = { + handler : undefined, + urlParams: {} + }; + + // Split the url + const urlParts = url.split('/'); + + // Get all related request handlers + const handlers = this._handlers[method.toUpperCase()]; + + // Iterate through the handlers + handlers.forEach((handler, handlerUrl) => { + + // Skip if there is already a matching handler + if ( matchingHandler.handler ) + { + return; + } + + // Split the handler url + const handlerUrlParts = handlerUrl.split('/'); + + // Skip if the lengths of the urls we are comparing are not the same + if ( urlParts.length !== handlerUrlParts.length ) + { + return; + } + + // Compare + const matches = handlerUrlParts.every((handlerUrlPart, index) => handlerUrlPart === urlParts[index] || handlerUrlPart.startsWith(':')); + + // If there is a match... + if ( matches ) + { + // Assign the matching handler + matchingHandler.handler = handler; + + // Extract and assign the parameters + matchingHandler.urlParams = fromPairs(compact(handlerUrlParts.map((handlerUrlPart, index) => + handlerUrlPart.startsWith(':') ? [handlerUrlPart.substring(1), urlParts[index]] : undefined + ))); + } + }); + + return matchingHandler; + } + + /** + * Register a DELETE request handler + * + * @param url - URL address of the mocked API endpoint + * @param delay - Delay of the response in milliseconds + */ + onDelete(url: string, delay?: number): FuseMockApiHandler + { + return this._registerHandler('DELETE', url, delay); + } + + /** + * Register a GET request handler + * + * @param url - URL address of the mocked API endpoint + * @param delay - Delay of the response in milliseconds + */ + onGet(url: string, delay?: number): FuseMockApiHandler + { + return this._registerHandler('GET', url, delay); + } + + /** + * Register a PATCH request handler + * + * @param url - URL address of the mocked API endpoint + * @param delay - Delay of the response in milliseconds + */ + onPatch(url: string, delay?: number): FuseMockApiHandler + { + return this._registerHandler('PATCH', url, delay); + } + + /** + * Register a POST request handler + * + * @param url - URL address of the mocked API endpoint + * @param delay - Delay of the response in milliseconds + */ + onPost(url: string, delay?: number): FuseMockApiHandler + { + return this._registerHandler('POST', url, delay); + } + + /** + * Register a PUT request handler + * + * @param url - URL address of the mocked API endpoint + * @param delay - Delay of the response in milliseconds + */ + onPut(url: string, delay?: number): FuseMockApiHandler + { + return this._registerHandler('PUT', url, delay); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register and return a new instance of the handler + * + * @param method + * @param url + * @param delay + * @private + */ + private _registerHandler(method: FuseMockApiMethods, url: string, delay?: number): FuseMockApiHandler + { + // Create a new instance of FuseMockApiRequestHandler + const fuseMockHttp = new FuseMockApiHandler(url, delay); + + // Store the handler to access it from the interceptor + this._handlers[method].set(url, fuseMockHttp); + + // Return the instance + return fuseMockHttp; + } +} diff --git a/src/@fuse/lib/mock-api/mock-api.types.ts b/src/@fuse/lib/mock-api/mock-api.types.ts new file mode 100644 index 00000000..c8e6e43c --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.types.ts @@ -0,0 +1,13 @@ +import { HttpRequest } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +export type FuseMockApiReplyCallback = + | ((data: { request: HttpRequest; urlParams: { [key: string]: string } }) => ([number, string | any]) | Observable) + | undefined; + +export type FuseMockApiMethods = + | 'GET' + | 'POST' + | 'PUT' + | 'PATCH' + | 'DELETE'; diff --git a/src/@fuse/lib/mock-api/mock-api.utils.ts b/src/@fuse/lib/mock-api/mock-api.utils.ts new file mode 100644 index 00000000..2ee8d19b --- /dev/null +++ b/src/@fuse/lib/mock-api/mock-api.utils.ts @@ -0,0 +1,37 @@ +export class FuseMockApiUtils +{ + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Generate a globally unique id + */ + static guid(): string + { + /* tslint:disable */ + + let d = new Date().getTime(); + + // Use high-precision timer if available + if ( typeof performance !== 'undefined' && typeof performance.now === 'function' ) + { + d += performance.now(); + } + + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + + /* tslint:enable */ + } +} diff --git a/src/@fuse/lib/mock-api/public-api.ts b/src/@fuse/lib/mock-api/public-api.ts new file mode 100644 index 00000000..77e23456 --- /dev/null +++ b/src/@fuse/lib/mock-api/public-api.ts @@ -0,0 +1,5 @@ +export * from '@fuse/lib/mock-api/mock-api.constants'; +export * from '@fuse/lib/mock-api/mock-api.module'; +export * from '@fuse/lib/mock-api/mock-api.service'; +export * from '@fuse/lib/mock-api/mock-api.types'; +export * from '@fuse/lib/mock-api/mock-api.utils'; diff --git a/src/@fuse/pipes/find-by-key/find-by-key.module.ts b/src/@fuse/pipes/find-by-key/find-by-key.module.ts new file mode 100644 index 00000000..ead34778 --- /dev/null +++ b/src/@fuse/pipes/find-by-key/find-by-key.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { FuseFindByKeyPipe } from '@fuse/pipes/find-by-key/find-by-key.pipe'; + +@NgModule({ + declarations: [ + FuseFindByKeyPipe + ], + exports : [ + FuseFindByKeyPipe + ] +}) +export class FuseFindByKeyPipeModule +{ +} diff --git a/src/@fuse/pipes/find-by-key/find-by-key.pipe.ts b/src/@fuse/pipes/find-by-key/find-by-key.pipe.ts new file mode 100644 index 00000000..506409e7 --- /dev/null +++ b/src/@fuse/pipes/find-by-key/find-by-key.pipe.ts @@ -0,0 +1,39 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Finds an object from given source using the given key - value pairs + */ +@Pipe({ + name: 'fuseFindByKey', + pure: false +}) +export class FuseFindByKeyPipe implements PipeTransform +{ + /** + * Constructor + */ + constructor() + { + } + + /** + * Transform + * + * @param value A string or an array of strings to find from source + * @param key Key of the object property to look for + * @param source Array of objects to find from + */ + transform(value: string | string[], key: string, source: any[]): any + { + // If the given value is an array of strings... + if ( Array.isArray(value) ) + { + return value.map((item) => { + return source.find((sourceItem) => sourceItem[key] === item); + }); + } + + // If the value is a string... + return source.find(sourceItem => sourceItem[key] === value); + } +} diff --git a/src/@fuse/pipes/find-by-key/index.ts b/src/@fuse/pipes/find-by-key/index.ts new file mode 100644 index 00000000..61efac02 --- /dev/null +++ b/src/@fuse/pipes/find-by-key/index.ts @@ -0,0 +1 @@ +export * from '@fuse/pipes/find-by-key/public-api'; diff --git a/src/@fuse/pipes/find-by-key/public-api.ts b/src/@fuse/pipes/find-by-key/public-api.ts new file mode 100644 index 00000000..178a2c7f --- /dev/null +++ b/src/@fuse/pipes/find-by-key/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/pipes/find-by-key/find-by-key.pipe'; +export * from '@fuse/pipes/find-by-key/find-by-key.module'; diff --git a/src/@fuse/services/config/config.constants.ts b/src/@fuse/services/config/config.constants.ts new file mode 100644 index 00000000..ef99d39c --- /dev/null +++ b/src/@fuse/services/config/config.constants.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const FUSE_APP_CONFIG = new InjectionToken('FUSE_APP_CONFIG'); diff --git a/src/@fuse/services/config/config.module.ts b/src/@fuse/services/config/config.module.ts new file mode 100644 index 00000000..4416a4ce --- /dev/null +++ b/src/@fuse/services/config/config.module.ts @@ -0,0 +1,32 @@ +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { FuseConfigService } from '@fuse/services/config/config.service'; +import { FUSE_APP_CONFIG } from '@fuse/services/config/config.constants'; + +@NgModule() +export class FuseConfigModule +{ + /** + * Constructor + */ + constructor(private _fuseConfigService: FuseConfigService) + { + } + + /** + * forRoot method for setting user configuration + * + * @param config + */ + static forRoot(config: any): ModuleWithProviders + { + return { + ngModule : FuseConfigModule, + providers: [ + { + provide : FUSE_APP_CONFIG, + useValue: config + } + ] + }; + } +} diff --git a/src/@fuse/services/config/config.service.ts b/src/@fuse/services/config/config.service.ts new file mode 100644 index 00000000..33948a0f --- /dev/null +++ b/src/@fuse/services/config/config.service.ts @@ -0,0 +1,55 @@ +import { Inject, Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { merge } from 'lodash-es'; +import { FUSE_APP_CONFIG } from '@fuse/services/config/config.constants'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseConfigService +{ + private _config: BehaviorSubject; + + /** + * Constructor + */ + constructor(@Inject(FUSE_APP_CONFIG) config: any) + { + // Private + this._config = new BehaviorSubject(config); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Setter & getter for config + */ + set config(value: any) + { + // Merge the new config over to the current config + const config = merge({}, this._config.getValue(), value); + + // Execute the observable + this._config.next(config); + } + + get config$(): Observable + { + return this._config.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resets the config to the default + */ + reset(): void + { + // Set the config + this._config.next(this.config); + } +} diff --git a/src/@fuse/services/config/index.ts b/src/@fuse/services/config/index.ts new file mode 100644 index 00000000..0563cafe --- /dev/null +++ b/src/@fuse/services/config/index.ts @@ -0,0 +1 @@ +export * from '@fuse/services/config/public-api'; diff --git a/src/@fuse/services/config/public-api.ts b/src/@fuse/services/config/public-api.ts new file mode 100644 index 00000000..36df7bdc --- /dev/null +++ b/src/@fuse/services/config/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/services/config/config.module'; +export * from '@fuse/services/config/config.service'; diff --git a/src/@fuse/services/media-watcher/index.ts b/src/@fuse/services/media-watcher/index.ts new file mode 100644 index 00000000..b2dad0cb --- /dev/null +++ b/src/@fuse/services/media-watcher/index.ts @@ -0,0 +1 @@ +export * from '@fuse/services/media-watcher/public-api'; diff --git a/src/@fuse/services/media-watcher/media-watcher.module.ts b/src/@fuse/services/media-watcher/media-watcher.module.ts new file mode 100644 index 00000000..3e5133e0 --- /dev/null +++ b/src/@fuse/services/media-watcher/media-watcher.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher/media-watcher.service'; + +@NgModule({ + providers: [ + FuseMediaWatcherService + ] +}) +export class FuseMediaWatcherModule +{ + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } +} diff --git a/src/@fuse/services/media-watcher/media-watcher.service.ts b/src/@fuse/services/media-watcher/media-watcher.service.ts new file mode 100644 index 00000000..49203137 --- /dev/null +++ b/src/@fuse/services/media-watcher/media-watcher.service.ts @@ -0,0 +1,78 @@ +import { Injectable } from '@angular/core'; +import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout'; +import { Observable, ReplaySubject } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { FuseTailwindService } from '@fuse/services/tailwind/tailwind.service'; + +@Injectable() +export class FuseMediaWatcherService +{ + private _onMediaChange: ReplaySubject<{ matchingAliases: string[], matchingQueries: any }> = new ReplaySubject<{ matchingAliases: string[], matchingQueries: any }>(1); + + /** + * Constructor + */ + constructor( + private _breakpointObserver: BreakpointObserver, + private _fuseTailwindConfigService: FuseTailwindService + ) + { + this._fuseTailwindConfigService.tailwindConfig$.pipe( + switchMap((config) => this._breakpointObserver.observe(Object.values(config.breakpoints)).pipe( + map((state) => { + + // Prepare the observable values and set their defaults + const matchingAliases: string[] = []; + const matchingQueries: any = {}; + + // Get the matching breakpoints and use them to fill the subject + const matchingBreakpoints = Object.entries(state.breakpoints).filter(([query, matches]) => matches) ?? []; + for ( const [query] of matchingBreakpoints ) + { + // Find the alias of the matching query + const matchingAlias = Object.entries(config.breakpoints).find(([alias, q]) => q === query)[0]; + + // Add the matching query to the observable values + if ( matchingAlias ) + { + matchingAliases.push(matchingAlias); + matchingQueries[matchingAlias] = query; + } + } + + // Execute the observable + this._onMediaChange.next({ + matchingAliases, + matchingQueries + }); + }) + )) + ).subscribe(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for _onMediaChange + */ + get onMediaChange$(): Observable<{ matchingAliases: string[], matchingQueries: any }> + { + return this._onMediaChange.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On media query change + * + * @param query + */ + onMediaQueryChange$(query: string | string[]): Observable + { + return this._breakpointObserver.observe(query); + } +} diff --git a/src/@fuse/services/media-watcher/public-api.ts b/src/@fuse/services/media-watcher/public-api.ts new file mode 100644 index 00000000..fd5905d7 --- /dev/null +++ b/src/@fuse/services/media-watcher/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/services/media-watcher/media-watcher.module'; +export * from '@fuse/services/media-watcher/media-watcher.service'; diff --git a/src/@fuse/services/splash-screen/index.ts b/src/@fuse/services/splash-screen/index.ts new file mode 100644 index 00000000..79ce6e49 --- /dev/null +++ b/src/@fuse/services/splash-screen/index.ts @@ -0,0 +1 @@ +export * from '@fuse/services/splash-screen/public-api'; diff --git a/src/@fuse/services/splash-screen/public-api.ts b/src/@fuse/services/splash-screen/public-api.ts new file mode 100644 index 00000000..ab0ada99 --- /dev/null +++ b/src/@fuse/services/splash-screen/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/services/splash-screen/splash-screen.module'; +export * from '@fuse/services/splash-screen/splash-screen.service'; diff --git a/src/@fuse/services/splash-screen/splash-screen.module.ts b/src/@fuse/services/splash-screen/splash-screen.module.ts new file mode 100644 index 00000000..913d595d --- /dev/null +++ b/src/@fuse/services/splash-screen/splash-screen.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { FuseSplashScreenService } from '@fuse/services/splash-screen/splash-screen.service'; + +@NgModule({ + providers: [ + FuseSplashScreenService + ] +}) +export class FuseSplashScreenModule +{ + /** + * Constructor + */ + constructor(private _fuseSplashScreenService: FuseSplashScreenService) + { + } +} diff --git a/src/@fuse/services/splash-screen/splash-screen.service.ts b/src/@fuse/services/splash-screen/splash-screen.service.ts new file mode 100644 index 00000000..6577e44f --- /dev/null +++ b/src/@fuse/services/splash-screen/splash-screen.service.ts @@ -0,0 +1,47 @@ +import { Inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { NavigationEnd, Router } from '@angular/router'; +import { filter, take } from 'rxjs/operators'; + +@Injectable() +export class FuseSplashScreenService +{ + /** + * Constructor + */ + constructor( + @Inject(DOCUMENT) private _document: any, + private _router: Router + ) + { + // Hide it on the first NavigationEnd event + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + take(1) + ) + .subscribe(() => { + this.hide(); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Show the splash screen + */ + show(): void + { + this._document.body.classList.remove('fuse-splash-screen-hidden'); + } + + /** + * Hide the splash screen + */ + hide(): void + { + this._document.body.classList.add('fuse-splash-screen-hidden'); + } +} diff --git a/src/@fuse/services/tailwind/index.ts b/src/@fuse/services/tailwind/index.ts new file mode 100644 index 00000000..b2dad0cb --- /dev/null +++ b/src/@fuse/services/tailwind/index.ts @@ -0,0 +1 @@ +export * from '@fuse/services/media-watcher/public-api'; diff --git a/src/@fuse/services/tailwind/public-api.ts b/src/@fuse/services/tailwind/public-api.ts new file mode 100644 index 00000000..fd5905d7 --- /dev/null +++ b/src/@fuse/services/tailwind/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/services/media-watcher/media-watcher.module'; +export * from '@fuse/services/media-watcher/media-watcher.service'; diff --git a/src/@fuse/services/tailwind/tailwind.module.ts b/src/@fuse/services/tailwind/tailwind.module.ts new file mode 100644 index 00000000..1c83cdb3 --- /dev/null +++ b/src/@fuse/services/tailwind/tailwind.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { FuseTailwindService } from '@fuse/services/tailwind/tailwind.service'; + +@NgModule({ + providers: [ + FuseTailwindService + ] +}) +export class FuseTailwindConfigModule +{ + /** + * Constructor + */ + constructor(private _fuseTailwindConfigService: FuseTailwindService) + { + } +} diff --git a/src/@fuse/services/tailwind/tailwind.service.ts b/src/@fuse/services/tailwind/tailwind.service.ts new file mode 100644 index 00000000..c8340334 --- /dev/null +++ b/src/@fuse/services/tailwind/tailwind.service.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@angular/core'; +import { Observable, ReplaySubject } from 'rxjs'; +import { fromPairs, map } from 'lodash-es'; +import * as extractedTailwindConfigStyle from '@fuse/styles/core/tailwind-config.scss'; + +@Injectable() +export class FuseTailwindService +{ + private _tailwindConfig: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor() + { + // Prepare the config object + const config: any = {}; + + // Extract the style from the class + const regexpForClass = /\.fuse-tailwind-extracted-config\s\{([\s\S]*)\}/g; + const style = regexpForClass.exec(extractedTailwindConfigStyle.default)[1].trim(); + + // Extract the rules + const regexp = /(--[\s\S]*?):'([\s\S]*?)';/g; + let rules = regexp.exec(style); + + // Add to the config + while ( rules !== null ) + { + const configGroup = /--([\s\S]*?)-/g.exec(rules[1])[1]; + if ( !config[configGroup] ) + { + config[configGroup] = {}; + } + + config[configGroup][rules[1].replace(/(--[\s\S]*?-)/g, '')] = rules[2]; + rules = regexp.exec(style); + } + + // Parse the themes objects + config.themes = fromPairs(map(config.themes, (value, key) => [key, JSON.parse(value)])); + + // Execute the observable with the config + this._tailwindConfig.next(config); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for _tailwindConfig + */ + get tailwindConfig$(): Observable + { + return this._tailwindConfig.asObservable(); + } +} diff --git a/src/@fuse/services/utils/index.ts b/src/@fuse/services/utils/index.ts new file mode 100644 index 00000000..0563cafe --- /dev/null +++ b/src/@fuse/services/utils/index.ts @@ -0,0 +1 @@ +export * from '@fuse/services/config/public-api'; diff --git a/src/@fuse/services/utils/public-api.ts b/src/@fuse/services/utils/public-api.ts new file mode 100644 index 00000000..8d2a55bd --- /dev/null +++ b/src/@fuse/services/utils/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/services/utils/utils.module'; +export * from '@fuse/services/utils/utils.service'; diff --git a/src/@fuse/services/utils/utils.module.ts b/src/@fuse/services/utils/utils.module.ts new file mode 100644 index 00000000..9f974f33 --- /dev/null +++ b/src/@fuse/services/utils/utils.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { FuseUtilsService } from '@fuse/services/utils/utils.service'; + +@NgModule({ + providers: [ + FuseUtilsService + ] +}) +export class FuseUtilsModule +{ + /** + * Constructor + */ + constructor(private _fuseUtilsService: FuseUtilsService) + { + } +} diff --git a/src/@fuse/services/utils/utils.service.ts b/src/@fuse/services/utils/utils.service.ts new file mode 100644 index 00000000..643aa03f --- /dev/null +++ b/src/@fuse/services/utils/utils.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseUtilsService +{ + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Generates a random id + * + * @param length + */ + randomId(length: number = 10): string + { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let name = ''; + + for ( let i = 0; i < 10; i++ ) + { + name += chars.charAt(Math.floor(Math.random() * chars.length)); + } + + return name; + } +} diff --git a/src/@fuse/styles/components/example-viewer.scss b/src/@fuse/styles/components/example-viewer.scss new file mode 100644 index 00000000..cdee5c7e --- /dev/null +++ b/src/@fuse/styles/components/example-viewer.scss @@ -0,0 +1,48 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Example viewer +/* ----------------------------------------------------------------------------------------------------- */ +.example-viewer { + display: flex; + flex-direction: column; + margin: 32px 0; + overflow: hidden; + @apply rounded-2xl shadow bg-card; + + .title { + display: flex; + align-items: center; + justify-content: space-between; + height: 88px; + min-height: 88px; + max-height: 88px; + padding: 0 40px; + + h6 { + font-weight: 700; + } + + .controls { + display: flex; + align-items: center; + + > * + * { + margin-left: 8px; + } + } + } + + mat-tab-group { + + .mat-tab-body-content { + + .fuse-highlight { + margin: -24px; + + pre { + margin: 0; + border-radius: 0; + } + } + } + } +} diff --git a/src/@fuse/styles/components/input.scss b/src/@fuse/styles/components/input.scss new file mode 100644 index 00000000..1ae31b84 --- /dev/null +++ b/src/@fuse/styles/components/input.scss @@ -0,0 +1,41 @@ +input, +textarea { + background: transparent; + + /* Placeholder color */ + &::placeholder { + @apply text-hint; + } + + &::-moz-placeholder { + @apply text-hint; + } + + &::-webkit-input-placeholder { + @apply text-hint; + } + + &:-ms-input-placeholder { + @apply text-hint; + } + + &:-webkit-autofill { + -webkit-transition: 'background-color 9999s ease-out'; + -webkit-transition-delay: 9999s; + } + + &:-webkit-autofill:hover { + -webkit-transition: 'background-color 9999s ease-out'; + -webkit-transition-delay: 9999s; + } + + &:-webkit-autofill:focus { + -webkit-transition: 'background-color 9999s ease-out'; + -webkit-transition-delay: 9999s; + } + + &:-webkit-autofill:active { + -webkit-transition: 'background-color 9999s ease-out'; + -webkit-transition-delay: 9999s; + } +} diff --git a/src/@fuse/styles/core/tailwind-config.scss b/src/@fuse/styles/core/tailwind-config.scss new file mode 100644 index 00000000..a86224b5 --- /dev/null +++ b/src/@fuse/styles/core/tailwind-config.scss @@ -0,0 +1,6 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Any configuration we need from Tailwind's config file will be extracted here so we can import this +/* @ file from "config.ts" to access the extracted configuration from TypeScript +/* ----------------------------------------------------------------------------------------------------- */ +@variants fuse-tailwind-extracted-config { +} diff --git a/src/@fuse/styles/main.scss b/src/@fuse/styles/main.scss new file mode 100644 index 00000000..a13b2b00 --- /dev/null +++ b/src/@fuse/styles/main.scss @@ -0,0 +1,13 @@ +/* 1. Core */ +@import 'core/tailwind-config'; + +/* 2. Components */ +@import 'components/example-viewer'; +@import 'components/input'; + +/* 3. Overrides */ +@import 'overrides/angular-material'; +@import 'overrides/fullcalendar'; +@import 'overrides/highlightjs'; +@import 'overrides/perfect-scrollbar'; +@import 'overrides/quill'; diff --git a/src/@fuse/styles/overrides/angular-material.scss b/src/@fuse/styles/overrides/angular-material.scss new file mode 100644 index 00000000..9c210a05 --- /dev/null +++ b/src/@fuse/styles/overrides/angular-material.scss @@ -0,0 +1,1473 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Angular Material CDK helpers & overrides +/* ----------------------------------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Overlay +/* ----------------------------------------------------------------------------------------------------- */ +.fuse-backdrop-on-mobile { + @apply bg-black bg-opacity-60 sm:bg-transparent #{'!important'}; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Angular Material helpers & overrides +/* ----------------------------------------------------------------------------------------------------- */ + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Accordion +/* ----------------------------------------------------------------------------------------------------- */ +.mat-accordion { + + .mat-expansion-panel { + margin-bottom: 24px; + border-radius: 8px !important; + transition: box-shadow 225ms cubic-bezier(0.4, 0.0, 0.2, 1); + @apply shadow #{'!important'}; + + &:last-child { + margin-bottom: 0; + } + + &.mat-expanded, + &:hover { + @apply shadow-lg #{'!important'}; + } + + &:not(.mat-expanded) { + + .mat-expansion-panel-header { + + &:not([aria-disabled=true]) { + + &.cdk-keyboard-focused, + &.cdk-program-focused, + &:hover { + background: transparent !important; + } + } + } + } + + .mat-expansion-panel-header { + font-size: 14px; + + &[aria-disabled=true] { + + .mat-expansion-panel-header-description { + margin-right: 28px; + } + } + + .mat-expansion-indicator { + display: inline-flex; + align-items: center; + justify-content: center; + width: 12px; + height: 12px; + + /* Do not override the border color of the expansion panel indicator */ + &:after { + border-color: currentColor !important; + } + } + } + + .mat-expansion-panel-body { + line-height: 1.7; + @apply text-secondary #{'!important'}; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Buttons +/* ----------------------------------------------------------------------------------------------------- */ +.mat-button, +.mat-fab, +.mat-flat-button, +.mat-icon-button, +.mat-mini-fab, +.mat-raised-button, +.mat-stroked-button { + display: inline-flex !important; + align-items: center; + justify-content: center; + height: 40px; + min-height: 40px; + max-height: 40px; + line-height: 1 !important; + + .mat-button-wrapper { + position: relative; + display: inline-flex !important; + align-items: center; + justify-content: center; + height: 100%; + z-index: 2; /* Move mat-button-wrapper above the ripple and focus overlay */ + } + + .mat-button-focus-overlay, + .mat-button-ripple { + z-index: 1; + } + + /* Large button */ + &.fuse-mat-button-large { + height: 48px; + min-height: 48px; + max-height: 48px; + } + + /* Lower the icon opacity on disabled buttons */ + &.mat-button-disabled { + + .mat-icon { + opacity: 0.38 !important; + } + } +} + +.mat-fab { + max-height: 56px; +} + +/* Rounded design */ +.mat-button, +.mat-flat-button, +.mat-raised-button, +.mat-stroked-button { + + .fuse-mat-rounded & { + padding: 0 20px; + border-radius: 9999px; + } +} + +/* Target all buttons */ +.mat-button, +.mat-fab, +.mat-flat-button, +.mat-icon-button, +.mat-fab, +.mat-mini-fab, +.mat-raised-button, +.mat-stroked-button { + + /* mat-progress-spinner inside buttons */ + .mat-progress-spinner { + + &.mat-progress-spinner-indeterminate-animation[mode=indeterminate] { + + circle { + stroke: currentColor !important; + animation-duration: 6000ms; + } + } + } +} + +/* Colored background buttons */ +.mat-flat-button, +.mat-raised-button, +.mat-fab, +.mat-mini-fab { + + .mat-icon { + color: currentColor !important; + } + + /* Add hover and focus style on all buttons */ + .mat-button-focus-overlay { + @apply bg-gray-400 bg-opacity-20 #{'!important'}; + + .dark & { + background-color: rgba(0, 0, 0, 0.05) !important; + } + } + + /* On palette colored buttons, use a darker color */ + &.mat-primary, + &.mat-accent, + &.mat-warn { + + .mat-button-focus-overlay { + background-color: rgba(0, 0, 0, 0.1) !important; + } + } + + &:hover, + &.cdk-keyboard-focused, + &.cdk-program-focused { + + .mat-button-focus-overlay { + opacity: 1 !important; + } + } + + @media (hover: none) { + + &:hover { + + .mat-button-focus-overlay { + opacity: 0 !important; + } + } + } + + &.mat-button-disabled { + + .mat-button-focus-overlay { + opacity: 0 !important; + } + } +} + +/* Transparent background buttons */ +.mat-button, +.mat-icon-button, +.mat-stroked-button { + + /* Apply primary color */ + &.mat-primary:not(.mat-button-disabled) { + + .mat-icon { + @apply text-primary #{'!important'}; + } + } + + /* Apply accent color */ + &.mat-accent:not(.mat-button-disabled) { + + .mat-icon { + @apply text-accent #{'!important'}; + } + } + + /* Apply warn color */ + &.mat-warn:not(.mat-button-disabled) { + + .mat-icon { + @apply text-warn #{'!important'}; + } + } + + /* Add hover and focus styles */ + .mat-button-focus-overlay { + @apply bg-gray-400 bg-opacity-20 #{'!important'}; + + .dark & { + background-color: rgba(0, 0, 0, 0.05) !important; + } + } + + /* On primary colored buttons, use the primary color as focus overlay */ + &.mat-primary:not(.mat-button-disabled) { + + .mat-button-focus-overlay { + @apply bg-primary #{'!important'}; + } + } + + /* On accent colored buttons, use the accent color as focus overlay */ + &.mat-accent:not(.mat-button-disabled) { + + .mat-button-focus-overlay { + @apply bg-accent #{'!important'}; + } + } + + /* On warn colored buttons, use the warn color as focus overlay */ + &.mat-warn:not(.mat-button-disabled) { + + .mat-button-focus-overlay { + @apply bg-warn #{'!important'}; + } + } + + &.mat-primary:not(.mat-button-disabled), + &.mat-accent:not(.mat-button-disabled), + &.mat-warn:not(.mat-button-disabled) { + + &:hover, + &.cdk-keyboard-focused, + &.cdk-program-focused { + + .mat-button-focus-overlay { + opacity: 0.1 !important; + } + } + } + + &:hover, + &.cdk-keyboard-focused, + &.cdk-program-focused { + + .mat-button-focus-overlay { + opacity: 1 !important; + } + } + + @media (hover: none) { + + &:hover { + + .mat-button-focus-overlay { + opacity: 0 !important; + } + } + } + + &.mat-button-disabled { + + .mat-button-focus-overlay { + opacity: 0 !important; + } + } +} + +/* Stroked buttons */ +.mat-stroked-button { + + /* Border color */ + &:not(.mat-button-disabled) { + @apply border-gray-300 #{'!important'}; + + .dark & { + @apply border-gray-500 #{'!important'}; + } + } + + &.mat-button-disabled { + @apply border-gray-200 #{'!important'}; + + .dark & { + @apply border-gray-600 #{'!important'}; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Button Toggle +/* ----------------------------------------------------------------------------------------------------- */ +.mat-button-toggle-group { + + &.mat-button-toggle-group-appearance-standard { + + .mat-button-toggle + .mat-button-toggle { + background-clip: padding-box; + } + } +} + +/* Rounded design */ +.fuse-mat-rounded { + + .mat-button-toggle-group { + border: none !important; + @apply space-x-1; + + .mat-button-toggle { + border-radius: 9999px; + overflow: hidden; + border: none !important; + font-weight: 500; + + &.mat-button-toggle-checked { + + .mat-button-toggle-label-content { + @apply text-default #{'!important'}; + } + } + + .mat-button-toggle-label-content { + padding: 0 20px; + @apply text-secondary; + } + + .mat-ripple { + border-radius: 9999px; + } + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Checkbox +/* ----------------------------------------------------------------------------------------------------- */ +.mat-checkbox { + display: inline-flex; + + /* Allow multiline text */ + .mat-checkbox-layout { + white-space: normal; + + .mat-checkbox-inner-container { + display: inline-flex; + align-items: center; + margin: 0 8px 0 0; + + /* Add a zero-width space character to trick the container */ + /* into being the same height as a single line of the label */ + &:after { + content: '\200b'; + } + } + + .mat-checkbox-label { + line-height: inherit; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Chip +/* ----------------------------------------------------------------------------------------------------- */ +.mat-chip { + font-weight: 500 !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Drawer +/* ----------------------------------------------------------------------------------------------------- */ +.mat-drawer-backdrop.mat-drawer-shown { + background-color: rgba(0, 0, 0, 0.6) !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Form fields +/* ----------------------------------------------------------------------------------------------------- */ + +/* Fuse only uses 'fill' style form fields and therefore */ +/* only provides fixes and tweaks for that style */ +.mat-form-field.mat-form-field-appearance-fill { + + /* Disabled */ + &.mat-form-field-disabled { + opacity: 0.7 !important; + } + + /* Invalid */ + &.mat-form-field-invalid { + + .mat-form-field-wrapper { + + /* Border color */ + .mat-form-field-flex { + @apply border-warn #{'!important'}; + } + } + } + + /* Focused */ + &.mat-focused { + + .mat-form-field-wrapper { + + /* Background color */ + .mat-form-field-flex { + @apply bg-card #{'!important'}; + } + } + } + + /* Focused and valid fields */ + &.mat-focused:not(.mat-form-field-invalid) { + + .mat-form-field-wrapper { + + /* Border color */ + .mat-form-field-flex { + @apply border-primary #{'!important'}; + } + } + } + + /* Disable floating mat-label */ + &.mat-form-field-has-label.mat-form-field-can-float.mat-form-field-should-float { + + .mat-form-field-label-wrapper { + + .mat-form-field-label { + width: 100% !important; + transform: none !important; + } + } + } + + /* Remove the default arrow for native select */ + &.mat-form-field-type-mat-native-select { + + .mat-form-field-infix { + + select { + top: auto; + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-right: 18px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2364748B' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5H7z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right -7px center; + background-size: 24px; + + .dark & { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2397a6ba' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5H7z'/%3E%3C/svg%3E"); + } + } + + &:after { + display: none; + } + } + } + + /* Adjustments for mat-label */ + &.mat-form-field-has-label { + + .mat-form-field-wrapper { + margin-top: 24px; + } + } + + /* Default style tweaks and enhancements */ + .mat-form-field-wrapper { + margin-bottom: 16px; + padding-bottom: 0; + + .mat-form-field-flex { + position: relative; + display: flex; + align-items: stretch; + min-height: 48px; + border-radius: 6px; + padding: 0 16px; + border-width: 1px; + background-color: white; + @apply border-gray-300 shadow-sm #{'!important'}; + + .dark & { + background-color: rgba(0, 0, 0, 0.05) !important; + @apply border-gray-500 #{'!important'}; + } + + .mat-form-field-prefix { + + > .mat-icon { + margin-right: 12px; + } + + > .mat-icon-button { + margin: 0 4px 0 -10px; + } + + > .mat-select { + margin-right: 10px; + } + + > .mat-datepicker-toggle { + margin-left: -8px; + } + + > *:not(.mat-icon):not(.mat-icon-button):not(.mat-select):not(.mat-datepicker-toggle) { + margin-right: 12px; + } + } + + .mat-form-field-suffix { + + > .mat-icon { + margin-left: 12px; + } + + > .mat-icon-button { + margin: 0 -10px 0 4px; + } + + > .mat-select { + margin-left: 10px; + } + + > .mat-datepicker-toggle { + margin-right: -8px; + } + } + + .mat-form-field-prefix, + .mat-form-field-suffix { + display: inline-flex; + align-items: center; + justify-content: center; + @apply text-hint #{'!important'}; + + .mat-icon-button { + width: 40px; + min-width: 40px; + height: 40px; + min-height: 40px; + } + + .mat-icon, + .mat-icon-button:not(.mat-button-disabled), + .mat-select-value { + @apply text-hint; + } + + /* Remove the margins from the mat-icon if it's inside a button */ + /* Force the icon size to 24 */ + .mat-button, + .mat-raised-button, + .mat-icon-button, + .mat-stroked-button, + .mat-flat-button, + .mat-fab, + .mat-mini-fab { + + .mat-icon { + margin: 0 !important; + @apply icon-size-6; + } + } + + /* Datepicker default icon size */ + .mat-datepicker-toggle-default-icon { + @apply icon-size-6; + } + + /* Make mat-select usable as */ + /* prefix and suffix */ + .mat-select { + display: flex; + align-items: center; + + .mat-select-trigger { + display: flex; + align-items: center; + + .mat-select-value { + display: flex; + max-width: none; + + mat-select-trigger { + + .mat-icon { + margin: 0 !important; + } + } + } + + .mat-select-arrow-wrapper { + display: flex; + align-items: center; + transform: none; + margin-left: 4px; + + .mat-select-arrow { + min-height: 0; + } + } + } + } + } + + .mat-form-field-infix { + position: static; + display: flex; + align-items: center; + width: 88px; + padding: 0; + border: 0; + + .mat-input-element { + padding: 14px 0; + margin-top: 0; + } + + /* Textarea */ + textarea.mat-input-element { + display: flex; + align-self: stretch; + min-height: 36px; + height: auto; + margin: 10px 0; + padding: 4px 6px 4px 0 !important; + transform: none; + } + + /* Select */ + .mat-select { + display: inline-flex; + + .mat-select-trigger { + display: inline-flex; + align-items: center; + width: 100%; + + .mat-select-value { + display: flex; + position: relative; + max-width: none; + + .mat-select-value-text { + display: inline-flex; + + > * { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + } + } + + .mat-select-arrow-wrapper { + transform: translateY(0); + + .mat-select-arrow { + margin: 0 0 0 8px; + } + } + } + + /* Chips */ + .mat-chip-list { + width: 100%; + margin: 0 -8px; + + .mat-chip-input { + margin: 0 0 0 8px; + } + } + + .mat-form-field-label-wrapper { + top: -25px; + height: auto; + padding-top: 0; + overflow: visible; + pointer-events: auto; + + .mat-form-field-label { + position: relative; + top: 0; + margin-top: 0; + backface-visibility: hidden; + transition: none; + font-weight: 500; + @apply text-default #{'!important'}; + } + } + } + } + + /* Remove the underline */ + .mat-form-field-underline { + display: none; + } + + /* Subscript tweaks */ + .mat-form-field-subscript-wrapper { + position: relative; + top: auto; + padding: 0; + margin-top: 0; + font-size: 12px; + font-weight: 500; + line-height: 1; + + > div { + display: contents; /* Remove the div from flow to stop the subscript animation */ + } + + .mat-error, + .mat-hint { + display: block; + margin-top: 4px; + } + + .mat-hint { + @apply text-hint #{'!important'}; + } + } + } + + /* Adds better alignment for textarea inputs */ + &.fuse-mat-textarea { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-prefix, + .mat-form-field-suffix { + align-items: flex-start; + } + + .mat-form-field-prefix { + padding-top: 12px; + } + + .mat-form-field-suffix { + padding-top: 12px; + } + } + } + } + + /* Removes subscript space */ + &.fuse-mat-no-subscript { + + .mat-form-field-wrapper { + padding-bottom: 0; + margin-bottom: 0; + + .mat-form-field-subscript-wrapper { + display: none !important; + height: 0 !important; + } + } + } + + /* Rounded */ + &.fuse-mat-rounded { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + border-radius: 24px; + } + } + + /* Emphasized affix */ + &.fuse-mat-emphasized-affix { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-prefix { + border-radius: 24px 0 0 24px; + + > .mat-icon { + margin-right: 12px; + } + + > .mat-icon-button { + margin-right: 2px; + } + + > .mat-select { + margin-right: 8px; + } + + > .mat-datepicker-toggle { + margin-right: 4px; + } + + > *:not(.mat-icon):not(.mat-icon-button):not(.mat-select):not(.mat-datepicker-toggle) { + margin-right: 12px; + } + } + + .mat-form-field-suffix { + border-radius: 0 24px 24px 0; + + > .mat-icon { + margin-left: 12px !important; + } + + > .mat-icon-button { + margin-left: 2px !important; + } + + > .mat-select { + margin-left: 12px !important; + } + + > .mat-datepicker-toggle { + margin-left: 4px !important; + } + + > *:not(.mat-icon):not(.mat-icon-button):not(.mat-select):not(.mat-datepicker-toggle) { + margin-left: 12px !important; + } + } + } + } + } + } + + /* Dense */ + &.fuse-mat-dense { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + min-height: 40px; + + .mat-form-field-prefix, + .mat-form-field-suffix { + + .mat-icon-button { + width: 32px; + min-width: 32px; + height: 32px; + min-height: 32px; + } + } + + .mat-form-field-prefix { + + > .mat-icon-button { + margin-left: -6px; + margin-right: 12px; + } + } + + .mat-form-field-suffix { + + > .mat-icon-button { + margin-left: 12px; + margin-right: -6px; + } + } + + .mat-form-field-infix { + + .mat-input-element { + padding: 11px 0; + } + } + } + } + + /* Rounded */ + &.fuse-mat-rounded { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + border-radius: 20px; + } + } + + /* Emphasized affix */ + &.fuse-mat-emphasized-affix { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-prefix { + border-radius: 20px 0 0 20px !important; + } + + .mat-form-field-suffix { + border-radius: 0 20px 20px 0 !important; + } + } + } + } + } + } + + /* Emphasized affix */ + &.fuse-mat-emphasized-affix { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-prefix { + margin: 0 16px 0 -16px; + padding-left: 16px; + border-radius: 6px 0 0 6px; + border-right-width: 1px; + + > .mat-icon { + margin-right: 16px; + } + + > .mat-icon-button { + margin: 0 6px 0 -10px; + } + + > .mat-select { + margin-right: 12px; + } + + > .mat-datepicker-toggle { + margin-right: 8px; + } + + > *:not(.mat-icon):not(.mat-icon-button):not(.mat-select):not(.mat-datepicker-toggle) { + margin-right: 16px; + } + } + + .mat-form-field-suffix { + margin: 0 -16px 0 16px; + padding-right: 16px; + border-radius: 0 6px 6px 0; + border-left-width: 1px; + + > .mat-icon { + margin-left: 16px; + } + + > .mat-icon-button { + margin: 0 -10px 0 6px; + } + + > .mat-select { + margin: 0 -4px 0 16px; + } + + > .mat-datepicker-toggle { + margin-left: 8px; + } + + > *:not(.mat-icon):not(.mat-icon-button):not(.mat-select):not(.mat-datepicker-toggle) { + margin-left: 16px; + } + } + + .mat-form-field-prefix, + .mat-form-field-suffix { + @apply border-gray-300 bg-default #{'!important'}; + + .dark & { + @apply border-gray-500 #{'!important'}; + } + } + } + } + } + + /* Bolder border width */ + &.fuse-mat-bold { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + border-width: 2px !important; + } + } + } +} + +/* Fix the outline appearance */ +.mat-form-field.mat-form-field-appearance-outline { + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-outline { + @apply text-gray-300 dark:text-gray-500 #{'!important'}; + } + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Datepicker +/* ----------------------------------------------------------------------------------------------------- */ +/* Hover and active cell content background opacity */ +.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover, +.cdk-keyboard-focused .mat-calendar-body-active, +.cdk-program-focused .mat-calendar-body-active { + & > .mat-calendar-body-cell-content { + &:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical) { + @apply bg-primary bg-opacity-30 #{'!important'}; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Icon +/* ----------------------------------------------------------------------------------------------------- */ +.mat-icon { + display: inline-flex !important; + align-items: center; + justify-content: center; + width: 24px; + min-width: 24px; + height: 24px; + min-height: 24px; + font-size: 24px; + line-height: 24px; + -webkit-appearance: none !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Inputs +/* ----------------------------------------------------------------------------------------------------- */ +.mat-input-element { + + &::placeholder { + transition: none !important; + @apply text-hint #{'!important'}; + } + + &::-moz-placeholder { + transition: none !important; + @apply text-hint #{'!important'}; + } + + &::-webkit-input-placeholder { + transition: none !important; + @apply text-hint #{'!important'}; + } + + &:-ms-input-placeholder { + transition: none !important; + @apply text-hint #{'!important'}; + } +} + +/* Invalid */ +.mat-form-field-invalid { + + .mat-input-element { + + /* Placeholder color */ + &::placeholder { + @apply text-warn #{'!important'}; + } + + &::-moz-placeholder { + @apply text-warn #{'!important'}; + } + + &::-webkit-input-placeholder { + @apply text-warn #{'!important'}; + } + + &:-ms-input-placeholder { + @apply text-warn #{'!important'}; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Menu +/* ----------------------------------------------------------------------------------------------------- */ +.mat-menu-panel { + min-width: 144px !important; + + .mat-menu-content { + + .mat-menu-item { + display: flex; + align-items: center; + + &.mat-menu-item-submenu-trigger { + padding-right: 40px; + } + + .mat-icon { + margin-right: 12px; + } + } + + /* Divider within mat-menu */ + mat-divider { + margin: 8px 0; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Paginator +/* ----------------------------------------------------------------------------------------------------- */ +.mat-paginator { + + .mat-paginator-container { + padding: 8px 16px; + justify-content: space-between; + + @screen sm { + justify-content: normal; + } + + /* Page size select */ + .mat-paginator-page-size { + align-items: center; + min-height: 40px; + margin: 8px; + + .mat-paginator-page-size-label { + display: none; + margin-right: 12px; + + @screen sm { + display: block; + } + } + + .mat-paginator-page-size-select { + margin: 0; + + .mat-form-field-wrapper { + margin-bottom: 0; + + .mat-form-field-flex { + min-height: 32px; + padding: 0 10px; + } + } + } + } + + /* Range actions */ + .mat-paginator-range-actions { + margin: 8px 0; + + .mat-paginator-range-label { + margin-right: 16px; + } + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Select +/* ----------------------------------------------------------------------------------------------------- */ +.mat-select { + display: inline-flex; + + .mat-select-placeholder { + transition: none !important; + @apply text-hint #{'!important'}; + } + + .mat-select-trigger { + display: inline-flex; + align-items: center; + width: 100%; + height: auto; + + .mat-select-value { + display: flex; + position: relative; + max-width: none; + + .mat-select-value-text { + display: inline-flex; + + > * { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + } + } + + .mat-select-arrow-wrapper { + transform: translateY(0); + + .mat-select-arrow { + margin: 0 4px 0 2px; + } + } +} + +/* Invalid */ +.mat-form-field-invalid { + + .mat-select { + + /* Placeholder color */ + .mat-select-placeholder { + @apply text-warn #{'!important'}; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Slide Toggle +/* ----------------------------------------------------------------------------------------------------- */ +.mat-slide-toggle.mat-checked .mat-slide-toggle-bar { + background-color: rgba(var(--fuse-accent-500-rgb), 0.54) !important; +} + +.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar { + background-color: rgba(var(--fuse-primary-500-rgb), 0.54) !important; +} + +.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar { + background-color: rgba(var(--fuse-warn-500-rgb), 0.54) !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Stepper +/* ----------------------------------------------------------------------------------------------------- */ +.mat-step-icon { + + /* Do not override the mat-icon color */ + .mat-icon { + color: currentColor !important; + } +} + +.mat-step-label, +.mat-step-label-selected { + font-weight: 500 !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Tabs +/* ----------------------------------------------------------------------------------------------------- */ +.mat-tab-group { + + /* No header */ + &.fuse-mat-no-header { + + .mat-tab-header { + height: 0 !important; + max-height: 0 !important; + border: none !important; + visibility: hidden !important; + opacity: 0 !important; + } + } +} + +.mat-tab-label { + opacity: 1 !important; +} + +/* Rounded design */ +.fuse-mat-rounded { + + .mat-tab-group { + + .mat-tab-header { + border-bottom: none !important; + + .mat-tab-label-container { + padding: 0 24px; + + .mat-tab-list { + + .mat-tab-labels { + + .mat-tab-label { + min-width: 0 !important; + height: 40px !important; + padding: 0 20px !important; + border-radius: 9999px !important; + @apply text-secondary; + + &.mat-tab-label-active { + @apply bg-gray-700 bg-opacity-10 dark:bg-gray-50 dark:bg-opacity-10 #{'!important'}; + @apply text-default #{'!important'}; + } + + + .mat-tab-label { + margin-left: 4px; + } + + .mat-tab-label-content { + line-height: 20px; + } + } + } + + .mat-ink-bar { + display: none !important; + } + } + } + } + + .mat-tab-body-content { + padding: 24px; + } + } +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Textarea +/* ----------------------------------------------------------------------------------------------------- */ +textarea.mat-input-element { + box-sizing: content-box !important; +} + +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Toolbar +/* ----------------------------------------------------------------------------------------------------- */ +.mat-toolbar { + + /* Apply primary contrast color */ + &.mat-primary { + + .mat-icon { + @apply text-on-primary #{'!important'}; + } + + .text-secondary { + @apply text-on-primary text-opacity-60 #{'!important'}; + } + + .text-hint { + @apply text-on-primary text-opacity-38 #{'!important'}; + } + + .text-disabled { + @apply text-on-primary text-opacity-38 #{'!important'}; + } + + .divider { + @apply text-on-primary text-opacity-12 #{'!important'}; + } + } + + /* Apply accent contrast color */ + &.mat-accent { + + .mat-icon { + @apply text-on-accent #{'!important'}; + } + + .text-secondary { + @apply text-on-accent text-opacity-60 #{'!important'}; + } + + .text-hint { + @apply text-on-accent text-opacity-38 #{'!important'}; + } + + .text-disabled { + @apply text-on-accent text-opacity-38 #{'!important'}; + } + + .divider { + @apply text-on-accent text-opacity-12 #{'!important'}; + } + } + + /* Apply warn contrast color */ + &.mat-warn { + + .mat-icon { + @apply text-on-warn #{'!important'}; + } + + .text-secondary { + @apply text-on-warn text-opacity-60 #{'!important'}; + } + + .text-hint { + @apply text-on-warn text-opacity-38 #{'!important'}; + } + + .text-disabled { + @apply text-on-warn text-opacity-38 #{'!important'}; + } + + .divider { + @apply text-on-warn text-opacity-12 #{'!important'}; + } + } +} diff --git a/src/@fuse/styles/overrides/fullcalendar.scss b/src/@fuse/styles/overrides/fullcalendar.scss new file mode 100644 index 00000000..631c2a41 --- /dev/null +++ b/src/@fuse/styles/overrides/fullcalendar.scss @@ -0,0 +1,680 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ FullCalendar overrides +/* ----------------------------------------------------------------------------------------------------- */ +.fc { + + .fc-view-container { + + /* Day Grid - Month view */ + .fc-view.fc-dayGridMonth-view { + + .fc-head { + + > tr > .fc-head-container { + border: none; + + .fc-row { + + .fc-day-header { + border-color: var(--fuse-divider); + + span { + display: flex; + align-items: center; + justify-content: center; + padding-top: 8px; + font-size: 12px; + font-weight: 500; + text-transform: uppercase; + @apply text-secondary; + } + } + } + } + } + + .fc-body { + + > tr > .fc-widget-content { + border: none; + + .fc-day-grid { + + .fc-week { + + .fc-bg { + + .fc-day { + border-color: var(--fuse-divider); + + &.fc-today { + background: none; + } + } + } + + .fc-content-skeleton { + + .fc-day-top { + text-align: center; + + &.fc-other-month { + opacity: 1; + + .fc-day-number { + @apply text-hint; + } + } + + &.fc-today { + + .fc-day-number { + @apply bg-primary text-on-primary; + } + } + + .fc-day-number { + display: inline-flex; + align-items: center; + justify-content: center; + width: 22px; + height: 21px; + margin: 4px 0; + font-size: 12px; + border-radius: 50%; + float: none; + } + } + + .fc-event-container { + + .fc-day-grid-event { + display: flex; + align-items: center; + height: 22px; + min-height: 22px; + max-height: 22px; + margin: 0 6px 4px 6px; + padding: 0 5px; + font-size: 12px; + border-radius: 4px; + border: none; + cursor: pointer; + + @screen sm { + padding: 0 8px; + } + } + } + + .fc-more { + padding: 0 3px; + font-size: 12px; + font-weight: 500; + white-space: nowrap; + @apply text-secondary; + + @screen sm { + padding: 0 6px; + } + } + } + + .fc-highlight-skeleton { + + .fc-highlight { + position: relative; + opacity: 1; + @apply bg-gray-100; + } + } + } + } + } + } + + .fc-popover { + @apply bg-card; + + &.fc-more-popover { + border: none; + border-radius: 4px; + @apply shadow-2xl; + + .fc-header { + height: 32px; + min-height: 32px; + max-height: 32px; + padding: 0 8px; + @apply bg-hover; + + .fc-title { + margin: 0; + padding: 0; + font-size: 12px; + } + } + + .fc-body { + max-height: 160px; + overflow: hidden auto; + + .fc-event-container { + padding: 8px; + + .fc-day-grid-event { + display: flex; + align-items: center; + height: 22px; + min-height: 22px; + max-height: 22px; + margin: 0 0 6px 0; + padding: 0 8px; + font-size: 12px; + line-height: 1; + border-radius: 4px; + border: none; + cursor: pointer; + + &:last-child { + margin-bottom: 0; + } + } + } + } + } + } + } + + /* Time Grid - Week view */ + .fc-view.fc-timeGridWeek-view { + + .fc-head { + + > tr > .fc-head-container { + border: none; + + .fc-row { + + .fc-axis { + width: 48px !important; + border-color: var(--fuse-divider); + } + + .fc-day-header { + border-color: var(--fuse-divider); + + span { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + @apply text-secondary; + + &.fc-weekday { + padding-top: 16px; + font-size: 12px; + letter-spacing: 0.055em; + text-transform: uppercase; + font-weight: 400; + } + + &.fc-date { + padding-bottom: 12px; + font-size: 26px; + font-weight: 300; + } + } + } + } + } + } + + .fc-body { + + > tr > .fc-widget-content { + border: none; + + .fc-day-grid { + + .fc-row { + min-height: 0; + + .fc-bg { + + .fc-axis { + width: 48px !important; + border-color: var(--fuse-divider); + } + + .fc-day { + border-color: var(--fuse-divider); + + &.fc-today { + background: none; + } + } + } + + .fc-content-skeleton { + padding-bottom: 0; + + .fc-axis { + width: 48px !important; + } + + .fc-event-container { + + .fc-day-grid-event { + display: flex; + align-items: center; + height: 22px; + min-height: 22px; + max-height: 22px; + margin: 0 6px 6px 6px; + padding: 0 8px; + font-size: 12px; + line-height: 1; + border-radius: 4px; + border: none; + cursor: pointer; + } + } + } + } + } + + .fc-divider { + border: none; + background: var(--fuse-divider); + } + + .fc-time-grid { + + .fc-bg { + + .fc-axis { + border: none; + width: 48px !important; + + + .fc-day { + border: none; + } + } + + .fc-day { + border-color: var(--fuse-divider); + + &.fc-today { + background: none; + } + } + } + + .fc-slats { + + .fc-axis { + width: 48px !important; + height: 48px; + text-align: center; + + span { + font-size: 12px; + width: 48px; + min-width: 48px; + } + } + + .fc-time { + border-color: var(--fuse-divider); + } + + .fc-widget-content { + border-color: var(--fuse-divider); + } + } + + .fc-content-skeleton { + + .fc-axis { + width: 48px !important; + } + + .fc-event-container { + margin: 0 12px 0 0; + + .fc-time-grid-event { + display: flex; + padding: 8px; + border-radius: 4px; + border: none; + cursor: pointer; + + .fc-time, + .fc-title { + font-size: 12px; + } + } + } + } + } + } + } + } + + /* Time Grid - Day view */ + .fc-view.fc-timeGridDay-view { + + .fc-head { + + > tr > .fc-head-container { + border: none; + + .fc-row { + + .fc-axis { + width: 48px !important; + border-color: var(--fuse-divider); + } + + .fc-day-header { + border-color: var(--fuse-divider); + + span { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + @apply text-secondary; + + &.fc-weekday { + padding-top: 16px; + font-size: 12px; + letter-spacing: 0.055em; + text-transform: uppercase; + font-weight: 400; + } + + &.fc-date { + padding-bottom: 12px; + font-size: 26px; + font-weight: 300; + } + } + } + } + } + } + + .fc-body { + + > tr > .fc-widget-content { + border: none; + + .fc-day-grid { + + .fc-bg { + + .fc-axis { + border-color: var(--fuse-divider); + } + + .fc-day { + border-color: var(--fuse-divider); + + &.fc-today { + background: none; + } + } + } + + .fc-row { + min-height: 0; + + .fc-bg { + + .fc-axis { + width: 48px !important; + } + } + + .fc-content-skeleton { + padding-bottom: 0; + + .fc-axis { + width: 48px !important; + } + + .fc-event-container { + + .fc-day-grid-event { + display: flex; + align-items: center; + height: 22px; + min-height: 22px; + max-height: 22px; + margin: 0 6px 6px 6px; + padding: 0 8px; + font-size: 12px; + line-height: 1; + border-radius: 4px; + border: none; + cursor: pointer; + } + } + } + } + } + + .fc-divider { + border: none; + border-color: var(--fuse-divider); + } + + .fc-time-grid { + + .fc-bg { + + .fc-day { + border-color: var(--fuse-divider); + + &.fc-today { + background: none; + } + } + + .fc-axis { + border: none; + width: 48px !important; + + + .fc-day { + border: none; + } + } + } + + .fc-slats { + + .fc-axis { + width: 48px !important; + height: 48px; + text-align: center; + + span { + font-size: 12px; + width: 48px; + min-width: 48px; + } + } + + .fc-time { + border-color: var(--fuse-divider); + } + + .fc-widget-content { + border-color: var(--fuse-divider); + } + } + + .fc-content-skeleton { + + .fc-axis { + width: 48px !important; + } + + .fc-event-container { + margin: 0 12px 0 0; + + .fc-time-grid-event { + display: flex; + padding: 8px; + border-radius: 4px; + border: none; + cursor: pointer; + + .fc-time, + .fc-title { + font-size: 12px; + } + } + } + } + } + } + } + } + + /* List - Year view */ + .fc-view.fc-listYear-view { + border: none; + + .fc-list-table { + + .fc-list-heading { + display: none; + } + + .fc-list-item { + display: flex; + cursor: pointer; + + &:hover { + + td { + @apply bg-hover; + } + } + + td { + display: flex; + align-items: center; + width: auto; + height: 48px; + min-height: 48px; + padding: 0 8px; + border-width: 0 0 1px 0; + border-color: var(--fuse-divider); + + &.fc-list-item-date { + order: 1; + padding-left: 16px; + width: 100px; + min-width: 100px; + max-width: 100px; + + @screen sm { + width: 120px; + min-width: 120px; + max-width: 120px; + } + + > span { + display: flex; + align-items: baseline; + + span { + + &:first-child { + display: flex; + justify-content: center; + padding-right: 2px; + width: 32px; + min-width: 32px; + max-width: 32px; + font-size: 18px; + + @screen sm { + padding-right: 8px; + } + + + span { + display: flex; + font-size: 11px; + font-weight: 500; + letter-spacing: 0.055em; + text-transform: uppercase; + @apply text-secondary; + } + } + } + } + } + + &.fc-list-item-time { + flex: 0 0 auto; + order: 3; + width: 120px; + min-width: 120px; + max-width: 120px; + + @screen sm { + width: 160px; + min-width: 160px; + max-width: 160px; + } + } + + &.fc-list-item-marker { + flex: 0 0 auto; + order: 2; + + .fc-event-dot { + width: 12px; + height: 12px; + border-radius: 50%; + } + } + + &.fc-list-item-title { + flex: 1 1 auto; + order: 4; + padding-right: 24px; + font-weight: 500; + } + } + } + } + } + } + + /* Day grid event - Dragging */ + .fc-day-grid-event { + + &.fc-dragging, + &.fc-resizing { + display: flex; + align-items: center; + height: 22px; + min-height: 22px; + max-height: 22px; + margin: 0 6px 4px 6px; + padding: 0 8px; + font-size: 12px; + line-height: 1; + border-radius: 4px; + border: none; + } + } +} diff --git a/src/@fuse/styles/overrides/highlightjs.scss b/src/@fuse/styles/overrides/highlightjs.scss new file mode 100644 index 00000000..120ef830 --- /dev/null +++ b/src/@fuse/styles/overrides/highlightjs.scss @@ -0,0 +1,82 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Highlight.js overrides +/* ----------------------------------------------------------------------------------------------------- */ +code[class*='language-'], +pre[class*='language-'] { + + .hljs-comment, + .hljs-quote { + color: #8B9FC1; + font-style: italic; + } + + .hljs-doctag, + .hljs-keyword, + .hljs-formula { + color: #22D3EE; + } + + .hljs-name { + color: #E879F9; + } + + .hljs-tag { + color: #BAE6FD; + } + + .hljs-section, + .hljs-selector-tag, + .hljs-deletion, + .hljs-subst { + color: #F87F71; + } + + .hljs-literal { + color: #36BEFF; + } + + .hljs-string, + .hljs-regexp, + .hljs-addition, + .hljs-attribute, + .hljs-meta-string { + color: #BEF264; + } + + .hljs-built_in, + .hljs-class .hljs-title { + color: #FFD374; + } + + .hljs-attr, + .hljs-variable, + .hljs-template-variable, + .hljs-type, + .hljs-selector-class, + .hljs-selector-attr, + .hljs-selector-pseudo, + .hljs-number { + color: #22D3EE; + } + + .hljs-symbol, + .hljs-bullet, + .hljs-link, + .hljs-meta, + .hljs-selector-id, + .hljs-title { + color: #E879F9; + } + + .hljs-emphasis { + font-style: italic; + } + + .hljs-strong { + font-weight: 700; + } + + .hljs-link { + text-decoration: underline; + } +} diff --git a/src/@fuse/styles/overrides/perfect-scrollbar.scss b/src/@fuse/styles/overrides/perfect-scrollbar.scss new file mode 100644 index 00000000..586b47dc --- /dev/null +++ b/src/@fuse/styles/overrides/perfect-scrollbar.scss @@ -0,0 +1,69 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Perfect scrollbar overrides +/* ----------------------------------------------------------------------------------------------------- */ +.ps { + position: relative; + + &:hover, + &.ps--focus, + &.ps--scrolling-x, + &.ps--scrolling-y { + + > .ps__rail-x, + > .ps__rail-y { + opacity: 1; + } + } + + > .ps__rail-x, + > .ps__rail-y { + z-index: 99999; + } + + > .ps__rail-x { + height: 14px; + background: transparent !important; + transition: none !important; + + &:hover, + &:focus, + &.ps--clicking { + opacity: 1; + + .ps__thumb-x { + height: 10px; + } + } + + .ps__thumb-x { + background: rgba(0, 0, 0, 0.5); + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15); + height: 6px; + transition: height 225ms cubic-bezier(0.25, 0.8, 0.25, 1); + } + } + + > .ps__rail-y { + width: 14px; + background: transparent !important; + transition: none !important; + left: auto !important; + + &:hover, + &:focus, + &.ps--clicking { + opacity: 1; + + .ps__thumb-y { + width: 10px; + } + } + + .ps__thumb-y { + background: rgba(0, 0, 0, 0.5); + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15); + width: 6px; + transition: width 225ms cubic-bezier(0.25, 0.8, 0.25, 1); + } + } +} diff --git a/src/@fuse/styles/overrides/quill.scss b/src/@fuse/styles/overrides/quill.scss new file mode 100644 index 00000000..bb5ee369 --- /dev/null +++ b/src/@fuse/styles/overrides/quill.scss @@ -0,0 +1,108 @@ +/* ----------------------------------------------------------------------------------------------------- */ +/* @ Quill editor overrides +/* ----------------------------------------------------------------------------------------------------- */ +.ql-toolbar { + border-radius: 6px 6px 0 0; + padding: 0 !important; + @apply bg-gray-100 border-gray-300; + + .dark & { + background-color: rgba(0, 0, 0, 0.05); + @apply border-gray-500; + } + + .ql-formats { + margin: 11px 8px !important; + } + + .ql-picker { + + &.ql-expanded { + + .ql-picker-label { + @apply border-gray-300; + + .dark & { + @apply border-gray-500; + } + } + + .ql-picker-options { + z-index: 10 !important; + @apply border-gray-300 bg-card; + + .dark & { + @apply border-gray-500; + } + } + } + + .ql-picker-label { + @apply text-default; + } + + .ql-picker-options { + + .ql-picker-item { + @apply text-default; + } + } + } + + .ql-stroke, + .ql-stroke-mitter { + stroke: var(--fuse-icon); + } + + .ql-fill { + fill: var(--fuse-icon); + } + + button:hover, + button:focus, + button.ql-active, + .ql-picker-label:hover, + .ql-picker-label.ql-active, + .ql-picker-item:hover, + .ql-picker-item.ql-selected { + @apply text-primary #{'!important'}; + + .ql-stroke, + .ql-stroke-mitter { + stroke: var(--fuse-primary) !important; + } + + .ql-fill { + fill: var(--fuse-primary) !important; + } + } +} + +.ql-container { + overflow: hidden; + border-radius: 0 0 6px 6px; + @apply border-gray-300 shadow-sm; + + .dark & { + @apply border-gray-500; + } + + .ql-editor { + min-height: 160px; + max-height: 160px; + height: 160px; + @apply bg-gray-50; + + .dark & { + background-color: rgba(0, 0, 0, 0.05); + } + + &:focus { + @apply bg-card; + } + + &.ql-blank::before { + @apply text-hint; + } + } +} diff --git a/src/@fuse/styles/tailwind.scss b/src/@fuse/styles/tailwind.scss new file mode 100644 index 00000000..e4d823f9 --- /dev/null +++ b/src/@fuse/styles/tailwind.scss @@ -0,0 +1,98 @@ +/* This injects Tailwind's base styles and any base styles registered by plugins. */ +@tailwind base; + +/* This injects additional styles into Tailwind's base styles layer. */ +@layer base { + + * { + /* Text rendering */ + text-rendering: optimizeLegibility; + -o-text-rendering: optimizeLegibility; + -ms-text-rendering: optimizeLegibility; + -moz-text-rendering: optimizeLegibility; + -webkit-text-rendering: optimizeLegibility; + -webkit-tap-highlight-color: transparent; + + /* Remove the focus ring */ + &:focus { + outline: none !important; + } + } + + /* HTML and Body default styles */ + html, + body { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + min-height: 100%; + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: auto; + } + + /* Font size */ + html { + font-size: 16px; + } + + body { + font-size: 0.875rem; + } + + /* Stylistic alternates for Inter */ + body { + font-feature-settings: 'salt'; + } + + /* Better spacing and border for horizontal rule */ + hr { + margin: 32px 0; + border-bottom-width: 1px; + } + + /* Make images and videos to take up all the available space */ + img { + width: 100%; + vertical-align: top; + } + + /* Fix: Disabled placeholder color is too faded on Safari */ + input[disabled] { + opacity: 1; + -webkit-text-fill-color: currentColor; + } + + body, .dark, .light { + @apply text-default bg-default #{'!important'}; + } + + *, *::before, *::after { + --tw-border-opacity: 1 !important; + border-color: rgba(var(--fuse-border-rgb), var(--tw-border-opacity)); + + .dark & { + --tw-border-opacity: 0.12 !important; + } + } + + [disabled] * { + @apply text-disabled #{'!important'}; + } + + /* Print styles */ + @media print { + + /* Make the base font size smaller for print so everything is scaled nicely */ + html { + font-size: 12px !important; + } + + body, .dark, .light { + background: none !important; + } + } +} + +/* This injects Tailwind's component classes and any component classes registered by plugins. */ +@tailwind components; diff --git a/src/@fuse/styles/themes.scss b/src/@fuse/styles/themes.scss new file mode 100644 index 00000000..2ccd61c9 --- /dev/null +++ b/src/@fuse/styles/themes.scss @@ -0,0 +1,190 @@ +@use "sass:map"; +@import '~@angular/material/theming'; + +/** Include the core Angular Material styles */ +@include mat-core(); + +/** Configure the Angular Material typography */ +@include angular-material-typography( + mat-typography-config( + $font-family: theme('fontFamily.sans'), + $title: mat-typography-level(1.25rem, 2rem, 600), + $body-2: mat-typography-level(0.875rem, 1.5rem, 600), + $button: mat-typography-level(0.875rem, 0.875rem, 500), + $input: mat-typography-level(0.875rem, 1.2857142857, 400) // line-height: 20px + ) +); + +/** Configure the Angular Material density **/ +@include angular-material-density(-2); + +/** Prepare the Background and Foreground maps */ +$background-light: ( + status-bar: #CBD5E1, /* blueGray.300 */ + app-bar: #FFFFFF, + background: #F1F5F9, /* blueGray.100 */ + hover: rgba(148, 163, 184, 0.12), /* blueGray.400 + opacity */ + card: #FFFFFF, + dialog: #FFFFFF, + disabled-button: rgba(148, 163, 184, 0.38), /* blueGray.400 + opacity */ + raised-button: #FFFFFF, + focused-button: #64748B, /* blueGray.500 */ + selected-button: #E2E8F0, /* blueGray.200 */ + selected-disabled-button: #E2E8F0, /* blueGray.200 */ + disabled-button-toggle: #CBD5E1, /* blueGray.300 */ + unselected-chip: #E2E8F0, /* blueGray.200 */ + disabled-list-option: #CBD5E1, /* blueGray.300 */ + tooltip: #1E293B /* blueGray.800 */ +); + +$background-dark: ( + status-bar: #0F172A, /* blueGray.900 */ + app-bar: #0F172A, /* blueGray.900 */ + background: #0F172A, /* blueGray.900 */ + hover: rgba(255, 255, 255, 0.05), + card: #1E293B, /* blueGray.800 */ + dialog: #1E293B, /* blueGray.800 */ + disabled-button: rgba(15, 23, 42, 0.38), /* blueGray.900 + opacity */ + raised-button: #0F172A, /* blueGray.900 */ + focused-button: #E2E8F0, /* blueGray.200 */ + selected-button: rgba(255, 255, 255, 0.05), + selected-disabled-button: #1E293B, /* blueGray.800 */ + disabled-button-toggle: #0F172A, /* blueGray.900 */ + unselected-chip: #475569, /* blueGray.600 */ + disabled-list-option: #E2E8F0, /* blueGray.200 */ + tooltip: #64748B /* blueGray.500 */ +); + +$foreground-light: ( + base: #000000, + divider: #E2E8F0, /* blueGray.200 */ + dividers: #E2E8F0, /* blueGray.200 */ + disabled: #94A3B8, /* blueGray.400 */ + disabled-button: #94A3B8, /* blueGray.400 */ + disabled-text: #94A3B8, /* blueGray.400 */ + elevation: #000000, + hint-text: #94A3B8, /* blueGray.400 */ + secondary-text: #64748B, /* blueGray.500 */ + icon: #64748B, /* blueGray.500 */ + icons: #64748B, /* blueGray.500 */ + mat-icon: #64748B, /* blueGray.500 */ + text: #1E293B, /* blueGray.800 */ + slider-min: #1E293B, /* blueGray.800 */ + slider-off: #CBD5E1, /* blueGray.300 */ + slider-off-active: #94A3B8 /* blueGray.400 */ +); + +$foreground-dark: ( + base: #FFFFFF, + divider: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */ + dividers: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */ + disabled: #475569, /* blueGray.600 */ + disabled-button: #1E293B, /* blueGray.800 */ + disabled-text: #475569, /* blueGray.600 */ + elevation: #000000, + hint-text: #64748B, /* blueGray.500 */ + secondary-text: #94A3B8, /* blueGray.400 */ + icon: #F1F5F9, /* blueGray.100 */ + icons: #F1F5F9, /* blueGray.100 */ + mat-icon: #94A3B8, /* blueGray.400 */ + text: #FFFFFF, + slider-min: #FFFFFF, + slider-off: #64748B, /* blueGray.500 */ + slider-off-active: #94A3B8 /* blueGray.400 */ +); + +/** Generate Primary, Accent and Warn palettes */ +$palettes: (); +@each $name in (primary, accent, warn) { + $palettes: map.merge($palettes, (#{$name}: ( + 50: var(--fuse-#{$name}-50), + 100: var(--fuse-#{$name}-100), + 200: var(--fuse-#{$name}-200), + 300: var(--fuse-#{$name}-300), + 400: var(--fuse-#{$name}-400), + 500: var(--fuse-#{$name}-500), + 600: var(--fuse-#{$name}-600), + 700: var(--fuse-#{$name}-700), + 800: var(--fuse-#{$name}-800), + 900: var(--fuse-#{$name}-900), + contrast: ( + 50: var(--fuse-on-#{$name}-50), + 100: var(--fuse-on-#{$name}-100), + 200: var(--fuse-on-#{$name}-200), + 300: var(--fuse-on-#{$name}-300), + 400: var(--fuse-on-#{$name}-400), + 500: var(--fuse-on-#{$name}-500), + 600: var(--fuse-on-#{$name}-600), + 700: var(--fuse-on-#{$name}-700), + 800: var(--fuse-on-#{$name}-800), + 900: var(--fuse-on-#{$name}-900) + ), + default: var(--fuse-#{$name}), + lighter: var(--fuse-#{$name}-100), + darker: var(--fuse-#{$name}-700), + text: var(--fuse-#{$name}), + default-contrast: var(--fuse-on-#{$name}), + lighter-contrast: var(--fuse-on-#{$name}-100), + darker-contrast: var(--fuse-on-#{$name}-700) + ))); +} + +/** Generate Angular Material themes. Since we are using CSS Custom Properties, + we don't have to generate a separate Angular Material theme for each color + set. We can just create one light and one dark theme and then switch the + CSS Custom Properties to dynamically switch the colors. */ +body.light, +body .light { + $base-light-theme: mat-light-theme(( + color: ($palettes) + )); + + $light-theme: ( + color: ( + primary: map.get(map.get($base-light-theme, color), primary), + accent: map.get(map.get($base-light-theme, color), accent), + warn: map.get(map.get($base-light-theme, color), warn), + is-dark: map.get(map.get($base-light-theme, color), is-dark), + foreground: $foreground-light, + background: $background-light + ), + typography: null, + density: null, + primary: map.get(map.get($base-light-theme, color), primary), + accent: map.get(map.get($base-light-theme, color), accent), + warn: map.get(map.get($base-light-theme, color), warn), + is-dark: map.get(map.get($base-light-theme, color), is-dark), + foreground: $foreground-light, + background: $background-light + ); + + @include angular-material-theme($light-theme); +} + +body.dark, +body .dark { + $base-dark-theme: mat-dark-theme(( + color: ($palettes) + )); + + $dark-theme: ( + color: ( + primary: map.get(map.get($base-dark-theme, color), primary), + accent: map.get(map.get($base-dark-theme, color), accent), + warn: map.get(map.get($base-dark-theme, color), warn), + is-dark: map.get(map.get($base-dark-theme, color), is-dark), + foreground: $foreground-dark, + background: $background-dark + ), + typography: null, + density: null, + primary: map.get(map.get($base-dark-theme, color), primary), + accent: map.get(map.get($base-dark-theme, color), accent), + warn: map.get(map.get($base-dark-theme, color), warn), + is-dark: map.get(map.get($base-dark-theme, color), is-dark), + foreground: $foreground-dark, + background: $background-dark + ); + + @include angular-material-theme($dark-theme); +} diff --git a/src/@fuse/tailwind/plugins/extract-config.js b/src/@fuse/tailwind/plugins/extract-config.js new file mode 100644 index 00000000..abfa4abb --- /dev/null +++ b/src/@fuse/tailwind/plugins/extract-config.js @@ -0,0 +1,38 @@ +const plugin = require('tailwindcss/plugin'); +const buildMediaQuery = require('tailwindcss/lib/util/buildMediaQuery').default; + +const extractConfig = plugin(({ + addVariant, + theme +}) => +{ + addVariant('fuse-tailwind-extracted-config', ({container}) => + { + // Prepare the extracted config variable + let extractedConfig = ''; + + // Breakpoints + Object.entries(theme('screens')).forEach(([key, value]) => + { + extractedConfig = `${extractedConfig} --breakpoints-${key}:'${buildMediaQuery(value)}';`; + }); + + // Themes + (theme('fuse.themes')).forEach((value) => + { + Object.entries(value).forEach(([key, value]) => + { + extractedConfig = `${extractedConfig} --themes-${key}:'${JSON.stringify(value)}';`; + }); + }); + + // Append the extracted config + container.append(` + .fuse-tailwind-extracted-config { + ${extractedConfig} + } + `); + }); +}); + +module.exports = extractConfig; diff --git a/src/@fuse/tailwind/plugins/icon-size.js b/src/@fuse/tailwind/plugins/icon-size.js new file mode 100644 index 00000000..9dec64de --- /dev/null +++ b/src/@fuse/tailwind/plugins/icon-size.js @@ -0,0 +1,56 @@ +const plugin = require('tailwindcss/plugin'); + +const iconSize = plugin(({ + addUtilities, + theme, + e, + variants + }) => + { + const values = theme('iconSize'); + + addUtilities( + Object.entries(values).map(([key, value]) => ({ + [`.${e(`icon-size-${key}`)}`]: { + width : value, + height : value, + minWidth : value, + minHeight : value, + fontSize : value, + lineHeight: value, + [`svg`] : { + width : value, + height: value + } + } + })), + variants('iconSize') + ); + }, + { + theme : { + iconSize: { + 3 : '0.75rem', + 3.5: '0.875rem', + 4 : '1rem', + 4.5: '1.125rem', + 5 : '1.25rem', + 6 : '1.5rem', + 7 : '1.75rem', + 8 : '2rem', + 10 : '2.5rem', + 12 : '3rem', + 14 : '3.5rem', + 16 : '4rem', + 18 : '4.5rem', + 20 : '5rem', + 22 : '5.5rem', + 24 : '6rem' + } + }, + variants: { + iconSize: ['responsive'] + } + }); + +module.exports = iconSize; diff --git a/src/@fuse/tailwind/plugins/theming.js b/src/@fuse/tailwind/plugins/theming.js new file mode 100644 index 00000000..1bedd0e7 --- /dev/null +++ b/src/@fuse/tailwind/plugins/theming.js @@ -0,0 +1,229 @@ +const chroma = require('chroma-js'); +const _ = require('lodash'); +const path = require('path'); +const colors = require('tailwindcss/colors'); +const plugin = require('tailwindcss/plugin'); +const flattenColorPalette = require('tailwindcss/lib/util/flattenColorPalette').default; +const generateContrasts = require(path.resolve(__dirname, ('../utils/generate-contrasts'))); + +// ----------------------------------------------------------------------------------------------------- +// @ Utilities +// ----------------------------------------------------------------------------------------------------- + +/** + * Normalize the provided theme + * + * @param theme + */ +const normalizeTheme = (theme) => +{ + return _.fromPairs(_.map(_.omitBy(theme, (palette, paletteName) => paletteName.startsWith('on') || _.isEmpty(palette)), + (palette, paletteName) => [ + paletteName, + { + ...palette, + DEFAULT: palette['DEFAULT'] || palette[500] + } + ] + )); +}; + +/** + * Generates variable colors for the 'colors' + * configuration from the provided theme + * + * @param theme + */ +const generateVariableColors = (theme) => +{ + // https://github.com/adamwathan/tailwind-css-variable-text-opacity-demo + const customPropertiesWithOpacity = (name) => ({ + opacityVariable, + opacityValue + }) => + { + if ( opacityValue ) + { + return `rgba(var(--fuse-${name}-rgb), ${opacityValue})`; + } + if ( opacityVariable ) + { + return `rgba(var(--fuse-${name}-rgb), var(${opacityVariable}, 1))`; + } + return `rgb(var(--fuse-${name}-rgb))`; + }; + + return _.fromPairs(_.flatten(_.map(_.keys(flattenColorPalette(normalizeTheme(theme))), (name) => [ + [name, customPropertiesWithOpacity(name)], + [`on-${name}`, customPropertiesWithOpacity(`on-${name}`)] + ]))); +}; + +/** + * Generate and return themes object with theme name and colors/ + * This is useful for accessing themes from Angular (Typescript). + * + * @param themes + * @returns {unknown[]} + */ +function generateThemesObject(themes) +{ + const normalizedDefaultTheme = normalizeTheme(themes.default); + return _.map(_.cloneDeep(themes), (value, key) => + { + const theme = normalizeTheme(value); + return _.fromPairs([ + [ + key, + { + primary: theme?.primary?.DEFAULT ?? normalizedDefaultTheme.primary.DEFAULT, + accent : theme?.accent?.DEFAULT ?? normalizedDefaultTheme.accent.DEFAULT, + warn : theme?.warn?.DEFAULT ?? normalizedDefaultTheme.warn.DEFAULT + } + ] + ]); + }); +} + +// ----------------------------------------------------------------------------------------------------- +// @ FUSE TailwindCSS Main Plugin +// ----------------------------------------------------------------------------------------------------- +const theming = plugin.withOptions((options) => ({ + addComponents, + e, + theme + }) => + { + // ----------------------------------------------------------------------------------------------------- + // @ Map variable colors + // ----------------------------------------------------------------------------------------------------- + const mapVariableColors = _.fromPairs(_.map(options.themes, (theme, themeName) => [ + themeName === 'default' ? 'body' : `body.theme-${e(themeName)}`, + _.fromPairs(_.flatten(_.map(flattenColorPalette(_.fromPairs(_.flatten(_.map(normalizeTheme(theme), (palette, paletteName) => [ + [ + e(paletteName), + palette + ], + [ + `on-${e(paletteName)}`, + _.fromPairs(_.map(generateContrasts(palette), (color, hue) => [hue, _.get(theme, [`on-${paletteName}`, hue]) || color])) + ] + ]) + ))), (value, key) => [[`--fuse-${e(key)}`, value], [`--fuse-${e(key)}-rgb`, chroma(value).rgb().join(',')]]))) + ])); + + addComponents(mapVariableColors); + + // ----------------------------------------------------------------------------------------------------- + // @ Generate scheme based css custom properties and utility classes + // ----------------------------------------------------------------------------------------------------- + const schemeCustomProps = _.map(['light', 'dark'], (colorScheme) => + { + const isDark = colorScheme === 'dark'; + const background = theme(`fuse.customProps.background.${colorScheme}`); + const foreground = theme(`fuse.customProps.foreground.${colorScheme}`); + const lightSchemeSelectors = 'body.light, .light, .dark .light'; + const darkSchemeSelectors = 'body.dark, .dark, .light .dark'; + + return { + [(isDark ? darkSchemeSelectors : lightSchemeSelectors)]: { + + /** + * If a custom property is not available, browsers will use + * the fallback value. In this case, we want to use '--is-dark' + * as the indicator of a dark theme so we can use it like this: + * background-color: var(--is-dark, red); + * + * If we set '--is-dark' as "true" on dark themes, the above rule + * won't work because of the said "fallback value" logic. Therefore, + * we set the '--is-dark' to "false" on light themes and not set it + * all on dark themes so that the fallback value can be used on + * dark themes. + * + * On light themes, since '--is-dark' exists, the above rule will be + * interpolated as: + * "background-color: false" + * + * On dark themes, since '--is-dark' doesn't exist, the fallback value + * will be used ('red' in this case) and the rule will be interpolated as: + * "background-color: red" + * + * It's easier to understand and remember like this. + */ + ...(!isDark ? {'--is-dark': 'false'} : {}), + + // Generate custom properties from customProps + ..._.fromPairs(_.flatten(_.map(background, (value, key) => [[`--fuse-${e(key)}`, value], [`--fuse-${e(key)}-rgb`, chroma(value).rgb().join(',')]]))), + ..._.fromPairs(_.flatten(_.map(foreground, (value, key) => [[`--fuse-${e(key)}`, value], [`--fuse-${e(key)}-rgb`, chroma(value).rgb().join(',')]]))) + } + }; + }); + + const schemeUtilities = (() => + { + // Generate general styles & utilities + return {}; + })(); + + addComponents(schemeCustomProps); + addComponents(schemeUtilities); + }, + (options) => + { + return { + theme : { + extend: { + colors: generateVariableColors(options.themes.default) + }, + fuse : { + customProps: { + background: { + light: { + 'bg-app-bar' : '#FFFFFF', + 'bg-card' : '#FFFFFF', + 'bg-default' : colors.blueGray[100], + 'bg-dialog' : '#FFFFFF', + 'bg-hover' : chroma(colors.blueGray[400]).alpha(0.12).css(), + 'bg-status-bar': colors.blueGray[300] + }, + dark : { + 'bg-app-bar' : colors.blueGray[900], + 'bg-card' : colors.blueGray[800], + 'bg-default' : colors.blueGray[900], + 'bg-dialog' : colors.blueGray[800], + 'bg-hover' : 'rgba(255, 255, 255, 0.05)', + 'bg-status-bar': colors.blueGray[900] + } + }, + foreground: { + light: { + 'text-default' : colors.blueGray[800], + 'text-secondary': colors.blueGray[500], + 'text-hint' : colors.blueGray[400], + 'text-disabled' : colors.blueGray[400], + 'border' : colors.blueGray[200], + 'divider' : colors.blueGray[200], + 'icon' : colors.blueGray[500], + 'mat-icon' : colors.blueGray[500] + }, + dark : { + 'text-default' : '#FFFFFF', + 'text-secondary': colors.blueGray[400], + 'text-hint' : colors.blueGray[500], + 'text-disabled' : colors.blueGray[600], + 'border' : chroma(colors.blueGray[100]).alpha(0.12).css(), + 'divider' : chroma(colors.blueGray[100]).alpha(0.12).css(), + 'icon' : colors.blueGray[400], + 'mat-icon' : colors.blueGray[400] + } + } + }, + themes : generateThemesObject(options.themes) + } + }, + variants: {} + }; + } +); + +module.exports = theming; diff --git a/src/@fuse/tailwind/plugins/utilities.js b/src/@fuse/tailwind/plugins/utilities.js new file mode 100644 index 00000000..2e8df2d4 --- /dev/null +++ b/src/@fuse/tailwind/plugins/utilities.js @@ -0,0 +1,75 @@ +const plugin = require('tailwindcss/plugin'); + +const utilities = plugin(({ + addComponents +}) => +{ + /* + * Add base components. These are very important for everything to look + * correct. We are adding these to the 'components' layer because they must + * be defined before pretty much everything else. + */ + addComponents( + { + '.mat-icon' : { + '--tw-text-opacity': '1', + color : 'rgba(var(--fuse-mat-icon-rgb), var(--tw-text-opacity))' + }, + '.text-default' : { + '--tw-text-opacity': '1 !important', + color : 'rgba(var(--fuse-text-default-rgb), var(--tw-text-opacity)) !important' + }, + '.text-secondary' : { + '--tw-text-opacity': '1 !important', + color : 'rgba(var(--fuse-text-secondary-rgb), var(--tw-text-opacity)) !important' + }, + '.text-hint' : { + '--tw-text-opacity': '1 !important', + color : 'rgba(var(--fuse-text-hint-rgb), var(--tw-text-opacity)) !important' + }, + '.text-disabled' : { + '--tw-text-opacity': '1 !important', + color : 'rgba(var(--fuse-text-disabled-rgb), var(--tw-text-opacity)) !important' + }, + '.divider' : { + color: 'var(--fuse-divider) !important' + }, + '.bg-card' : { + '--tw-bg-opacity': '1 !important', + backgroundColor : 'rgba(var(--fuse-bg-card-rgb), var(--tw-bg-opacity)) !important' + }, + '.bg-default' : { + '--tw-bg-opacity': '1 !important', + backgroundColor : 'rgba(var(--fuse-bg-default-rgb), var(--tw-bg-opacity)) !important' + }, + '.bg-dialog' : { + '--tw-bg-opacity': '1 !important', + backgroundColor : 'rgba(var(--fuse-bg-dialog-rgb), var(--tw-bg-opacity)) !important' + }, + '.ring-bg-default': { + '--tw-ring-opacity': '1 !important', + '--tw-ring-color' : 'rgba(var(--fuse-bg-default-rgb), var(--tw-ring-opacity)) !important' + }, + '.ring-bg-card' : { + '--tw-ring-opacity': '1 !important', + '--tw-ring-color' : 'rgba(var(--fuse-bg-card-rgb), var(--tw-ring-opacity)) !important' + } + }, + { + variants: ['dark', 'responsive'] + } + ); + + addComponents( + { + '.bg-hover': { + backgroundColor: 'var(--fuse-bg-hover) !important' + } + }, + { + variants: ['dark', 'group-hover', 'hover'] + } + ); +}); + +module.exports = utilities; diff --git a/src/@fuse/tailwind/utils/generate-contrasts.js b/src/@fuse/tailwind/utils/generate-contrasts.js new file mode 100644 index 00000000..fd98c3c8 --- /dev/null +++ b/src/@fuse/tailwind/utils/generate-contrasts.js @@ -0,0 +1,31 @@ +const chroma = require('chroma-js'); +const _ = require('lodash'); + +/** + * Generates contrasting counterparts of the given palette. + * The provided palette must be in the same format with + * default Tailwind color palettes. + * + * @param palette + * @private + */ +const generateContrasts = (palette) => +{ + const lightColor = '#FFFFFF'; + let darkColor = '#FFFFFF'; + + // Iterate through the palette to find the darkest color + _.forEach(palette, ((color) => + { + darkColor = chroma.contrast(color, '#FFFFFF') > chroma.contrast(darkColor, '#FFFFFF') ? color : darkColor; + })); + + // Generate the contrasting colors + return _.fromPairs(_.map(palette, ((color, hue) => [ + hue, + chroma.contrast(color, darkColor) > chroma.contrast(color, lightColor) ? darkColor : lightColor + ] + ))); +}; + +module.exports = generateContrasts; diff --git a/src/@fuse/tailwind/utils/generate-palette.js b/src/@fuse/tailwind/utils/generate-palette.js new file mode 100644 index 00000000..e2a8c90c --- /dev/null +++ b/src/@fuse/tailwind/utils/generate-palette.js @@ -0,0 +1,100 @@ +const chroma = require('chroma-js'); +const _ = require('lodash'); + +/** + * Generates palettes from the provided configuration. + * Accepts a single color string or a Tailwind-like + * color object. If provided Tailwind-like color object, + * it must have a 500 hue level. + * + * @param config + */ +const generatePalette = (config) => +{ + // Prepare an empty palette + const palette = { + 50 : null, + 100: null, + 200: null, + 300: null, + 400: null, + 500: null, + 600: null, + 700: null, + 800: null, + 900: null + }; + + // If a single color is provided, + // assign it to the 500 + if ( _.isString(config) ) + { + palette[500] = chroma.valid(config) ? config : null; + } + + // If a partial palette is provided, + // assign the values + if ( _.isPlainObject(config) ) + { + if ( !chroma.valid(config[500]) ) + { + throw new Error('You must have a 500 hue in your palette configuration! Make sure the main color of your palette is marked as 500.'); + } + + // Remove everything that is not a hue/color entry + config = _.pick(config, Object.keys(palette)); + + // Merge the values + _.mergeWith(palette, config, (objValue, srcValue) => chroma.valid(srcValue) ? srcValue : null); + } + + // Prepare the colors array + const colors = Object.values(palette).filter((color) => color); + + // Generate a very dark and a very light versions of the + // default color to use them as the boundary colors rather + // than using pure white and pure black. This will stop + // in between colors' hue values to slipping into the grays. + colors.unshift( + chroma.scale(['white', palette[500]]) + .domain([0, 1]) + .mode("lrgb") + .colors(50)[1] + ); + colors.push( + chroma.scale(['black', palette[500]]) + .domain([0, 1]) + .mode("lrgb") + .colors(10)[1] + ); + + // Prepare the domains array + const domain = [ + 0, + ...Object.entries(palette) + .filter(([key, value]) => value) + .map(([key]) => parseInt(key) / 1000), + 1 + ]; + + // Generate the color scale + const scale = chroma.scale(colors) + .domain(domain) + .mode('lrgb'); + + // Build and return the final palette + return { + 50 : scale(0.05).hex(), + 100: scale(0.1).hex(), + 200: scale(0.2).hex(), + 300: scale(0.3).hex(), + 400: scale(0.4).hex(), + 500: scale(0.5).hex(), + 600: scale(0.6).hex(), + 700: scale(0.7).hex(), + 800: scale(0.8).hex(), + 900: scale(0.9).hex() + }; +}; + +module.exports = generatePalette; diff --git a/src/@fuse/validators/index.ts b/src/@fuse/validators/index.ts new file mode 100644 index 00000000..7e1a213e --- /dev/null +++ b/src/@fuse/validators/index.ts @@ -0,0 +1 @@ +export * from './public-api'; diff --git a/src/@fuse/validators/public-api.ts b/src/@fuse/validators/public-api.ts new file mode 100644 index 00000000..011b41e0 --- /dev/null +++ b/src/@fuse/validators/public-api.ts @@ -0,0 +1 @@ +export * from './validators'; diff --git a/src/@fuse/validators/validators.ts b/src/@fuse/validators/validators.ts new file mode 100644 index 00000000..5fb1f60f --- /dev/null +++ b/src/@fuse/validators/validators.ts @@ -0,0 +1,59 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; + +export class FuseValidators +{ + /** + * Check for empty (optional fields) values + * + * @param value + */ + static isEmptyInputValue(value: any): boolean + { + return value == null || value.length === 0; + } + + /** + * Must match validator + * + * @param controlPath A dot-delimited string values that define the path to the control. + * @param matchingControlPath A dot-delimited string values that define the path to the matching control. + */ + static mustMatch(controlPath: string, matchingControlPath: string): ValidatorFn + { + return (formGroup: AbstractControl): ValidationErrors | null => { + + // Get the control and matching control + const control = formGroup.get(controlPath); + const matchingControl = formGroup.get(matchingControlPath); + + // Return if control or matching control doesn't exist + if ( !control || !matchingControl ) + { + return null; + } + + // Delete the mustMatch error to reset the error on the matching control + if ( matchingControl.hasError('mustMatch') ) + { + delete matchingControl.errors.mustMatch; + matchingControl.updateValueAndValidity(); + } + + // Don't validate empty values on the matching control + // Don't validate if values are matching + if ( this.isEmptyInputValue(matchingControl.value) || control.value === matchingControl.value ) + { + return null; + } + + // Prepare the validation errors + const errors = {mustMatch: true}; + + // Set the validation error on the matching control + matchingControl.setErrors(errors); + + // Return the errors + return errors; + }; + } +} diff --git a/src/@fuse/version/fuse-version.ts b/src/@fuse/version/fuse-version.ts new file mode 100644 index 00000000..84dc056d --- /dev/null +++ b/src/@fuse/version/fuse-version.ts @@ -0,0 +1,4 @@ +import { Version } from '@fuse/version/version'; + +const __FUSE_VERSION__ = '12.0.0'; +export const FUSE_VERSION = new Version(__FUSE_VERSION__).full; diff --git a/src/@fuse/version/index.ts b/src/@fuse/version/index.ts new file mode 100644 index 00000000..aaf27187 --- /dev/null +++ b/src/@fuse/version/index.ts @@ -0,0 +1 @@ +export * from '@fuse/version/public-api'; diff --git a/src/@fuse/version/public-api.ts b/src/@fuse/version/public-api.ts new file mode 100644 index 00000000..8645bbfc --- /dev/null +++ b/src/@fuse/version/public-api.ts @@ -0,0 +1,2 @@ +export * from '@fuse/version/fuse-version'; +export * from '@fuse/version/version'; diff --git a/src/@fuse/version/version.ts b/src/@fuse/version/version.ts new file mode 100644 index 00000000..6e7a8d4b --- /dev/null +++ b/src/@fuse/version/version.ts @@ -0,0 +1,21 @@ +/** + * Derived from Angular's version class + */ +export class Version +{ + public readonly full: string; + public readonly major: string; + public readonly minor: string; + public readonly patch: string; + + /** + * Constructor + */ + constructor(public version: string) + { + this.full = version; + this.major = version.split('.')[0]; + this.minor = version.split('.')[1]; + this.patch = version.split('.').slice(2).join('.'); + } +} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 00000000..556ba939 --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,6 @@ +:host { + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 00000000..0103342d --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; + +@Component({ + selector : 'app-root', + templateUrl: './app.component.html', + styleUrls : ['./app.component.scss'] +}) +export class AppComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 00000000..e38010f2 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,51 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ExtraOptions, PreloadAllModules, RouterModule } from '@angular/router'; +import { MarkdownModule } from 'ngx-markdown'; +import { FuseModule } from '@fuse'; +import { FuseConfigModule } from '@fuse/services/config'; +import { FuseMockApiModule } from '@fuse/lib/mock-api'; +import { CoreModule } from 'app/core/core.module'; +import { appConfig } from 'app/core/config/app.config'; +import { mockApiServices } from 'app/mock-api'; +import { LayoutModule } from 'app/layout/layout.module'; +import { AppComponent } from 'app/app.component'; +import { appRoutes } from 'app/app.routing'; + +const routerConfig: ExtraOptions = { + scrollPositionRestoration: 'enabled', + preloadingStrategy : PreloadAllModules, + relativeLinkResolution : 'legacy' +}; + +@NgModule({ + declarations: [ + AppComponent + ], + imports : [ + BrowserModule, + BrowserAnimationsModule, + RouterModule.forRoot(appRoutes, routerConfig), + + // Fuse & Fuse Mock API + FuseModule, + FuseConfigModule.forRoot(appConfig), + FuseMockApiModule.forRoot(mockApiServices), + + // Core + CoreModule, + + // Layout + LayoutModule, + + // 3rd party modules + MarkdownModule.forRoot({}) + ], + bootstrap : [ + AppComponent + ] +}) +export class AppModule +{ +} diff --git a/src/app/app.resolvers.ts b/src/app/app.resolvers.ts new file mode 100644 index 00000000..8b95e849 --- /dev/null +++ b/src/app/app.resolvers.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { forkJoin, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { InitialData } from 'app/app.types'; + +@Injectable({ + providedIn: 'root' +}) +export class InitialDataResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Use this resolver to resolve initial mock-api for the application + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + // Fork join multiple API endpoint calls to wait all of them to finish + return forkJoin([ + this._httpClient.get('api/common/messages'), + this._httpClient.get('api/common/navigation'), + this._httpClient.get('api/common/notifications'), + this._httpClient.get('api/common/shortcuts'), + this._httpClient.get('api/common/user') + ]).pipe( + map(([messages, navigation, notifications, shortcuts, user]) => ({ + messages, + navigation: { + compact : navigation.compact, + default : navigation.default, + futuristic: navigation.futuristic, + horizontal: navigation.horizontal + }, + notifications, + shortcuts, + user + }) + ) + ); + } +} diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts new file mode 100644 index 00000000..54c4863e --- /dev/null +++ b/src/app/app.routing.ts @@ -0,0 +1,191 @@ +import { Route } from '@angular/router'; +import { AuthGuard } from 'app/core/auth/guards/auth.guard'; +import { NoAuthGuard } from 'app/core/auth/guards/noAuth.guard'; +import { LayoutComponent } from 'app/layout/layout.component'; +import { InitialDataResolver } from 'app/app.resolvers'; + +// @formatter:off +// tslint:disable:max-line-length +export const appRoutes: Route[] = [ + + // Redirect empty path to '/dashboards/project' + {path: '', pathMatch : 'full', redirectTo: 'dashboards/project'}, + + // Redirect signed in user to the '/dashboards/project' + // + // After the user signs in, the sign in page will redirect the user to the 'signed-in-redirect' + // path. Below is another redirection for that path to redirect the user to the desired + // location. This is a small convenience to keep all main routes together here on this file. + {path: 'signed-in-redirect', pathMatch : 'full', redirectTo: 'dashboards/project'}, + + // Auth routes for guests + { + path: '', + canActivate: [NoAuthGuard], + canActivateChild: [NoAuthGuard], + component: LayoutComponent, + data: { + layout: 'empty' + }, + children: [ + {path: 'confirmation-required', loadChildren: () => import('app/modules/auth/confirmation-required/confirmation-required.module').then(m => m.AuthConfirmationRequiredModule)}, + {path: 'forgot-password', loadChildren: () => import('app/modules/auth/forgot-password/forgot-password.module').then(m => m.AuthForgotPasswordModule)}, + {path: 'reset-password', loadChildren: () => import('app/modules/auth/reset-password/reset-password.module').then(m => m.AuthResetPasswordModule)}, + {path: 'sign-in', loadChildren: () => import('app/modules/auth/sign-in/sign-in.module').then(m => m.AuthSignInModule)}, + {path: 'sign-up', loadChildren: () => import('app/modules/auth/sign-up/sign-up.module').then(m => m.AuthSignUpModule)} + ] + }, + + // Auth routes for authenticated users + { + path: '', + canActivate: [AuthGuard], + canActivateChild: [AuthGuard], + component: LayoutComponent, + data: { + layout: 'empty' + }, + children: [ + {path: 'sign-out', loadChildren: () => import('app/modules/auth/sign-out/sign-out.module').then(m => m.AuthSignOutModule)}, + {path: 'unlock-session', loadChildren: () => import('app/modules/auth/unlock-session/unlock-session.module').then(m => m.AuthUnlockSessionModule)} + ] + }, + + // Landing routes + { + path: '', + component : LayoutComponent, + data: { + layout: 'empty' + }, + children : [ + {path: 'home', loadChildren: () => import('app/modules/landing/home/home.module').then(m => m.LandingHomeModule)}, + ] + }, + + // Admin routes + { + path : '', + canActivate: [AuthGuard], + canActivateChild: [AuthGuard], + component : LayoutComponent, + resolve : { + initialData: InitialDataResolver, + }, + children : [ + + // Dashboards + {path: 'dashboards', children: [ + {path: 'project', loadChildren: () => import('app/modules/admin/dashboards/project/project.module').then(m => m.ProjectModule)}, + {path: 'analytics', loadChildren: () => import('app/modules/admin/dashboards/analytics/analytics.module').then(m => m.AnalyticsModule)}, + ]}, + + // Apps + {path: 'apps', children: [ + {path: 'calendar', loadChildren: () => import('app/modules/admin/apps/calendar/calendar.module').then(m => m.CalendarModule)}, + {path: 'contacts', loadChildren: () => import('app/modules/admin/apps/contacts/contacts.module').then(m => m.ContactsModule)}, + {path: 'ecommerce', loadChildren: () => import('app/modules/admin/apps/ecommerce/ecommerce.module').then(m => m.ECommerceModule)}, + {path: 'file-manager', loadChildren: () => import('app/modules/admin/apps/file-manager/file-manager.module').then(m => m.FileManagerModule)}, + {path: 'help-center', loadChildren: () => import('app/modules/admin/apps/help-center/help-center.module').then(m => m.HelpCenterModule)}, + {path: 'mailbox', loadChildren: () => import('app/modules/admin/apps/mailbox/mailbox.module').then(m => m.MailboxModule)}, + {path: 'tasks', loadChildren: () => import('app/modules/admin/apps/tasks/tasks.module').then(m => m.TasksModule)}, + ]}, + + // Pages + {path: 'pages', children: [ + + // Authentication + {path: 'authentication', loadChildren: () => import('app/modules/admin/pages/authentication/authentication.module').then(m => m.AuthenticationModule)}, + + // Coming soon + {path: 'coming-soon', loadChildren: () => import('app/modules/admin/pages/coming-soon/coming-soon.module').then(m => m.ComingSoonModule)}, + + // Error + {path: 'error', children: [ + {path: '404', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.module').then(m => m.Error404Module)}, + {path: '500', loadChildren: () => import('app/modules/admin/pages/error/error-500/error-500.module').then(m => m.Error500Module)} + ]}, + + // Invoice + {path: 'invoice', children: [ + {path: 'printable', children: [ + {path: 'compact', loadChildren: () => import('app/modules/admin/pages/invoice/printable/compact/compact.module').then(m => m.CompactModule)}, + {path: 'modern', loadChildren: () => import('app/modules/admin/pages/invoice/printable/modern/modern.module').then(m => m.ModernModule)} + ]} + ]}, + + // Maintenance + {path: 'maintenance', loadChildren: () => import('app/modules/admin/pages/maintenance/maintenance.module').then(m => m.MaintenanceModule)}, + + // Pricing + {path: 'pricing', children: [ + {path: 'modern', loadChildren: () => import('app/modules/admin/pages/pricing/modern/modern.module').then(m => m.PricingModernModule)}, + {path: 'simple', loadChildren: () => import('app/modules/admin/pages/pricing/simple/simple.module').then(m => m.PricingSimpleModule)}, + {path: 'single', loadChildren: () => import('app/modules/admin/pages/pricing/single/single.module').then(m => m.PricingSingleModule)}, + {path: 'table', loadChildren: () => import('app/modules/admin/pages/pricing/table/table.module').then(m => m.PricingTableModule)} + ]}, + + // Profile + {path: 'profile', loadChildren: () => import('app/modules/admin/pages/profile/profile.module').then(m => m.ProfileModule)}, + ]}, + + // User interface + {path: 'ui', children: [ + + // Angular Material + {path: 'angular-material', loadChildren: () => import('app/modules/admin/ui/angular-material/angular-material.module').then(m => m.AngularMaterialModule)}, + + // TailwindCSS + {path: 'tailwindcss', loadChildren: () => import('app/modules/admin/ui/tailwindcss/tailwindcss.module').then(m => m.TailwindCSSModule)}, + + // Animations + {path: 'animations', loadChildren: () => import('app/modules/admin/ui/animations/animations.module').then(m => m.AnimationsModule)}, + + // Cards + {path: 'cards', loadChildren: () => import('app/modules/admin/ui/cards/cards.module').then(m => m.CardsModule)}, + + // Colors + {path: 'colors', loadChildren: () => import('app/modules/admin/ui/colors/colors.module').then(m => m.ColorsModule)}, + + // Datatable + {path: 'datatable', loadChildren: () => import('app/modules/admin/ui/datatable/datatable.module').then(m => m.DatatableModule)}, + + // Forms + {path: 'forms', children: [ + {path: 'fields', loadChildren: () => import('app/modules/admin/ui/forms/fields/fields.module').then(m => m.FormsFieldsModule)}, + {path: 'layouts', loadChildren: () => import('app/modules/admin/ui/forms/layouts/layouts.module').then(m => m.FormsLayoutsModule)}, + {path: 'wizards', loadChildren: () => import('app/modules/admin/ui/forms/wizards/wizards.module').then(m => m.FormsWizardsModule)} + ]}, + + // Icons + {path: 'icons', loadChildren: () => import('app/modules/admin/ui/icons/icons.module').then(m => m.IconsModule)}, + + // Page layouts + {path: 'page-layouts', loadChildren: () => import('app/modules/admin/ui/page-layouts/page-layouts.module').then(m => m.PageLayoutsModule)}, + + // Typography + {path: 'typography', loadChildren: () => import('app/modules/admin/ui/typography/typography.module').then(m => m.TypographyModule)} + ]}, + + // Documentation + {path: 'docs', children: [ + + // Changelog + {path: 'changelog', loadChildren: () => import('app/modules/admin/docs/changelog/changelog.module').then(m => m.ChangelogModule)}, + + // Guides + {path: 'guides', loadChildren: () => import('app/modules/admin/docs/guides/guides.module').then(m => m.GuidesModule)}, + + // Core features + {path: 'core-features', loadChildren: () => import('app/modules/admin/docs/core-features/core-features.module').then(m => m.CoreFeaturesModule)}, + + // Other components + {path: 'other-components', loadChildren: () => import('app/modules/admin/docs/other-components/other-components.module').then(m => m.OtherComponentsModule)}, + ]}, + + // 404 & Catch all + {path: '404-not-found', pathMatch: 'full', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.module').then(m => m.Error404Module)}, + {path: '**', redirectTo: '404-not-found'} + ] + } +]; diff --git a/src/app/app.types.ts b/src/app/app.types.ts new file mode 100644 index 00000000..2d1b0820 --- /dev/null +++ b/src/app/app.types.ts @@ -0,0 +1,19 @@ +import { FuseNavigationItem } from '@fuse/components/navigation'; +import { Message } from 'app/layout/common/messages/messages.types'; +import { Notification } from 'app/layout/common/notifications/notifications.types'; +import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types'; +import { User } from 'app/core/user/user.model'; + +export interface InitialData +{ + messages: Message[]; + navigation: { + compact: FuseNavigationItem[], + default: FuseNavigationItem[], + futuristic: FuseNavigationItem[], + horizontal: FuseNavigationItem[] + }; + notifications: Notification[]; + shortcuts: Shortcut[]; + user: User; +} diff --git a/src/app/core/auth/auth.interceptor.ts b/src/app/core/auth/auth.interceptor.ts new file mode 100644 index 00000000..3fb50b28 --- /dev/null +++ b/src/app/core/auth/auth.interceptor.ts @@ -0,0 +1,62 @@ +import { Injectable } from '@angular/core'; +import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { AuthService } from 'app/core/auth/auth.service'; +import { AuthUtils } from 'app/core/auth/auth.utils'; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor +{ + /** + * Constructor + */ + constructor(private _authService: AuthService) + { + } + + /** + * Intercept + * + * @param req + * @param next + */ + intercept(req: HttpRequest, next: HttpHandler): Observable> + { + // Clone the request object + let newReq = req.clone(); + + // Request + // + // If the access token didn't expire, add the Authorization header. + // We won't add the Authorization header if the access token expired. + // This will force the server to return a "401 Unauthorized" response + // for the protected API routes which our response interceptor will + // catch and delete the access token from the local storage while logging + // the user out from the app. + if ( this._authService.accessToken && !AuthUtils.isTokenExpired(this._authService.accessToken) ) + { + newReq = req.clone({ + headers: req.headers.set('Authorization', 'Bearer ' + this._authService.accessToken) + }); + } + + // Response + return next.handle(newReq).pipe( + catchError((error) => { + + // Catch "401 Unauthorized" responses + if ( error instanceof HttpErrorResponse && error.status === 401 ) + { + // Sign out + this._authService.signOut(); + + // Reload the app + location.reload(); + } + + return throwError(error); + }) + ); + } +} diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts new file mode 100644 index 00000000..ccdfbdd6 --- /dev/null +++ b/src/app/core/auth/auth.service.ts @@ -0,0 +1,187 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, of, throwError } from 'rxjs'; +import { catchError, switchMap } from 'rxjs/operators'; +import { AuthUtils } from 'app/core/auth/auth.utils'; +import { UserService } from 'app/core/user/user.service'; + +@Injectable() +export class AuthService +{ + private _authenticated: boolean = false; + + /** + * Constructor + */ + constructor( + private _httpClient: HttpClient, + private _userService: UserService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Setter & getter for access token + */ + set accessToken(token: string) + { + localStorage.setItem('access_token', token); + } + + get accessToken(): string + { + return localStorage.getItem('access_token') ?? ''; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Forgot password + * + * @param email + */ + forgotPassword(email: string): Observable + { + return this._httpClient.post('api/auth/forgot-password', email); + } + + /** + * Reset password + * + * @param password + */ + resetPassword(password: string): Observable + { + return this._httpClient.post('api/auth/reset-password', password); + } + + /** + * Sign in + * + * @param credentials + */ + signIn(credentials: { email: string, password: string }): Observable + { + // Throw error, if the user is already logged in + if ( this._authenticated ) + { + return throwError('User is already logged in.'); + } + + return this._httpClient.post('api/auth/sign-in', credentials).pipe( + switchMap((response: any) => { + + // Store the access token in the local storage + this.accessToken = response.access_token; + + // Set the authenticated flag to true + this._authenticated = true; + + // Store the user on the user service + this._userService.user = response.user; + + // Return a new observable with the response + return of(response); + }) + ); + } + + /** + * Sign in using the access token + */ + signInUsingToken(): Observable + { + // Renew token + return this._httpClient.post('api/auth/refresh-access-token', { + access_token: this.accessToken + }).pipe( + catchError(() => { + + // Return false + return of(false); + }), + switchMap((response: any) => { + + // Store the access token in the local storage + this.accessToken = response.access_token; + + // Set the authenticated flag to true + this._authenticated = true; + + // Store the user on the user service + this._userService.user = response.user; + + // Return true + return of(true); + }) + ); + } + + /** + * Sign out + */ + signOut(): Observable + { + // Remove the access token from the local storage + localStorage.removeItem('access_token'); + + // Set the authenticated flag to false + this._authenticated = false; + + // Return the observable + return of(true); + } + + /** + * Sign up + * + * @param user + */ + signUp(user: { name: string, email: string, password: string, company: string }): Observable + { + return this._httpClient.post('api/auth/sign-up', user); + } + + /** + * Unlock session + * + * @param credentials + */ + unlockSession(credentials: { email: string, password: string }): Observable + { + return this._httpClient.post('api/auth/unlock-session', credentials); + } + + /** + * Check the authentication status + */ + check(): Observable + { + // Check if the user is logged in + if ( this._authenticated ) + { + return of(true); + } + + // Check the access token availability + if ( !this.accessToken ) + { + return of(false); + } + + // Check the access token expire date + if ( AuthUtils.isTokenExpired(this.accessToken) ) + { + return of(false); + } + + // If the access token exists and it didn't expire, sign in using it + return this.signInUsingToken(); + } +} diff --git a/src/app/core/auth/auth.utils.ts b/src/app/core/auth/auth.utils.ts new file mode 100644 index 00000000..f8666f36 --- /dev/null +++ b/src/app/core/auth/auth.utils.ts @@ -0,0 +1,206 @@ +// ----------------------------------------------------------------------------------------------------- +// @ AUTH UTILITIES +// +// Methods are derivations of the Auth0 Angular-JWT helper service methods +// https://github.com/auth0/angular2-jwt +// ----------------------------------------------------------------------------------------------------- + +export class AuthUtils +{ + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Base64 decoder + * Credits: https://github.com/atk + * + * @param str + * @private + */ + private static _b64decode(str: string): string + { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + let output = ''; + + str = String(str).replace(/=+$/, ''); + + if ( str.length % 4 === 1 ) + { + throw new Error( + '\'atob\' failed: The string to be decoded is not correctly encoded.' + ); + } + + /* tslint:disable */ + for ( + // initialize result and counters + let bc = 0, bs: any, buffer: any, idx = 0; + // get next character + (buffer = str.charAt(idx++)); + // character found in table? initialize bit storage and add its ascii value; + ~buffer && + ( + (bs = bc % 4 ? bs * 64 + buffer : buffer), + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4 + ) + ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) + : 0 + ) + { + // try to find character in table (0-63, not found => -1) + buffer = chars.indexOf(buffer); + } + /* tslint:enable */ + + return output; + } + + /** + * Base64 unicode decoder + * + * @param str + * @private + */ + private static _b64DecodeUnicode(str: any): string + { + return decodeURIComponent( + Array.prototype.map + .call(this._b64decode(str), (c: any) => { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }) + .join('') + ); + } + + /** + * URL Base 64 decoder + * + * @param str + * @private + */ + private static _urlBase64Decode(str: string): string + { + let output = str.replace(/-/g, '+').replace(/_/g, '/'); + switch ( output.length % 4 ) + { + case 0: + { + break; + } + case 2: + { + output += '=='; + break; + } + case 3: + { + output += '='; + break; + } + default: + { + throw Error('Illegal base64url string!'); + } + } + return this._b64DecodeUnicode(output); + } + + /** + * Decode token + * + * @param token + * @private + */ + private static _decodeToken(token: string): any + { + // Return if there is no token + if ( !token ) + { + return null; + } + + // Split the token + const parts = token.split('.'); + + if ( parts.length !== 3 ) + { + throw new Error('The inspected token doesn\'t appear to be a JWT. Check to make sure it has three parts and see https://jwt.io for more.'); + } + + // Decode the token using the Base64 decoder + const decoded = this._urlBase64Decode(parts[1]); + + if ( !decoded ) + { + throw new Error('Cannot decode the token.'); + } + + return JSON.parse(decoded); + } + + /** + * Get token expiration date + * + * @param token + * @private + */ + private static _getTokenExpirationDate(token: string): Date | null + { + // Get the decoded token + const decodedToken = this._decodeToken(token); + + // Return if the decodedToken doesn't have an 'exp' field + if ( !decodedToken.hasOwnProperty('exp') ) + { + return null; + } + + // Convert the expiration date + const date = new Date(0); + date.setUTCSeconds(decodedToken.exp); + + return date; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Is token expired? + * + * @param token + * @param offsetSeconds + */ + static isTokenExpired(token: string, offsetSeconds?: number): boolean + { + // Return if there is no token + if ( !token || token === '' ) + { + return true; + } + + // Get the expiration date + const date = this._getTokenExpirationDate(token); + + offsetSeconds = offsetSeconds || 0; + + if ( date === null ) + { + return true; + } + + // Check if the token is expired + return !(date.valueOf() > new Date().valueOf() + offsetSeconds * 1000); + } +} diff --git a/src/app/core/auth/guards/auth.guard.ts b/src/app/core/auth/guards/auth.guard.ts new file mode 100644 index 00000000..41caddb4 --- /dev/null +++ b/src/app/core/auth/guards/auth.guard.ts @@ -0,0 +1,93 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Route, Router, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router'; +import { Observable, of } from 'rxjs'; +import { AuthService } from 'app/core/auth/auth.service'; +import { switchMap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate, CanActivateChild, CanLoad +{ + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Check the authenticated status + * + * @param redirectURL + * @private + */ + private _check(redirectURL: string): Observable + { + // Check the authentication status + return this._authService.check() + .pipe( + switchMap((authenticated) => { + + // If the user is not authenticated... + if ( !authenticated ) + { + // Redirect to the sign-in page + this._router.navigate(['sign-in'], {queryParams: {redirectURL}}); + + // Prevent the access + return of(false); + } + + // Allow the access + return of(true); + }) + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Can activate + * + * @param route + * @param state + */ + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean + { + const redirectUrl = state.url === '/sign-out' ? '/' : state.url; + return this._check(redirectUrl); + } + + /** + * Can activate child + * + * @param childRoute + * @param state + */ + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree + { + const redirectUrl = state.url === '/sign-out' ? '/' : state.url; + return this._check(redirectUrl); + } + + /** + * Can load + * + * @param route + * @param segments + */ + canLoad(route: Route, segments: UrlSegment[]): Observable | Promise | boolean + { + return this._check('/'); + } +} diff --git a/src/app/core/auth/guards/noAuth.guard.ts b/src/app/core/auth/guards/noAuth.guard.ts new file mode 100644 index 00000000..6ec40b50 --- /dev/null +++ b/src/app/core/auth/guards/noAuth.guard.ts @@ -0,0 +1,90 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Route, Router, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router'; +import { Observable, of } from 'rxjs'; +import { AuthService } from 'app/core/auth/auth.service'; +import { switchMap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class NoAuthGuard implements CanActivate, CanActivateChild, CanLoad +{ + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Check the authenticated status + * + * @private + */ + private _check(): Observable + { + // Check the authentication status + return this._authService.check() + .pipe( + switchMap((authenticated) => { + + // If the user is authenticated... + if ( authenticated ) + { + // Redirect to the root + this._router.navigate(['']); + + // Prevent the access + return of(false); + } + + // Allow the access + return of(true); + }) + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Can activate + * + * @param route + * @param state + */ + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean + { + return this._check(); + } + + /** + * Can activate child + * + * @param childRoute + * @param state + */ + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree + { + return this._check(); + } + + /** + * Can load + * + * @param route + * @param segments + */ + canLoad(route: Route, segments: UrlSegment[]): Observable | Promise | boolean + { + return this._check(); + } +} diff --git a/src/app/core/config/app.config.ts b/src/app/core/config/app.config.ts new file mode 100644 index 00000000..f4a7980b --- /dev/null +++ b/src/app/core/config/app.config.ts @@ -0,0 +1,30 @@ +import { Layout } from 'app/layout/layout.types'; + +// Types +export type Scheme = 'auto' | 'dark' | 'light'; +export type Theme = 'default' | string; + +/** + * AppConfig interface. Update this interface to strictly type your config + * object. + */ +export interface AppConfig +{ + layout: Layout; + scheme: Scheme; + theme: Theme; +} + +/** + * Default configuration for the entire application. This object is used by + * FuseConfigService to set the default configuration. + * + * If you need to store global configuration for your app, you can use this + * object to set the defaults. To access, update and reset the config, use + * FuseConfigService and its methods. + */ +export const appConfig: AppConfig = { + layout: 'classy', + scheme: 'light', + theme : 'default' +}; diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts new file mode 100644 index 00000000..909ea3e0 --- /dev/null +++ b/src/app/core/core.module.ts @@ -0,0 +1,46 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; +import { DomSanitizer } from '@angular/platform-browser'; +import { MatIconRegistry } from '@angular/material/icon'; +import { AuthService } from 'app/core/auth/auth.service'; +import { AuthInterceptor } from 'app/core/auth/auth.interceptor'; + +@NgModule({ + imports : [ + HttpClientModule + ], + providers: [ + AuthService, + { + provide : HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi : true + } + ] +}) +export class CoreModule +{ + /** + * Constructor + */ + constructor( + private _domSanitizer: DomSanitizer, + private _matIconRegistry: MatIconRegistry, + @Optional() @SkipSelf() parentModule?: CoreModule + ) + { + // Do not allow multiple injections + if ( parentModule ) + { + throw new Error('CoreModule has already been loaded. Import this module in the AppModule only.'); + } + + // Register icon sets + this._matIconRegistry.addSvgIconSet(this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-twotone.svg')); + this._matIconRegistry.addSvgIconSetInNamespace('mat_outline', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-outline.svg')); + this._matIconRegistry.addSvgIconSetInNamespace('iconsmind', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/iconsmind.svg')); + this._matIconRegistry.addSvgIconSetInNamespace('feather', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/feather.svg')); + this._matIconRegistry.addSvgIconSetInNamespace('heroicons_outline', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-outline.svg')); + this._matIconRegistry.addSvgIconSetInNamespace('heroicons_solid', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-solid.svg')); + } +} diff --git a/src/app/core/user/user.model.ts b/src/app/core/user/user.model.ts new file mode 100644 index 00000000..87f7d7c1 --- /dev/null +++ b/src/app/core/user/user.model.ts @@ -0,0 +1,8 @@ +export interface User +{ + id: string; + name: string; + email: string; + avatar?: string; + status?: string; +} diff --git a/src/app/core/user/user.service.ts b/src/app/core/user/user.service.ts new file mode 100644 index 00000000..d2c0a07e --- /dev/null +++ b/src/app/core/user/user.service.ts @@ -0,0 +1,59 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, ReplaySubject } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { User } from 'app/core/user/user.model'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService +{ + private _user: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Setter & getter for user + * + * @param value + */ + set user(value: User) + { + // Store the value + this._user.next(value); + } + + get user$(): Observable + { + return this._user.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Update the user + * + * @param user + */ + update(user: User): Observable + { + return this._httpClient.patch('api/common/user', {user}).pipe( + map((response) => { + // Execute the observable + this._user.next(response); + }) + ); + } +} diff --git a/src/app/layout/common/messages/messages.component.html b/src/app/layout/common/messages/messages.component.html new file mode 100644 index 00000000..6ee00b47 --- /dev/null +++ b/src/app/layout/common/messages/messages.component.html @@ -0,0 +1,158 @@ + + + + + + +
+ + +
+
+ +
+
Messages
+
+ +
+
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+ + + + +
+
+ + + + + +
+ + +
+
+ + + + + +
+ +
+
+ +
+
+
+ {{message.time | date:'MMM dd, h:mm a'}} +
+
+
+
+ + + +
+
+ +
+
No messages
+
When you have messages, they will appear here.
+
+
+
+
+
diff --git a/src/app/layout/common/messages/messages.component.ts b/src/app/layout/common/messages/messages.component.ts new file mode 100644 index 00000000..64609eec --- /dev/null +++ b/src/app/layout/common/messages/messages.component.ts @@ -0,0 +1,226 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { MatButton } from '@angular/material/button'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { Message } from 'app/layout/common/messages/messages.types'; +import { MessagesService } from 'app/layout/common/messages/messages.service'; + +@Component({ + selector : 'messages', + templateUrl : './messages.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'messages' +}) +export class MessagesComponent implements OnInit, OnChanges, OnDestroy +{ + @Input() messages: Message[]; + @ViewChild('messagesOrigin') private _messagesOrigin: MatButton; + @ViewChild('messagesPanel') private _messagesPanel: TemplateRef; + + unreadCount: number = 0; + private _overlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _messagesService: MessagesService, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Messages + if ( 'messages' in changes ) + { + // Store the messages on the service + this._messagesService.store(changes.messages.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to message changes + this._messagesService.messages$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((messages: Message[]) => { + + // Load the messages + this.messages = messages; + + // Calculate the unread count + this._calculateUnreadCount(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._overlayRef ) + { + this._overlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the messages panel + */ + openPanel(): void + { + // Return if the messages panel or its origin is not defined + if ( !this._messagesPanel || !this._messagesOrigin ) + { + return; + } + + // Create the overlay if it doesn't exist + if ( !this._overlayRef ) + { + this._createOverlay(); + } + + // Attach the portal to the overlay + this._overlayRef.attach(new TemplatePortal(this._messagesPanel, this._viewContainerRef)); + } + + /** + * Close the messages panel + */ + closePanel(): void + { + this._overlayRef.detach(); + } + + /** + * Mark all messages as read + */ + markAllAsRead(): void + { + // Mark all as read + this._messagesService.markAllAsRead().subscribe(); + } + + /** + * Toggle read status of the given message + */ + toggleRead(message: Message): void + { + // Toggle the read status + message.read = !message.read; + + // Update the message + this._messagesService.update(message.id, message).subscribe(); + } + + /** + * Delete the given message + */ + delete(message: Message): void + { + // Delete the message + this._messagesService.delete(message.id).subscribe(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create the overlay + */ + private _createOverlay(): void + { + // Create the overlay + this._overlayRef = this._overlay.create({ + hasBackdrop : true, + backdropClass : 'fuse-backdrop-on-mobile', + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._messagesOrigin._elementRef.nativeElement) + .withLockedPosition() + .withPush(true) + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + }, + { + originX : 'start', + originY : 'top', + overlayX: 'start', + overlayY: 'bottom' + }, + { + originX : 'end', + originY : 'bottom', + overlayX: 'end', + overlayY: 'top' + }, + { + originX : 'end', + originY : 'top', + overlayX: 'end', + overlayY: 'bottom' + } + ]) + }); + + // Detach the overlay from the portal on backdrop click + this._overlayRef.backdropClick().subscribe(() => { + this._overlayRef.detach(); + }); + } + + /** + * Calculate the unread count + * + * @private + */ + private _calculateUnreadCount(): void + { + let count = 0; + + if ( this.messages && this.messages.length ) + { + count = this.messages.filter(message => !message.read).length; + } + + this.unreadCount = count; + } +} diff --git a/src/app/layout/common/messages/messages.module.ts b/src/app/layout/common/messages/messages.module.ts new file mode 100644 index 00000000..8e1c070a --- /dev/null +++ b/src/app/layout/common/messages/messages.module.ts @@ -0,0 +1,30 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { PortalModule } from '@angular/cdk/portal'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MessagesComponent } from 'app/layout/common/messages/messages.component'; +import { SharedModule } from 'app/shared/shared.module'; + +@NgModule({ + declarations: [ + MessagesComponent + ], + imports : [ + RouterModule, + OverlayModule, + PortalModule, + MatButtonModule, + MatIconModule, + MatTooltipModule, + SharedModule + ], + exports : [ + MessagesComponent + ] +}) +export class MessagesModule +{ +} diff --git a/src/app/layout/common/messages/messages.service.ts b/src/app/layout/common/messages/messages.service.ts new file mode 100644 index 00000000..63d7621b --- /dev/null +++ b/src/app/layout/common/messages/messages.service.ts @@ -0,0 +1,157 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, ReplaySubject } from 'rxjs'; +import { Message } from 'app/layout/common/messages/messages.types'; +import { map, switchMap, take } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class MessagesService +{ + private _messages: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for messages + */ + get messages$(): Observable + { + return this._messages.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Store messages on the service + * + * @param messages + */ + store(messages: Message[]): Observable + { + // Load the messages + this._messages.next(messages); + + // Return the messages + return this.messages$; + } + + /** + * Create a message + * + * @param message + */ + create(message: Message): Observable + { + return this.messages$.pipe( + take(1), + switchMap(messages => this._httpClient.post('api/common/messages', {message}).pipe( + map((newMessage) => { + + // Update the messages with the new message + this._messages.next([...messages, newMessage]); + + // Return the new message from observable + return newMessage; + }) + )) + ); + } + + /** + * Update the message + * + * @param id + * @param message + */ + update(id: string, message: Message): Observable + { + return this.messages$.pipe( + take(1), + switchMap(messages => this._httpClient.patch('api/common/messages', { + id, + message + }).pipe( + map((updatedMessage: Message) => { + + // Find the index of the updated message + const index = messages.findIndex(item => item.id === id); + + // Update the message + messages[index] = updatedMessage; + + // Update the messages + this._messages.next(messages); + + // Return the updated message + return updatedMessage; + }) + )) + ); + } + + /** + * Delete the message + * + * @param id + */ + delete(id: string): Observable + { + return this.messages$.pipe( + take(1), + switchMap(messages => this._httpClient.delete('api/common/messages', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted message + const index = messages.findIndex(item => item.id === id); + + // Delete the message + messages.splice(index, 1); + + // Update the messages + this._messages.next(messages); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Mark all messages as read + */ + markAllAsRead(): Observable + { + return this.messages$.pipe( + take(1), + switchMap(messages => this._httpClient.get('api/common/messages/mark-all-as-read').pipe( + map((isUpdated: boolean) => { + + // Go through all messages and set them as read + messages.forEach((message, index) => { + messages[index].read = true; + }); + + // Update the messages + this._messages.next(messages); + + // Return the updated status + return isUpdated; + }) + )) + ); + } +} diff --git a/src/app/layout/common/messages/messages.types.ts b/src/app/layout/common/messages/messages.types.ts new file mode 100644 index 00000000..6b3759fe --- /dev/null +++ b/src/app/layout/common/messages/messages.types.ts @@ -0,0 +1,12 @@ +export interface Message +{ + id: string; + icon?: string; + image?: string; + title?: string; + description?: string; + time: string; + link?: string; + useRouter?: boolean; + read: boolean; +} diff --git a/src/app/layout/common/notifications/notifications.component.html b/src/app/layout/common/notifications/notifications.component.html new file mode 100644 index 00000000..4c661567 --- /dev/null +++ b/src/app/layout/common/notifications/notifications.component.html @@ -0,0 +1,162 @@ + + + + + + +
+ + +
+
+ +
+
Notifications
+
+ +
+
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+ + + + +
+ +
+ + + + + +
+ + +
+
+ + + + + +
+ +
+
+ +
+
+
+ {{notification.time | date:'MMM dd, h:mm a'}} +
+
+
+
+ + + +
+
+ +
+
No notifications
+
When you have notifications, they will appear here.
+
+
+ +
+ +
+ +
diff --git a/src/app/layout/common/notifications/notifications.component.ts b/src/app/layout/common/notifications/notifications.component.ts new file mode 100644 index 00000000..84fc8a54 --- /dev/null +++ b/src/app/layout/common/notifications/notifications.component.ts @@ -0,0 +1,226 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { MatButton } from '@angular/material/button'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { Notification } from 'app/layout/common/notifications/notifications.types'; +import { NotificationsService } from 'app/layout/common/notifications/notifications.service'; + +@Component({ + selector : 'notifications', + templateUrl : './notifications.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'notifications' +}) +export class NotificationsComponent implements OnChanges, OnInit, OnDestroy +{ + @Input() notifications: Notification[]; + @ViewChild('notificationsOrigin') private _notificationsOrigin: MatButton; + @ViewChild('notificationsPanel') private _notificationsPanel: TemplateRef; + + unreadCount: number = 0; + private _overlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _notificationsService: NotificationsService, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Notifications + if ( 'notifications' in changes ) + { + // Store the notifications on the service + this._notificationsService.store(changes.notifications.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to notification changes + this._notificationsService.notifications$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((notifications: Notification[]) => { + + // Load the notifications + this.notifications = notifications; + + // Calculate the unread count + this._calculateUnreadCount(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._overlayRef ) + { + this._overlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the notifications panel + */ + openPanel(): void + { + // Return if the notifications panel or its origin is not defined + if ( !this._notificationsPanel || !this._notificationsOrigin ) + { + return; + } + + // Create the overlay if it doesn't exist + if ( !this._overlayRef ) + { + this._createOverlay(); + } + + // Attach the portal to the overlay + this._overlayRef.attach(new TemplatePortal(this._notificationsPanel, this._viewContainerRef)); + } + + /** + * Close the messages panel + */ + closePanel(): void + { + this._overlayRef.detach(); + } + + /** + * Mark all notifications as read + */ + markAllAsRead(): void + { + // Mark all as read + this._notificationsService.markAllAsRead().subscribe(); + } + + /** + * Toggle read status of the given notification + */ + toggleRead(notification: Notification): void + { + // Toggle the read status + notification.read = !notification.read; + + // Update the notification + this._notificationsService.update(notification.id, notification).subscribe(); + } + + /** + * Delete the given notification + */ + delete(notification: Notification): void + { + // Delete the notification + this._notificationsService.delete(notification.id).subscribe(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create the overlay + */ + private _createOverlay(): void + { + // Create the overlay + this._overlayRef = this._overlay.create({ + hasBackdrop : true, + backdropClass : 'fuse-backdrop-on-mobile', + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._notificationsOrigin._elementRef.nativeElement) + .withLockedPosition() + .withPush(true) + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + }, + { + originX : 'start', + originY : 'top', + overlayX: 'start', + overlayY: 'bottom' + }, + { + originX : 'end', + originY : 'bottom', + overlayX: 'end', + overlayY: 'top' + }, + { + originX : 'end', + originY : 'top', + overlayX: 'end', + overlayY: 'bottom' + } + ]) + }); + + // Detach the overlay from the portal on backdrop click + this._overlayRef.backdropClick().subscribe(() => { + this._overlayRef.detach(); + }); + } + + /** + * Calculate the unread count + * + * @private + */ + private _calculateUnreadCount(): void + { + let count = 0; + + if ( this.notifications && this.notifications.length ) + { + count = this.notifications.filter(notification => !notification.read).length; + } + + this.unreadCount = count; + } +} diff --git a/src/app/layout/common/notifications/notifications.module.ts b/src/app/layout/common/notifications/notifications.module.ts new file mode 100644 index 00000000..468b7c19 --- /dev/null +++ b/src/app/layout/common/notifications/notifications.module.ts @@ -0,0 +1,30 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { PortalModule } from '@angular/cdk/portal'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { NotificationsComponent } from 'app/layout/common/notifications/notifications.component'; +import { SharedModule } from 'app/shared/shared.module'; + +@NgModule({ + declarations: [ + NotificationsComponent + ], + imports : [ + RouterModule, + OverlayModule, + PortalModule, + MatButtonModule, + MatIconModule, + MatTooltipModule, + SharedModule + ], + exports : [ + NotificationsComponent + ] +}) +export class NotificationsModule +{ +} diff --git a/src/app/layout/common/notifications/notifications.service.ts b/src/app/layout/common/notifications/notifications.service.ts new file mode 100644 index 00000000..d904197a --- /dev/null +++ b/src/app/layout/common/notifications/notifications.service.ts @@ -0,0 +1,157 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, ReplaySubject } from 'rxjs'; +import { Notification } from 'app/layout/common/notifications/notifications.types'; +import { map, switchMap, take } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class NotificationsService +{ + private _notifications: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for notifications + */ + get notifications$(): Observable + { + return this._notifications.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Store notifications on the service + * + * @param notifications + */ + store(notifications: Notification[]): Observable + { + // Load the notifications + this._notifications.next(notifications); + + // Return the notifications + return this.notifications$; + } + + /** + * Create a notification + * + * @param notification + */ + create(notification: Notification): Observable + { + return this.notifications$.pipe( + take(1), + switchMap(notifications => this._httpClient.post('api/common/notifications', {notification}).pipe( + map((newNotification) => { + + // Update the notifications with the new notification + this._notifications.next([...notifications, newNotification]); + + // Return the new notification from observable + return newNotification; + }) + )) + ); + } + + /** + * Update the notification + * + * @param id + * @param notification + */ + update(id: string, notification: Notification): Observable + { + return this.notifications$.pipe( + take(1), + switchMap(notifications => this._httpClient.patch('api/common/notifications', { + id, + notification + }).pipe( + map((updatedNotification: Notification) => { + + // Find the index of the updated notification + const index = notifications.findIndex(item => item.id === id); + + // Update the notification + notifications[index] = updatedNotification; + + // Update the notifications + this._notifications.next(notifications); + + // Return the updated notification + return updatedNotification; + }) + )) + ); + } + + /** + * Delete the notification + * + * @param id + */ + delete(id: string): Observable + { + return this.notifications$.pipe( + take(1), + switchMap(notifications => this._httpClient.delete('api/common/notifications', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted notification + const index = notifications.findIndex(item => item.id === id); + + // Delete the notification + notifications.splice(index, 1); + + // Update the notifications + this._notifications.next(notifications); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Mark all notifications as read + */ + markAllAsRead(): Observable + { + return this.notifications$.pipe( + take(1), + switchMap(notifications => this._httpClient.get('api/common/notifications/mark-all-as-read').pipe( + map((isUpdated: boolean) => { + + // Go through all notifications and set them as read + notifications.forEach((notification, index) => { + notifications[index].read = true; + }); + + // Update the notifications + this._notifications.next(notifications); + + // Return the updated status + return isUpdated; + }) + )) + ); + } +} diff --git a/src/app/layout/common/notifications/notifications.types.ts b/src/app/layout/common/notifications/notifications.types.ts new file mode 100644 index 00000000..4d9d25de --- /dev/null +++ b/src/app/layout/common/notifications/notifications.types.ts @@ -0,0 +1,12 @@ +export interface Notification +{ + id: string; + icon?: string; + image?: string; + title?: string; + description?: string; + time: string; + link?: string; + useRouter?: boolean; + read: boolean; +} diff --git a/src/app/layout/common/search/search.component.html b/src/app/layout/common/search/search.component.html new file mode 100644 index 00000000..47240b01 --- /dev/null +++ b/src/app/layout/common/search/search.component.html @@ -0,0 +1,128 @@ + + + + +
+ + + + + No results found! + + + + + + +
+
+ + + +
+ + + + + + + No results found! + + + + + +
+
+ + + + + + + + +
+
Contact
+
+ +
+
+ + +
+
+
+ + + +
+
Page
+
+ + {{result.link}} +
+
+
+ +
diff --git a/src/app/layout/common/search/search.component.ts b/src/app/layout/common/search/search.component.ts new file mode 100644 index 00000000..e501feee --- /dev/null +++ b/src/app/layout/common/search/search.component.ts @@ -0,0 +1,206 @@ +import { Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { HttpClient } from '@angular/common/http'; +import { Subject } from 'rxjs'; +import { debounceTime, filter, map, takeUntil } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations/public-api'; + +@Component({ + selector : 'search', + templateUrl : './search.component.html', + encapsulation: ViewEncapsulation.None, + exportAs : 'fuseSearch', + animations : FuseAnimations +}) +export class SearchComponent implements OnChanges, OnInit, OnDestroy +{ + @Input() appearance: 'basic' | 'bar' = 'basic'; + @Input() debounce: number = 300; + @Input() minLength: number = 2; + @Output() search: EventEmitter = new EventEmitter(); + + opened: boolean = false; + results: any[]; + searchControl: FormControl = new FormControl(); + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _elementRef: ElementRef, + private _httpClient: HttpClient, + private _renderer2: Renderer2 + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Host binding for component classes + */ + @HostBinding('class') get classList(): any + { + return { + 'search-appearance-bar' : this.appearance === 'bar', + 'search-appearance-basic': this.appearance === 'basic', + 'search-opened' : this.opened + }; + } + + /** + * Setter for bar search input + * + * @param value + */ + @ViewChild('barSearchInput') + set barSearchInput(value: ElementRef) + { + // If the value exists, it means that the search input + // is now in the DOM and we can focus on the input.. + if ( value ) + { + // Give Angular time to complete the change detection cycle + setTimeout(() => { + + // Focus to the input element + value.nativeElement.focus(); + }); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Appearance + if ( 'appearance' in changes ) + { + // To prevent any issues, close the + // search after changing the appearance + this.close(); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the search field value changes + this.searchControl.valueChanges + .pipe( + debounceTime(this.debounce), + takeUntil(this._unsubscribeAll), + map((value) => { + + // Set the search results to null if there is no value or + // the length of the value is smaller than the minLength + // so the autocomplete panel can be closed + if ( !value || value.length < this.minLength ) + { + this.results = null; + } + + // Continue + return value; + }), + filter((value) => { + + // Filter out undefined/null/false statements and also + // filter out the values that are smaller than minLength + return value && value.length >= this.minLength; + }) + ) + .subscribe((value) => { + this._httpClient.post('api/common/search', {query: value}) + .subscribe((response: any) => { + + // Store the results + this.results = response.results; + + // Execute the event + this.search.next(this.results); + }); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On keydown of the search input + * + * @param event + */ + onKeydown(event: KeyboardEvent): void + { + // Listen for escape to close the search + // if the appearance is 'bar' + if ( this.appearance === 'bar' ) + { + // Escape + if ( event.code === 'Escape' ) + { + // Close the search + this.close(); + } + } + } + + /** + * Open the search + * Used in 'bar' + */ + open(): void + { + // Return if it's already opened + if ( this.opened ) + { + return; + } + + // Open the search + this.opened = true; + } + + /** + * Close the search + * * Used in 'bar' + */ + close(): void + { + // Return if it's already closed + if ( !this.opened ) + { + return; + } + + // Clear the search input + this.searchControl.setValue(''); + + // Close the search + this.opened = false; + } +} diff --git a/src/app/layout/common/search/search.module.ts b/src/app/layout/common/search/search.module.ts new file mode 100644 index 00000000..4dec6521 --- /dev/null +++ b/src/app/layout/common/search/search.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { Overlay } from '@angular/cdk/overlay'; +import { MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { SharedModule } from 'app/shared/shared.module'; +import { SearchComponent } from 'app/layout/common/search/search.component'; + +@NgModule({ + declarations: [ + SearchComponent + ], + imports : [ + RouterModule.forChild([]), + MatAutocompleteModule, + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + SharedModule + ], + exports : [ + SearchComponent + ], + providers : [ + { + provide : MAT_AUTOCOMPLETE_SCROLL_STRATEGY, + useFactory: (overlay: Overlay) => { + return () => overlay.scrollStrategies.block(); + }, + deps : [Overlay] + } + ] +}) +export class SearchModule +{ +} diff --git a/src/app/layout/common/shortcuts/shortcuts.component.html b/src/app/layout/common/shortcuts/shortcuts.component.html new file mode 100644 index 00000000..57a474bf --- /dev/null +++ b/src/app/layout/common/shortcuts/shortcuts.component.html @@ -0,0 +1,215 @@ + + + + + +
+ + +
+
+ +
+
Shortcuts
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ + +
+ +
+
+
+ + + + + + + + + + +
+ + +
+
{{shortcut.label}}
+
{{shortcut.description}}
+
+
+
+
+ + + +
+
+ +
+
No shortcuts
+
When you have shortcuts, they will appear here.
+
+
+
+ + + +
+ + Label + + + + Description + + + + Icon + + + + Link + + + + Use router for the link + + +
+ + +
+
+
+
+
+
diff --git a/src/app/layout/common/shortcuts/shortcuts.component.ts b/src/app/layout/common/shortcuts/shortcuts.component.ts new file mode 100644 index 00000000..f28f01f9 --- /dev/null +++ b/src/app/layout/common/shortcuts/shortcuts.component.ts @@ -0,0 +1,263 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { MatButton } from '@angular/material/button'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types'; +import { ShortcutsService } from 'app/layout/common/shortcuts/shortcuts.service'; + +@Component({ + selector : 'shortcuts', + templateUrl : './shortcuts.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'shortcuts' +}) +export class ShortcutsComponent implements OnChanges, OnInit, OnDestroy +{ + @Input() shortcuts: Shortcut[]; + @ViewChild('shortcutsOrigin') private _shortcutsOrigin: MatButton; + @ViewChild('shortcutsPanel') private _shortcutsPanel: TemplateRef; + + mode: 'view' | 'modify' | 'add' | 'edit' = 'view'; + shortcutForm: FormGroup; + private _overlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _formBuilder: FormBuilder, + private _shortcutsService: ShortcutsService, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On changes + * + * @param changes + */ + ngOnChanges(changes: SimpleChanges): void + { + // Shortcuts + if ( 'shortcuts' in changes ) + { + // Store the shortcuts on the service + this._shortcutsService.store(changes.shortcuts.currentValue); + } + } + + /** + * On init + */ + ngOnInit(): void + { + // Initialize the form + this.shortcutForm = this._formBuilder.group({ + id : [null], + label : ['', Validators.required], + description: [''], + icon : ['', Validators.required], + link : ['', Validators.required], + useRouter : ['', Validators.required] + }); + + // Get the shortcuts + this._shortcutsService.shortcuts$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((shortcuts: Shortcut[]) => { + + // Load the shortcuts + this.shortcuts = shortcuts; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._overlayRef ) + { + this._overlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the shortcuts panel + */ + openPanel(): void + { + // Return if the shortcuts panel or its origin is not defined + if ( !this._shortcutsPanel || !this._shortcutsOrigin ) + { + return; + } + + // Make sure to start in 'view' mode + this.mode = 'view'; + + // Create the overlay if it doesn't exist + if ( !this._overlayRef ) + { + this._createOverlay(); + } + + // Attach the portal to the overlay + this._overlayRef.attach(new TemplatePortal(this._shortcutsPanel, this._viewContainerRef)); + } + + /** + * Close the messages panel + */ + closePanel(): void + { + this._overlayRef.detach(); + } + + /** + * Change the mode + */ + changeMode(mode: 'view' | 'modify' | 'add' | 'edit'): void + { + // Change the mode + this.mode = mode; + } + + /** + * Prepare for a new shortcut + */ + newShortcut(): void + { + // Reset the form + this.shortcutForm.reset(); + + // Enter the add mode + this.mode = 'add'; + } + + /** + * Edit a shortcut + */ + editShortcut(shortcut: Shortcut): void + { + // Reset the form with the shortcut + this.shortcutForm.reset(shortcut); + + // Enter the edit mode + this.mode = 'edit'; + } + + /** + * Save shortcut + */ + save(): void + { + // Get the mock-api from the form + const shortcut = this.shortcutForm.value; + + // If there is an id, update it... + if ( shortcut.id ) + { + this._shortcutsService.update(shortcut.id, shortcut).subscribe(); + } + // Otherwise, create a new shortcut... + else + { + this._shortcutsService.create(shortcut).subscribe(); + } + + // Go back the modify mode + this.mode = 'modify'; + } + + /** + * Delete shortcut + */ + delete(): void + { + // Get the mock-api from the form + const shortcut = this.shortcutForm.value; + + // Delete + this._shortcutsService.delete(shortcut.id).subscribe(); + + // Go back the modify mode + this.mode = 'modify'; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create the overlay + */ + private _createOverlay(): void + { + // Create the overlay + this._overlayRef = this._overlay.create({ + hasBackdrop : true, + backdropClass : 'fuse-backdrop-on-mobile', + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._shortcutsOrigin._elementRef.nativeElement) + .withLockedPosition() + .withPush(true) + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + }, + { + originX : 'start', + originY : 'top', + overlayX: 'start', + overlayY: 'bottom' + }, + { + originX : 'end', + originY : 'bottom', + overlayX: 'end', + overlayY: 'top' + }, + { + originX : 'end', + originY : 'top', + overlayX: 'end', + overlayY: 'bottom' + } + ]) + }); + + // Detach the overlay from the portal on backdrop click + this._overlayRef.backdropClick().subscribe(() => { + this._overlayRef.detach(); + }); + } +} diff --git a/src/app/layout/common/shortcuts/shortcuts.module.ts b/src/app/layout/common/shortcuts/shortcuts.module.ts new file mode 100644 index 00000000..f3f5ee9c --- /dev/null +++ b/src/app/layout/common/shortcuts/shortcuts.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { OverlayModule } from '@angular/cdk/overlay'; +import { PortalModule } from '@angular/cdk/portal'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { ShortcutsComponent } from 'app/layout/common/shortcuts/shortcuts.component'; + +@NgModule({ + declarations: [ + ShortcutsComponent + ], + imports : [ + CommonModule, + ReactiveFormsModule, + RouterModule, + OverlayModule, + PortalModule, + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSlideToggleModule, + MatTooltipModule + ], + exports : [ + ShortcutsComponent + ] +}) +export class ShortcutsModule +{ +} diff --git a/src/app/layout/common/shortcuts/shortcuts.service.ts b/src/app/layout/common/shortcuts/shortcuts.service.ts new file mode 100644 index 00000000..01f128f5 --- /dev/null +++ b/src/app/layout/common/shortcuts/shortcuts.service.ts @@ -0,0 +1,132 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, ReplaySubject } from 'rxjs'; +import { map, switchMap, take } from 'rxjs/operators'; +import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types'; + +@Injectable({ + providedIn: 'root' +}) +export class ShortcutsService +{ + private _shortcuts: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for shortcuts + */ + get shortcuts$(): Observable + { + return this._shortcuts.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Store shortcuts on the service + * + * @param shortcuts + */ + store(shortcuts: Shortcut[]): Observable + { + // Load the shortcuts + this._shortcuts.next(shortcuts); + + // Return the shortcuts + return this.shortcuts$; + } + + /** + * Create a shortcut + * + * @param shortcut + */ + create(shortcut: Shortcut): Observable + { + return this.shortcuts$.pipe( + take(1), + switchMap(shortcuts => this._httpClient.post('api/common/shortcuts', {shortcut}).pipe( + map((newShortcut) => { + + // Update the shortcuts with the new shortcut + this._shortcuts.next([...shortcuts, newShortcut]); + + // Return the new shortcut from observable + return newShortcut; + }) + )) + ); + } + + /** + * Update the shortcut + * + * @param id + * @param shortcut + */ + update(id: string, shortcut: Shortcut): Observable + { + return this.shortcuts$.pipe( + take(1), + switchMap(shortcuts => this._httpClient.patch('api/common/shortcuts', { + id, + shortcut + }).pipe( + map((updatedShortcut: Shortcut) => { + + // Find the index of the updated shortcut + const index = shortcuts.findIndex(item => item.id === id); + + // Update the shortcut + shortcuts[index] = updatedShortcut; + + // Update the shortcuts + this._shortcuts.next(shortcuts); + + // Return the updated shortcut + return updatedShortcut; + }) + )) + ); + } + + /** + * Delete the shortcut + * + * @param id + */ + delete(id: string): Observable + { + return this.shortcuts$.pipe( + take(1), + switchMap(shortcuts => this._httpClient.delete('api/common/shortcuts', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted shortcut + const index = shortcuts.findIndex(item => item.id === id); + + // Delete the shortcut + shortcuts.splice(index, 1); + + // Update the shortcuts + this._shortcuts.next(shortcuts); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } +} diff --git a/src/app/layout/common/shortcuts/shortcuts.types.ts b/src/app/layout/common/shortcuts/shortcuts.types.ts new file mode 100644 index 00000000..1cceff6d --- /dev/null +++ b/src/app/layout/common/shortcuts/shortcuts.types.ts @@ -0,0 +1,9 @@ +export interface Shortcut +{ + id: string; + label: string; + description?: string; + icon: string; + link: string; + useRouter: boolean; +} diff --git a/src/app/layout/common/user-menu/user-menu.component.html b/src/app/layout/common/user-menu/user-menu.component.html new file mode 100644 index 00000000..8c922a07 --- /dev/null +++ b/src/app/layout/common/user-menu/user-menu.component.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/app/layout/common/user-menu/user-menu.component.ts b/src/app/layout/common/user-menu/user-menu.component.ts new file mode 100644 index 00000000..6b2fabef --- /dev/null +++ b/src/app/layout/common/user-menu/user-menu.component.ts @@ -0,0 +1,97 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Router } from '@angular/router'; +import { BooleanInput } from '@angular/cdk/coercion'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { User } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; + +@Component({ + selector : 'user-menu', + templateUrl : './user-menu.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + exportAs : 'userMenu' +}) +export class UserMenuComponent implements OnInit, OnDestroy +{ + static ngAcceptInputType_showAvatar: BooleanInput; + + @Input() showAvatar: boolean = true; + user: User; + + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _router: Router, + private _userService: UserService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to user changes + this._userService.user$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((user: User) => { + this.user = user; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Update the user status + * + * @param status + */ + updateUserStatus(status: string): void + { + // Return if user is not available + if ( !this.user ) + { + return; + } + + // Update the user + this._userService.update({ + ...this.user, + status + }).subscribe(); + } + + /** + * Sign out + */ + signOut(): void + { + this._router.navigate(['/sign-out']); + } +} diff --git a/src/app/layout/common/user-menu/user-menu.module.ts b/src/app/layout/common/user-menu/user-menu.module.ts new file mode 100644 index 00000000..d7ded69a --- /dev/null +++ b/src/app/layout/common/user-menu/user-menu.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { UserMenuComponent } from 'app/layout/common/user-menu/user-menu.component'; +import { SharedModule } from 'app/shared/shared.module'; + +@NgModule({ + declarations: [ + UserMenuComponent + ], + imports : [ + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + SharedModule + ], + exports : [ + UserMenuComponent + ] +}) +export class UserMenuModule +{ +} diff --git a/src/app/layout/layout.component.html b/src/app/layout/layout.component.html new file mode 100644 index 00000000..d0053290 --- /dev/null +++ b/src/app/layout/layout.component.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
Settings
+
+ +
+ + +
THEME
+
+ +
+
+
+ {{theme[0] | titlecase}} +
+
+
+
+ +
+ + +
SCHEME
+
+ +
+
+ +
+
+ Auto +
+
+ +
+
+ +
+
+ Dark +
+
+ +
+
+ +
+
+ Light +
+
+
+ +
+ + +
LAYOUT
+
+ + +
+
+
+
+
+ Empty +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Classic +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Classy +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Compact +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dense +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Futuristic +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thin +
+
+ +
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Centered +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Enterprise +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Material +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modern +
+
+ +
+ +
+ +
+ +
diff --git a/src/app/layout/layout.component.scss b/src/app/layout/layout.component.scss new file mode 100644 index 00000000..584a8981 --- /dev/null +++ b/src/app/layout/layout.component.scss @@ -0,0 +1,26 @@ +layout { + display: flex; + flex: 1 1 auto; + width: 100%; + max-width: 100%; + min-width: 0; + + /* Base styles for individual layouts */ + > * { + position: relative; + display: flex; + flex: 1 1 auto; + width: 100%; + } + + /* Base styles for components that load as a route */ + router-outlet { + + + * { + position: relative; + display: flex; + flex: 1 1 auto; + width: 100%; + } + } +} diff --git a/src/app/layout/layout.component.ts b/src/app/layout/layout.component.ts new file mode 100644 index 00000000..b7726faf --- /dev/null +++ b/src/app/layout/layout.component.ts @@ -0,0 +1,261 @@ +import { Component, Inject, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { combineLatest, Subject } from 'rxjs'; +import { filter, map, takeUntil } from 'rxjs/operators'; +import { FuseConfigService } from '@fuse/services/config'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseTailwindService } from '@fuse/services/tailwind/tailwind.service'; +import { FUSE_VERSION } from '@fuse/version'; +import { Layout } from 'app/layout/layout.types'; +import { AppConfig, Scheme, Theme } from 'app/core/config/app.config'; + +@Component({ + selector : 'layout', + templateUrl : './layout.component.html', + styleUrls : ['./layout.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class LayoutComponent implements OnInit, OnDestroy +{ + config: AppConfig; + layout: Layout; + scheme: 'dark' | 'light'; + theme: string; + themes: [string, any][] = []; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + @Inject(DOCUMENT) private _document: any, + private _renderer2: Renderer2, + private _router: Router, + private _fuseConfigService: FuseConfigService, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseTailwindConfigService: FuseTailwindService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the themes + this._fuseTailwindConfigService.tailwindConfig$.subscribe((config) => { + this.themes = Object.entries(config.themes); + }); + + // Set the theme and scheme based on the configuration + combineLatest([ + this._fuseConfigService.config$, + this._fuseMediaWatcherService.onMediaQueryChange$(['(prefers-color-scheme: dark)', '(prefers-color-scheme: light)']) + ]).pipe( + takeUntil(this._unsubscribeAll), + map(([config, mql]) => { + + const options = { + scheme: config.scheme, + theme : config.theme + }; + + // If the scheme is set to 'auto'... + if ( config.scheme === 'auto' ) + { + // Decide the scheme using the media query + options.scheme = mql.breakpoints['(prefers-color-scheme: dark)'] ? 'dark' : 'light'; + } + + return options; + }) + ).subscribe((options) => { + + // Store the options + this.scheme = options.scheme; + this.theme = options.theme; + + // Update the scheme and theme + this._updateScheme(); + this._updateTheme(); + }); + + // Subscribe to config changes + this._fuseConfigService.config$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((config: AppConfig) => { + + // Store the config + this.config = config; + + // Update the layout + this._updateLayout(); + }); + + // Subscribe to NavigationEnd event + this._router.events.pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ).subscribe(() => { + + // Update the layout + this._updateLayout(); + }); + + // Set the app version + this._renderer2.setAttribute(this._document.querySelector('[ng-version]'), 'fuse-version', FUSE_VERSION); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Set the layout on the config + * + * @param layout + */ + setLayout(layout: string): void + { + // Clear the 'layout' query param to allow layout changes + this._router.navigate([], { + queryParams : { + layout: null + }, + queryParamsHandling: 'merge' + }).then(() => { + + // Set the config + this._fuseConfigService.config = {layout}; + }); + } + + /** + * Set the scheme on the config + * + * @param scheme + */ + setScheme(scheme: Scheme): void + { + this._fuseConfigService.config = {scheme}; + } + + /** + * Set the theme on the config + * + * @param theme + */ + setTheme(theme: Theme): void + { + this._fuseConfigService.config = {theme}; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Update the selected layout + */ + private _updateLayout(): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // 1. Set the layout from the config + this.layout = this.config.layout; + + // 2. Get the query parameter from the current route and + // set the layout and save the layout to the config + const layoutFromQueryParam = (route.snapshot.queryParamMap.get('layout') as Layout); + if ( layoutFromQueryParam ) + { + this.layout = layoutFromQueryParam; + if ( this.config ) + { + this.config.layout = layoutFromQueryParam; + } + } + + // 3. Iterate through the paths and change the layout as we find + // a config for it. + // + // The reason we do this is that there might be empty grouping + // paths or componentless routes along the path. Because of that, + // we cannot just assume that the layout configuration will be + // in the last path's config or in the first path's config. + // + // So, we get all the paths that matched starting from root all + // the way to the current activated route, walk through them one + // by one and change the layout as we find the layout config. This + // way, layout configuration can live anywhere within the path and + // we won't miss it. + // + // Also, this will allow overriding the layout in any time so we + // can have different layouts for different routes. + const paths = route.pathFromRoot; + paths.forEach((path) => { + + // Check if there is a 'layout' mock-api + if ( path.routeConfig && path.routeConfig.data && path.routeConfig.data.layout ) + { + // Set the layout + this.layout = path.routeConfig.data.layout; + } + }); + } + + /** + * Update the selected scheme + * + * @private + */ + private _updateScheme(): void + { + // Remove class names for all schemes + this._document.body.classList.remove('light', 'dark'); + + // Add class name for the currently selected scheme + this._document.body.classList.add(this.scheme); + } + + /** + * Update the selected theme + * + * @private + */ + private _updateTheme(): void + { + // Find the class name for the previously selected theme and remove it + this._document.body.classList.forEach((className: string) => { + if ( className.startsWith('theme-') ) + { + this._document.body.classList.remove(className, className.split('-')[1]); + } + }); + + // Add class name for the currently selected theme + this._document.body.classList.add(`theme-${this.theme}`); + } +} diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts new file mode 100644 index 00000000..44ba1fc0 --- /dev/null +++ b/src/app/layout/layout.module.ts @@ -0,0 +1,56 @@ +import { NgModule } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { FuseDrawerModule } from '@fuse/components/drawer'; +import { LayoutComponent } from 'app/layout/layout.component'; +import { EmptyLayoutModule } from 'app/layout/layouts/empty/empty.module'; +import { CenteredLayoutModule } from 'app/layout/layouts/horizontal/centered/centered.module'; +import { EnterpriseLayoutModule } from 'app/layout/layouts/horizontal/enterprise/enterprise.module'; +import { MaterialLayoutModule } from 'app/layout/layouts/horizontal/material/material.module'; +import { ModernLayoutModule } from 'app/layout/layouts/horizontal/modern/modern.module'; +import { ClassicLayoutModule } from 'app/layout/layouts/vertical/classic/classic.module'; +import { ClassyLayoutModule } from 'app/layout/layouts/vertical/classy/classy.module'; +import { CompactLayoutModule } from 'app/layout/layouts/vertical/compact/compact.module'; +import { DenseLayoutModule } from 'app/layout/layouts/vertical/dense/dense.module'; +import { FuturisticLayoutModule } from 'app/layout/layouts/vertical/futuristic/futuristic.module'; +import { ThinLayoutModule } from 'app/layout/layouts/vertical/thin/thin.module'; +import { SharedModule } from 'app/shared/shared.module'; + +const layoutModules = [ + // Empty + EmptyLayoutModule, + + // Horizontal navigation + CenteredLayoutModule, + EnterpriseLayoutModule, + MaterialLayoutModule, + ModernLayoutModule, + + // Vertical navigation + ClassicLayoutModule, + ClassyLayoutModule, + CompactLayoutModule, + DenseLayoutModule, + FuturisticLayoutModule, + ThinLayoutModule +]; + +@NgModule({ + declarations: [ + LayoutComponent + ], + imports : [ + MatIconModule, + MatTooltipModule, + FuseDrawerModule, + SharedModule, + ...layoutModules + ], + exports : [ + LayoutComponent, + ...layoutModules + ] +}) +export class LayoutModule +{ +} diff --git a/src/app/layout/layout.types.ts b/src/app/layout/layout.types.ts new file mode 100644 index 00000000..f82d98d3 --- /dev/null +++ b/src/app/layout/layout.types.ts @@ -0,0 +1,14 @@ +export type Layout = + | 'empty' + // Horizontal + | 'centered' + | 'enterprise' + | 'material' + | 'modern' + // Vertical + | 'classic' + | 'classy' + | 'compact' + | 'dense' + | 'futuristic' + | 'thin'; diff --git a/src/app/layout/layouts/empty/empty.component.html b/src/app/layout/layouts/empty/empty.component.html new file mode 100644 index 00000000..3dbd8494 --- /dev/null +++ b/src/app/layout/layouts/empty/empty.component.html @@ -0,0 +1,11 @@ + +
+ + +
+ + +
+ +
diff --git a/src/app/layout/layouts/empty/empty.component.ts b/src/app/layout/layouts/empty/empty.component.ts new file mode 100644 index 00000000..ed39724a --- /dev/null +++ b/src/app/layout/layouts/empty/empty.component.ts @@ -0,0 +1,33 @@ +import { Component, OnDestroy, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; + +@Component({ + selector : 'empty-layout', + templateUrl : './empty.component.html', + encapsulation: ViewEncapsulation.None +}) +export class EmptyLayoutComponent implements OnDestroy +{ + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor() + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/layouts/empty/empty.module.ts b/src/app/layout/layouts/empty/empty.module.ts new file mode 100644 index 00000000..339f5cc6 --- /dev/null +++ b/src/app/layout/layouts/empty/empty.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; +import { EmptyLayoutComponent } from 'app/layout/layouts/empty/empty.component'; + +@NgModule({ + declarations: [ + EmptyLayoutComponent + ], + imports : [ + RouterModule, + SharedModule + ], + exports : [ + EmptyLayoutComponent + ] +}) +export class EmptyLayoutModule +{ +} diff --git a/src/app/layout/layouts/horizontal/centered/centered.component.html b/src/app/layout/layouts/horizontal/centered/centered.component.html new file mode 100644 index 00000000..0b909060 --- /dev/null +++ b/src/app/layout/layouts/horizontal/centered/centered.component.html @@ -0,0 +1,88 @@ +
+ + + + + + + +
+ +
+
+
+
+ + +
+ + +
+ + +
+ + + Logo image +
+ + +
+ + + + + +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
+ +
diff --git a/src/app/layout/layouts/horizontal/centered/centered.component.ts b/src/app/layout/layouts/horizontal/centered/centered.component.ts new file mode 100644 index 00000000..637e2eab --- /dev/null +++ b/src/app/layout/layouts/horizontal/centered/centered.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'centered-layout', + templateUrl : './centered.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CenteredLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/horizontal/centered/centered.module.ts b/src/app/layout/layouts/horizontal/centered/centered.module.ts new file mode 100644 index 00000000..3b0130b2 --- /dev/null +++ b/src/app/layout/layouts/horizontal/centered/centered.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { CenteredLayoutComponent } from 'app/layout/layouts/horizontal/centered/centered.component'; + +@NgModule({ + declarations: [ + CenteredLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + CenteredLayoutComponent + ] +}) +export class CenteredLayoutModule +{ +} diff --git a/src/app/layout/layouts/horizontal/enterprise/enterprise.component.html b/src/app/layout/layouts/horizontal/enterprise/enterprise.component.html new file mode 100644 index 00000000..fcc99e67 --- /dev/null +++ b/src/app/layout/layouts/horizontal/enterprise/enterprise.component.html @@ -0,0 +1,86 @@ + + + + + + +
+ Logo image +
+
+
+
+ + +
+ + +
+ +
+
+ + +
+ Logo image +
+
+ + + + + +
+ + + + + +
+
+
+ + +
+
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ Fuse © {{currentYear}} +
+
+ +
diff --git a/src/app/layout/layouts/horizontal/enterprise/enterprise.component.ts b/src/app/layout/layouts/horizontal/enterprise/enterprise.component.ts new file mode 100644 index 00000000..2edbaf7b --- /dev/null +++ b/src/app/layout/layouts/horizontal/enterprise/enterprise.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'enterprise-layout', + templateUrl : './enterprise.component.html', + encapsulation: ViewEncapsulation.None +}) +export class EnterpriseLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/horizontal/enterprise/enterprise.module.ts b/src/app/layout/layouts/horizontal/enterprise/enterprise.module.ts new file mode 100644 index 00000000..f3897da1 --- /dev/null +++ b/src/app/layout/layouts/horizontal/enterprise/enterprise.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { EnterpriseLayoutComponent } from 'app/layout/layouts/horizontal/enterprise/enterprise.component'; + +@NgModule({ + declarations: [ + EnterpriseLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + EnterpriseLayoutComponent + ] +}) +export class EnterpriseLayoutModule +{ +} diff --git a/src/app/layout/layouts/horizontal/material/material.component.html b/src/app/layout/layouts/horizontal/material/material.component.html new file mode 100644 index 00000000..c6e8ca7f --- /dev/null +++ b/src/app/layout/layouts/horizontal/material/material.component.html @@ -0,0 +1,89 @@ + + + + + + +
+ Logo image +
+
+
+
+ + +
+ + +
+
+ +
+ + +
+ + Logo image + + +
+
+ + + + + +
+ + + + + +
+
+ + +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ Fuse © {{currentYear}} +
+
+ +
diff --git a/src/app/layout/layouts/horizontal/material/material.component.ts b/src/app/layout/layouts/horizontal/material/material.component.ts new file mode 100644 index 00000000..6dd9cac9 --- /dev/null +++ b/src/app/layout/layouts/horizontal/material/material.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'material-layout', + templateUrl : './material.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MaterialLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/horizontal/material/material.module.ts b/src/app/layout/layouts/horizontal/material/material.module.ts new file mode 100644 index 00000000..f2060f55 --- /dev/null +++ b/src/app/layout/layouts/horizontal/material/material.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { MaterialLayoutComponent } from 'app/layout/layouts/horizontal/material/material.component'; + +@NgModule({ + declarations: [ + MaterialLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + MaterialLayoutComponent + ] +}) +export class MaterialLayoutModule +{ +} diff --git a/src/app/layout/layouts/horizontal/modern/modern.component.html b/src/app/layout/layouts/horizontal/modern/modern.component.html new file mode 100644 index 00000000..7d27029b --- /dev/null +++ b/src/app/layout/layouts/horizontal/modern/modern.component.html @@ -0,0 +1,78 @@ + + + + + + +
+ Logo image +
+
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + + +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/horizontal/modern/modern.component.ts b/src/app/layout/layouts/horizontal/modern/modern.component.ts new file mode 100644 index 00000000..8b98f101 --- /dev/null +++ b/src/app/layout/layouts/horizontal/modern/modern.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'modern-layout', + templateUrl : './modern.component.html', + encapsulation: ViewEncapsulation.None +}) +export class ModernLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/horizontal/modern/modern.module.ts b/src/app/layout/layouts/horizontal/modern/modern.module.ts new file mode 100644 index 00000000..1beb0fb3 --- /dev/null +++ b/src/app/layout/layouts/horizontal/modern/modern.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { ModernLayoutComponent } from 'app/layout/layouts/horizontal/modern/modern.component'; + +@NgModule({ + declarations: [ + ModernLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + ModernLayoutComponent + ] +}) +export class ModernLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/classic/classic.component.html b/src/app/layout/layouts/vertical/classic/classic.component.html new file mode 100644 index 00000000..274bd165 --- /dev/null +++ b/src/app/layout/layouts/vertical/classic/classic.component.html @@ -0,0 +1,59 @@ + + + + + +
+ + Logo image + + +
+
+
+ + +
+ + +
+ + + +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/classic/classic.component.ts b/src/app/layout/layouts/vertical/classic/classic.component.ts new file mode 100644 index 00000000..e424a4a7 --- /dev/null +++ b/src/app/layout/layouts/vertical/classic/classic.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'classic-layout', + templateUrl : './classic.component.html', + encapsulation: ViewEncapsulation.None +}) +export class ClassicLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/vertical/classic/classic.module.ts b/src/app/layout/layouts/vertical/classic/classic.module.ts new file mode 100644 index 00000000..e9ae97c0 --- /dev/null +++ b/src/app/layout/layouts/vertical/classic/classic.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { ClassicLayoutComponent } from 'app/layout/layouts/vertical/classic/classic.component'; + +@NgModule({ + declarations: [ + ClassicLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + ClassicLayoutComponent + ] +}) +export class ClassicLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/classy/classy.component.html b/src/app/layout/layouts/vertical/classy/classy.component.html new file mode 100644 index 00000000..b55f8923 --- /dev/null +++ b/src/app/layout/layouts/vertical/classy/classy.component.html @@ -0,0 +1,87 @@ + + + + +
+ +
+ +
+ +
+ + +
+
+ +
+
+ User avatar + +
+
+
+ {{data.user.name}} +
+
+ {{data.user.email}} +
+
+
+
+ + +
+ +
+
+
+ + +
+ + +
+ + + +
+ + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/classy/classy.component.ts b/src/app/layout/layouts/vertical/classy/classy.component.ts new file mode 100644 index 00000000..200513c3 --- /dev/null +++ b/src/app/layout/layouts/vertical/classy/classy.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'classy-layout', + templateUrl : './classy.component.html', + encapsulation: ViewEncapsulation.None +}) +export class ClassyLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/vertical/classy/classy.module.ts b/src/app/layout/layouts/vertical/classy/classy.module.ts new file mode 100644 index 00000000..aa980b28 --- /dev/null +++ b/src/app/layout/layouts/vertical/classy/classy.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { ClassyLayoutComponent } from 'app/layout/layouts/vertical/classy/classy.component'; + +@NgModule({ + declarations: [ + ClassyLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + ClassyLayoutComponent + ] +}) +export class ClassyLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/compact/compact.component.html b/src/app/layout/layouts/vertical/compact/compact.component.html new file mode 100644 index 00000000..edc293da --- /dev/null +++ b/src/app/layout/layouts/vertical/compact/compact.component.html @@ -0,0 +1,54 @@ + + + + + +
+ Logo image +
+
+
+ + +
+ + +
+ + + +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/compact/compact.component.ts b/src/app/layout/layouts/vertical/compact/compact.component.ts new file mode 100644 index 00000000..4b58fcff --- /dev/null +++ b/src/app/layout/layouts/vertical/compact/compact.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'compact-layout', + templateUrl : './compact.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CompactLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/vertical/compact/compact.module.ts b/src/app/layout/layouts/vertical/compact/compact.module.ts new file mode 100644 index 00000000..65b4b06c --- /dev/null +++ b/src/app/layout/layouts/vertical/compact/compact.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { CompactLayoutComponent } from 'app/layout/layouts/vertical/compact/compact.component'; + +@NgModule({ + declarations: [ + CompactLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + CompactLayoutComponent + ] +}) +export class CompactLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/dense/dense.component.html b/src/app/layout/layouts/vertical/dense/dense.component.html new file mode 100644 index 00000000..6124b399 --- /dev/null +++ b/src/app/layout/layouts/vertical/dense/dense.component.html @@ -0,0 +1,63 @@ + + + + + +
+ Logo image +
+
+
+ + +
+ + +
+
+ + + + +
+ +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/dense/dense.component.ts b/src/app/layout/layouts/vertical/dense/dense.component.ts new file mode 100644 index 00000000..b7107147 --- /dev/null +++ b/src/app/layout/layouts/vertical/dense/dense.component.ts @@ -0,0 +1,107 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'dense-layout', + templateUrl : './dense.component.html', + encapsulation: ViewEncapsulation.None +}) +export class DenseLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + navigationAppearance: 'default' | 'dense' = 'dense'; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } + + /** + * Toggle the navigation appearance + */ + toggleNavigationAppearance(): void + { + this.navigationAppearance = (this.navigationAppearance === 'default' ? 'dense' : 'default'); + } +} diff --git a/src/app/layout/layouts/vertical/dense/dense.module.ts b/src/app/layout/layouts/vertical/dense/dense.module.ts new file mode 100644 index 00000000..122a3f47 --- /dev/null +++ b/src/app/layout/layouts/vertical/dense/dense.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { DenseLayoutComponent } from 'app/layout/layouts/vertical/dense/dense.component'; + +@NgModule({ + declarations: [ + DenseLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + DenseLayoutComponent + ] +}) +export class DenseLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/futuristic/futuristic.component.html b/src/app/layout/layouts/vertical/futuristic/futuristic.component.html new file mode 100644 index 00000000..c1373ded --- /dev/null +++ b/src/app/layout/layouts/vertical/futuristic/futuristic.component.html @@ -0,0 +1,67 @@ + + + + + +
+ +
+
+ + + +
+ +
+
+ {{data.user.name}} +
+
+ brian.hughes@company.com +
+
+
+
+
+ + +
+ + +
+ + + +
+ + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/futuristic/futuristic.component.ts b/src/app/layout/layouts/vertical/futuristic/futuristic.component.ts new file mode 100644 index 00000000..6756e5e3 --- /dev/null +++ b/src/app/layout/layouts/vertical/futuristic/futuristic.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'futuristic-layout', + templateUrl : './futuristic.component.html', + encapsulation: ViewEncapsulation.None +}) +export class FuturisticLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/vertical/futuristic/futuristic.module.ts b/src/app/layout/layouts/vertical/futuristic/futuristic.module.ts new file mode 100644 index 00000000..aeffe4b1 --- /dev/null +++ b/src/app/layout/layouts/vertical/futuristic/futuristic.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { FuturisticLayoutComponent } from 'app/layout/layouts/vertical/futuristic/futuristic.component'; + +@NgModule({ + declarations: [ + FuturisticLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + FuturisticLayoutComponent + ] +}) +export class FuturisticLayoutModule +{ +} diff --git a/src/app/layout/layouts/vertical/thin/thin.component.html b/src/app/layout/layouts/vertical/thin/thin.component.html new file mode 100644 index 00000000..4a5f783b --- /dev/null +++ b/src/app/layout/layouts/vertical/thin/thin.component.html @@ -0,0 +1,55 @@ + + + + + +
+ Logo image +
+
+
+ + +
+ + +
+ + + +
+ + + + + +
+
+ + +
+ + +
+ + +
+ Fuse © {{currentYear}} +
+ +
diff --git a/src/app/layout/layouts/vertical/thin/thin.component.ts b/src/app/layout/layouts/vertical/thin/thin.component.ts new file mode 100644 index 00000000..2b134f3d --- /dev/null +++ b/src/app/layout/layouts/vertical/thin/thin.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Data, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { InitialData } from 'app/app.types'; + +@Component({ + selector : 'thin-layout', + templateUrl : './thin.component.html', + encapsulation: ViewEncapsulation.None +}) +export class ThinLayoutComponent implements OnInit, OnDestroy +{ + data: InitialData; + isScreenSmall: boolean; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get currentYear(): number + { + return new Date().getFullYear(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to the resolved route mock-api + this._activatedRoute.data.subscribe((data: Data) => { + this.data = data.initialData; + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Check if the screen is small + this.isScreenSmall = !matchingAliases.includes('md'); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle navigation + * + * @param name + */ + toggleNavigation(name: string): void + { + // Get the navigation + const navigation = this._fuseNavigationService.getComponent(name); + + if ( navigation ) + { + // Toggle the opened status + navigation.toggle(); + } + } +} diff --git a/src/app/layout/layouts/vertical/thin/thin.module.ts b/src/app/layout/layouts/vertical/thin/thin.module.ts new file mode 100644 index 00000000..7eb78060 --- /dev/null +++ b/src/app/layout/layouts/vertical/thin/thin.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { MessagesModule } from 'app/layout/common/messages/messages.module'; +import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; +import { SearchModule } from 'app/layout/common/search/search.module'; +import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; +import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module'; +import { SharedModule } from 'app/shared/shared.module'; +import { ThinLayoutComponent } from 'app/layout/layouts/vertical/thin/thin.component'; + +@NgModule({ + declarations: [ + ThinLayoutComponent + ], + imports : [ + HttpClientModule, + RouterModule, + MatButtonModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + FuseNavigationModule, + MessagesModule, + NotificationsModule, + SearchModule, + ShortcutsModule, + UserMenuModule, + SharedModule + ], + exports : [ + ThinLayoutComponent + ] +}) +export class ThinLayoutModule +{ +} diff --git a/src/app/mock-api/apps/calendar/api.ts b/src/app/mock-api/apps/calendar/api.ts new file mode 100644 index 00000000..f0331d3e --- /dev/null +++ b/src/app/mock-api/apps/calendar/api.ts @@ -0,0 +1,624 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep, omit } from 'lodash-es'; +import * as moment from 'moment'; +import RRule, { RRuleSet, rrulestr } from 'rrule'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { calendars as calendarsData, events as eventsData, exceptions as exceptionsData, settings as settingsData, weekdays as weekdaysData } from 'app/mock-api/apps/calendar/data'; + +@Injectable({ + providedIn: 'root' +}) +export class CalendarMockApi +{ + private _calendars: any[] = calendarsData; + private _events: any[] = eventsData; + private _exceptions: any[] = exceptionsData; + private _settings: any = settingsData; + private _weekdays: any = weekdaysData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Calendars - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/calendar/calendars') + .reply(() => { + + // Clone the calendars + const calendars = cloneDeep(this._calendars); + + // Return the response + return [200, calendars]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Calendars - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/calendar/calendars') + .reply(({request}) => { + + // Get the calendar as the new calendar + const newCalendar = cloneDeep(request.body.calendar); + + // Add an id to the new calendar + newCalendar.id = FuseMockApiUtils.guid(); + + // Push the new calendar + this._calendars.push(newCalendar); + + // Return the response + return [200, newCalendar]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Calendars - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/calendar/calendars') + .reply(({request}) => { + + // Get the id and calendar + const id = request.body.id; + const calendar = cloneDeep(request.body.calendar); + + // Prepare the updated calendar + let updatedCalendar = null; + + // Find the calendar and update it + this._calendars.forEach((item, index, calendars) => { + + if ( item.id === id ) + { + // Update the calendar + calendars[index] = assign({}, calendars[index], calendar); + + // Store the updated calendar + updatedCalendar = calendars[index]; + } + }); + + // Return the response + return [200, updatedCalendar]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Calendars - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/calendar/calendars') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the calendar and delete it + const index = this._calendars.findIndex((calendar) => calendar.id === id); + this._calendars.splice(index, 1); + + // Find the events that belong to the calendar and remove them as well + this._events = this._events.filter((event) => event.calendarId !== id); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Events - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/calendar/events') + .reply(({request}) => { + + // Get the start and end dates as moment + const viewStart = moment(request.params.get('start')).startOf('day'); + const viewEnd = moment(request.params.get('end')).endOf('day'); + + // Clone the events + const events = cloneDeep(this._events); + + // Prepare the results + const results: any[] = []; + + // Go through the events... + events.forEach((event) => { + + // Get the event's start and end dates as moment + const eventStart = moment(event.start); + const eventEnd = moment(event.end); + + // If it's a normal event... + if ( !event.recurrence ) + { + // Only grab the event if it's within the range + if ( eventStart.isSameOrAfter(viewStart, 'day') && eventEnd.isSameOrBefore(viewEnd, 'day') ) + { + // Push the event into the results array + results.push(event); + } + } + // If it's a recurring event... + else + { + // Skip if the event does not recur within the view range + if ( eventStart.isAfter(viewEnd, 'day') || eventEnd.isBefore(viewStart, 'day') ) + { + return; + } + + // Set the DTSTART and UNTIL for RRule + const dtStart = eventStart.clone(); + const until = viewEnd.isBefore(eventEnd) ? viewEnd.clone().utc() : eventEnd.clone().utc(); + + // Create an RRuleSet + const rruleset = this._generateRuleset(event, dtStart, until); + + // Generate the recurring dates and loop through them + rruleset.all().forEach((date) => { + + // Get the rule date as a moment + const ruleDate = moment(date); + + // Subtract the UTC Offset from the rule date as we use local time for DTSTART. + // The reason for this is simple; if we use UTC dates for DTSTART, RRule generated + // dates can shift. Since we have to store the dates as UTC, we can figure out the + // UTC value by simply subtracting the UTC Offset (minutes) from the rule date rather + // than using UTC dates in the first place. This will ensure there will be no time/day + // shift on generated rules since they will be generated based on the local time. + ruleDate.subtract(ruleDate.utcOffset(), 'minutes'); + + // Skip the date if it's not in between the view start and view end + // to prevent generating unnecessary amount of instances and to + // prevent instance duplication + if ( !ruleDate.isBetween(viewStart, viewEnd, 'day', '[]') ) + { + return; + } + + // Prepare the event instance + const eventInstance = { + + // Generate an instance id using the event id and rule date + id: event.id + '_' + ruleDate.clone().utc().format('YYYYMMDD[T]HHmmss[Z]'), + + // Set the recurringEventId on the event so we don't lose the event's origin + recurringEventId: event.id, + + // Whether this is the first instance of the recurring event or not + isFirstInstance: event.start === ruleDate.clone().toISOString(), + + // Get the rest of the mock-api + calendarId : event.calendarId, + title : event.title, + description: event.description, + start : ruleDate.toISOString(), + end : ruleDate.add(event.duration, 'minutes').toISOString(), + duration : event.duration, + allDay : event.allDay, + recurrence : event.recurrence + }; + + // Push the event instance to the results array + results.push(eventInstance); + }); + } + }); + + // Return the response + return [200, results]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Event - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/calendar/event') + .reply(({request}) => { + + // Get the event as the new event + const newEvent = cloneDeep(request.body.event); + + // Add an id to the new event + newEvent.id = FuseMockApiUtils.guid(); + + // Unshift the new event + this._events.unshift(newEvent); + + // Return the response + return [200, newEvent]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Event - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/calendar/event') + .reply(({request}) => { + + // Get the id and event + const id = request.body.id; + const event = cloneDeep(request.body.event); + + // Prepare the updated event + let updatedEvent = null; + + // Find the event and update it + this._events.forEach((item, index, events) => { + + if ( item.id === id ) + { + // Update the event + events[index] = assign({}, events[index], event); + + // Store the updated event + updatedEvent = events[index]; + } + }); + + // Return the response + return [200, updatedEvent]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Event - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/calendar/event') + .reply(({request}) => { + + // Get the id and event + const id = request.params.get('id'); + + // Find the event and delete it + const index = this._events.findIndex((item) => item.id === id); + this._events.splice(index, 1); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Recurring Event - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/calendar/recurring-event') + .reply(({request}) => { + + // Get the event, original event and mode + const event = cloneDeep(request.body.event); + const originalEvent = cloneDeep(request.body.originalEvent); + const mode = request.body.mode; + + // Find the original recurring event from db + const recurringEvent = this._events.find((item) => item.id === event.recurringEventId); + + // Single + if ( mode === 'single' ) + { + // Create a new event from the event while ignoring the range and recurringEventId + const { + range, + recurringEventId, + ...newEvent + } = event; + + // Generate a unique id for the event + newEvent.id = FuseMockApiUtils.guid(); + + // Calculate the end date using the start date and the duration + newEvent.end = moment(newEvent.start).add(newEvent.duration, 'minutes'); + + // Null-ify the recurrence and duration + newEvent.duration = null; + newEvent.recurrence = null; + + // Push the new event to the events array + this._events.push(newEvent); + + // If this is the first instance of the recurring event... + if ( originalEvent.start === recurringEvent.start ) + { + // Generate the rruleset + const rruleset = this._generateRuleset(recurringEvent, moment(recurringEvent.start), moment(recurringEvent.end).utc()); + + // Generate the dates using rruleset and get the 2nd date from start + const ruleDate = moment(rruleset.all((date, i) => i < 2)[1]); + + // Subtract the UTC Offset from the rule date as we use local time for DTSTART. + // The reason for this is simple; if we use UTC dates for DTSTART, RRule generated + // dates can shift. Since we have to store the dates as UTC, we can figure out the + // UTC value by simply subtracting the UTC Offset (minutes) from the rule date rather + // than using UTC dates in the first place. This will ensure there will be no time/day + // shift on generated rules since they will be generated based on the local time. + ruleDate.subtract(ruleDate.utcOffset(), 'minutes'); + + // Update the recurring event's start date + recurringEvent.start = ruleDate.toISOString(); + } + // Otherwise... + else + { + // Add a new exception for the recurring event that ignores this single event's start date + this._exceptions.push({ + id : FuseMockApiUtils.guid(), + eventId: originalEvent.recurringEventId, + exdate : moment(originalEvent.start).toISOString() + }); + } + } + + // Future + if ( mode === 'future' ) + { + // Update the end date + recurringEvent.end = moment(originalEvent.start).subtract(1, 'day').endOf('day').toISOString(); + + // Parse the recurrence rules from the original event + const parsedRules: any = {}; + originalEvent.recurrence.split(';').forEach((rule: string) => { + const parsedRule = rule.split('='); + parsedRules[parsedRule[0]] = parsedRule[1]; + }); + + // Add/Update the UNTIL rule + parsedRules['UNTIL'] = moment(recurringEvent.end).utc().format('YYYYMMDD[T]HHmmss[Z]'); + + // Generate the rule string from the parsed rules + const rules: string[] = []; + Object.keys(parsedRules).forEach((key) => { + rules.push(key + '=' + parsedRules[key]); + }); + + // Update the recurrence on the original recurring event + recurringEvent.recurrence = rules.join(';'); + + // Create a new event from the event while ignoring the recurringEventId + const { + recurringEventId, + ...newEvent + } = event; + + // Generate a unique id for the event + newEvent.id = FuseMockApiUtils.guid(); + + // Push the new event to the events array + this._events.push(newEvent); + } + + // All + if ( mode === 'all' ) + { + // Find the event index + const eventIndex = this._events.findIndex((item) => item.id === event.recurringEventId); + + // Update the recurring event + this._events[eventIndex] = assign({}, this._events[eventIndex], omit(event, ['id', 'recurringEventId', 'range'])); + } + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Recurring Event - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/calendar/recurring-event') + .reply(({request}) => { + + // Get the event and mode + const event = JSON.parse(request.params.get('event') ?? ''); + const mode = request.params.get('mode'); + + // Find the recurring event + const recurringEvent = this._events.find((item) => item.id === event.recurringEventId); + + // Single + if ( mode === 'single' ) + { + // If this is the first instance of the recurring event... + if ( event.start === recurringEvent.start ) + { + // Generate the rruleset + const rruleset = this._generateRuleset(recurringEvent, moment(recurringEvent.start), moment(recurringEvent.end).utc()); + + // Generate the dates using rruleset and get the 2nd date from start + const ruleDate = moment(rruleset.all((date, i) => i < 2)[1]); + + // Subtract the UTC Offset from the rule date as we use local time for DTSTART. + // The reason for this is simple; if we use UTC dates for DTSTART, RRule generated + // dates can shift. Since we have to store the dates as UTC, we can figure out the + // UTC value by simply subtracting the UTC Offset (minutes) from the rule date rather + // than using UTC dates in the first place. This will ensure there will be no time/day + // shift on generated rules since they will be generated based on the local time. + ruleDate.subtract(ruleDate.utcOffset(), 'minutes'); + + // Update the recurring event's start date + recurringEvent.start = ruleDate.toISOString(); + } + // Otherwise... + else + { + // Add a new exception for the recurring event that ignores this single event's start date + this._exceptions.push({ + id : FuseMockApiUtils.guid(), + eventId: event.recurringEventId, + exdate : moment(event.start).toISOString() + }); + } + } + + // Future + if ( mode === 'future' ) + { + // Update the end date of the event + recurringEvent.end = moment(event.start).subtract(1, 'day').endOf('day').toISOString(); + + // Parse the recurrence rules of the event + const parsedRules: any = {}; + recurringEvent.recurrence.split(';').forEach((rule: string) => { + const parsedRule = rule.split('='); + parsedRules[parsedRule[0]] = parsedRule[1]; + }); + + // Add/Update the UNTIL rule + parsedRules['UNTIL'] = moment(event.end).utc().format('YYYYMMDD[T]HHmmss[Z]'); + + // Generate the rule string from the parsed rules + const rules: string[] = []; + Object.keys(parsedRules).forEach((key) => { + rules.push(key + '=' + parsedRules[key]); + }); + + // Update the recurrence of the event + recurringEvent.recurrence = rules.join(';'); + } + + // All + if ( mode === 'all' ) + { + // Find the event and delete it + const index = this._events.findIndex((item) => item.id === event.recurringEventId); + this._events.splice(index, 1); + } + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Settings - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/calendar/settings') + .reply(() => [200, cloneDeep(this._settings)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Settings - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/calendar/settings') + .reply(({request}) => { + + // Get the settings + const settings = cloneDeep(request.body.settings); + + // Store the updated settings + this._settings = settings; + + // Return the response + return [200, settings]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Weekdays - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/calendar/weekdays') + .reply(() => { + + // Clone the weekdays + const weekdays = cloneDeep(this._weekdays); + + // If the startWeekOn setting is set to Sunday... + if ( this._settings.startWeekOn === 0 ) + { + // Move the Sunday to the beginning + weekdays.unshift(weekdays.pop()); + } + + // If the startWeekOn is set to Saturday... + if ( this._settings.startWeekOn === 6 ) + { + // Move the Sunday to the beginning + weekdays.unshift(weekdays.pop()); + + // Then move the Saturday to the beginning + weekdays.unshift(weekdays.pop()); + } + + // Return the response + return [200, weekdays]; + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Generates an RRuleSet from given event + * + * @param event + * @param dtStart + * @param until + * @private + */ + private _generateRuleset(event: any, dtStart: any, until: any): RRuleSet | RRule + { + // Parse the recurrence rules + const parsedRules: any = {}; + event.recurrence.split(';').forEach((rule: string) => { + + // Split the rule + const parsedRule = rule.split('='); + + // Omit UNTIL or COUNT from the parsed rules since we only + // need them for calculating the event's end date. We will + // add an UNTIL later based on the above calculations. + if ( parsedRule[0] === 'UNTIL' || parsedRule[0] === 'COUNT' ) + { + return; + } + + // Add the rule to the parsed rules + parsedRules[parsedRule[0]] = parsedRule[1]; + }); + + // Generate the rule array from the parsed rules + const rules: string[] = []; + Object.keys(parsedRules).forEach((key) => { + rules.push(key + '=' + parsedRules[key]); + }); + + // Prepare the ruleSet + const ruleSet = []; + + // Add DTSTART + ruleSet.push('DTSTART:' + dtStart.format('YYYYMMDD[T]HHmmss[Z]')); + + // Add RRULE + ruleSet.push('RRULE:' + rules.join(';') + ';UNTIL=' + until.format('YYYYMMDD[T]HHmmss[Z]')); + + // Find and add any available exceptions to the rule + this._exceptions.forEach((item) => { + + // If the item is an exception to this event... + if ( item.eventId === event.id ) + { + // Add it as an EXDATE to the rrule + ruleSet.push('EXDATE:' + moment(item.exdate).format('YYYYMMDD[T]HHmmss[Z]')); + } + }); + + // Create an RRuleSet from the ruleSet array + return rrulestr(ruleSet.join('\n'), {forceset: true}); + } +} diff --git a/src/app/mock-api/apps/calendar/data.ts b/src/app/mock-api/apps/calendar/data.ts new file mode 100644 index 00000000..89fee0c4 --- /dev/null +++ b/src/app/mock-api/apps/calendar/data.ts @@ -0,0 +1,170 @@ +import * as moment from 'moment'; + +/* tslint:disable:max-line-length */ +export const calendars = [ + { + id : '1a470c8e-40ed-4c2d-b590-a4f1f6ead6cc', + title : 'Personal', + color : 'bg-teal-500', + visible: true + }, + { + id : '5dab5f7b-757a-4467-ace1-305fe07b11fe', + title : 'Work', + color : 'bg-indigo-500', + visible: true + }, + { + id : '09887870-f85a-40eb-8171-1b13d7a7f529', + title : 'Appointments', + color : 'bg-pink-500', + visible: true + } +]; +export const events = [ + // Personal + { + id : '3be50686-e3a1-4f4b-aa4d-5cb8517ba4e4', + calendarId : '1a470c8e-40ed-4c2d-b590-a4f1f6ead6cc', + title : 'Portfolio Design', + description: '', + start : moment().hour(9).minute(0).second(0).millisecond(0).toISOString(), // Today 09:00 + end : moment().add(1, 'day').hour(14).minute(0).second(0).millisecond(0).toISOString(), // Tomorrow 14:00 + duration : null, + allDay : false, + recurrence : null + }, + { + id : '660f0dcd-48f8-4266-a89a-8ee0789c074a', + calendarId : '1a470c8e-40ed-4c2d-b590-a4f1f6ead6cc', + title : 'Dinner with Mom', + description: 'Do not forget to buy her lilacs!', + start : moment().date(10).hour(18).minute(0).second(0).millisecond(0).toISOString(), // 10th of the current month at 18:00 + end : moment().date(10).hour(20).minute(0).second(0).millisecond(0).toISOString(), // 10th of the current month at 20:00 + duration : null, + allDay : false, + recurrence : null + }, + { + id : '7471b840-5efb-45da-9092-a0f04ee5617b', + calendarId : '1a470c8e-40ed-4c2d-b590-a4f1f6ead6cc', + title : 'Lunch with Becky', + description: '', + start : moment().date(21).hour(12).minute(0).second(0).millisecond(0).toISOString(), // 21st of the current month at noon + end : moment().date(21).hour(14).minute(0).second(0).millisecond(0).toISOString(), // 21st of the current month at 14:00 + duration : null, + allDay : false, + recurrence : null + }, + { + id : 'c3e6c110-9b67-4e6b-a2ab-3046abf1b074', + calendarId : '1a470c8e-40ed-4c2d-b590-a4f1f6ead6cc', + title : 'Mom\'s Birthday', + description: '', + start : moment().date(8).startOf('day').toISOString(), // 8th of the current month at start of the day + end : moment().year(9999).endOf('year').toISOString(), // End of the times + duration : 0, + allDay : true, + recurrence : 'FREQ=YEARLY;INTERVAL=1' + }, + // Appointments + { + id : 'd2220429-9214-4c4b-9da6-f8da2fbfd507', + calendarId : '09887870-f85a-40eb-8171-1b13d7a7f529', + title : 'Doctor\'s Visit', + description: 'Measure blood pressure before leaving home', + start : moment().date(1).hour(10).minute(0).second(0).millisecond(0).add((9 - moment().date(1).day()) % 7, 'day').toISOString(), // First Tuesday of the current month at 10:00 + end : moment().year(9999).endOf('year').toISOString(), // End of the times + duration : 90, // Minutes + allDay : false, + recurrence : 'FREQ=MONTHLY;INTERVAL=1;BYDAY=1TU' + }, + { + id : '4d88418c-cbdf-4f03-89e1-e3dca14a9e92', + calendarId : '09887870-f85a-40eb-8171-1b13d7a7f529', + title : 'Therapy Session', + description: '', + start : moment().date(1).hour(13).minute(0).second(0).millisecond(0).add((6 - moment().date(1).day()) % 7, 'day').add(1, 'week').toISOString(), // Second Saturday of the current month at 13:00 + end : moment().year(9999).endOf('year').toISOString(), // End of the times + duration : 120, // Minutes + allDay : false, + recurrence : 'FREQ=WEEKLY;INTERVAL=2;BYDAY=SA' + }, + // Work + { + id : '0e848e4a-0333-42e3-b223-0209c4b58a3b', + calendarId : '5dab5f7b-757a-4467-ace1-305fe07b11fe', + title : 'Design Review', + description: '', + start : moment().date(19).hour(15).minute(0).second(0).millisecond(0).toISOString(), // 19th of the current month at 15:00 + end : moment().date(19).hour(17).minute(30).second(0).millisecond(0).toISOString(), // 19th of the current month at 17:30 + duration : null, + allDay : true, + recurrence : null + }, + { + id : 'f619eb76-c21b-4bb0-aeff-41e765cae290', + calendarId : '5dab5f7b-757a-4467-ace1-305fe07b11fe', + title : 'Consulting', + description: 'Sarah and Jessica will be joining the call', + start : moment().date(8).hour(11).minute(30).second(0).millisecond(0).toISOString(), // 8th of the current month at 11:30 + end : moment().date(8).hour(12).minute(45).second(0).millisecond(0).toISOString(), // 8th of the current month at 12:45 + duration : null, + allDay : false, + recurrence : null + }, + { + id : 'd97ea3ca-0e5a-4b86-a4fa-5b80a261081e', + calendarId : '5dab5f7b-757a-4467-ace1-305fe07b11fe', + title : 'Meeting', + description: '', + start : moment().date(1).hour(9).minute(0).second(0).millisecond(0).add((5 - moment().date(1).day()) % 7, 'day').add(1, 'week').toISOString(), // Second Friday of the current month at 09:00 + end : moment().year(9999).endOf('year').toISOString(), // End of the times + duration : 150, // Minutes + allDay : false, + recurrence : 'FREQ=WEEKLY;INTERVAL=2;BYDAY=FR' + } +]; +export const exceptions = []; +export const settings = { + dateFormat : 'll', // Aug 20, 2019 + timeFormat : '24', // 24-hour format + startWeekOn: 1 // Monday +}; +export const weekdays = [ + { + abbr : 'M', + label: 'Monday', + value: 'MO' + }, + { + abbr : 'T', + label: 'Tuesday', + value: 'TU' + }, + { + abbr : 'W', + label: 'Wednesday', + value: 'WE' + }, + { + abbr : 'T', + label: 'Thursday', + value: 'TH' + }, + { + abbr : 'F', + label: 'Friday', + value: 'FR' + }, + { + abbr : 'S', + label: 'Saturday', + value: 'SA' + }, + { + abbr : 'S', + label: 'Sunday', + value: 'SU' + } +]; diff --git a/src/app/mock-api/apps/contacts/api.ts b/src/app/mock-api/apps/contacts/api.ts new file mode 100644 index 00000000..3026de46 --- /dev/null +++ b/src/app/mock-api/apps/contacts/api.ts @@ -0,0 +1,353 @@ +import { Injectable } from '@angular/core'; +import { from } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { contacts as contactsData, countries as countriesData, tags as tagsData } from 'app/mock-api/apps/contacts/data'; + +@Injectable({ + providedIn: 'root' +}) +export class ContactsMockApi +{ + private _contacts: any[] = contactsData; + private _countries: any[] = countriesData; + private _tags: any[] = tagsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Contacts - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/contacts/all') + .reply(() => { + + // Clone the contacts + const contacts = cloneDeep(this._contacts); + + // Sort the contacts by the name field by default + contacts.sort((a, b) => a.name.localeCompare(b.name)); + + // Return the response + return [200, contacts]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Contacts Search - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/contacts/search') + .reply(({request}) => { + + // Get the search query + const query = request.params.get('query'); + + // Clone the contacts + let contacts = cloneDeep(this._contacts); + + // If the query exists... + if ( query ) + { + // Filter the contacts + contacts = contacts.filter((contact) => contact.name && contact.name.toLowerCase().includes(query.toLowerCase())); + } + + // Sort the contacts by the name field by default + contacts.sort((a, b) => a.name.localeCompare(b.name)); + + // Return the response + return [200, contacts]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Contact - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/contacts/contact') + .reply(({request}) => { + + // Get the id from the params + const id = request.params.get('id'); + + // Clone the contacts + const contacts = cloneDeep(this._contacts); + + // Find the contact + const contact = contacts.find((item) => { + return item.id === id; + }); + + // Return the response + return [200, contact]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Contact - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/contacts/contact') + .reply(() => { + + // Generate a new contact + const newContact = { + id : FuseMockApiUtils.guid(), + avatar : null, + name : 'New Contact', + emails : [], + phoneNumbers: [], + job : { + title : '', + company: '' + }, + birthday : null, + address : null, + notes : null, + tags : [] + }; + + // Unshift the new contact + this._contacts.unshift(newContact); + + // Return the response + return [200, newContact]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Contact - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/contacts/contact') + .reply(({request}) => { + + // Get the id and contact + const id = request.body.id; + const contact = cloneDeep(request.body.contact); + + // Prepare the updated contact + let updatedContact = null; + + // Find the contact and update it + this._contacts.forEach((item, index, contacts) => { + + if ( item.id === id ) + { + // Update the contact + contacts[index] = assign({}, contacts[index], contact); + + // Store the updated contact + updatedContact = contacts[index]; + } + }); + + // Return the response + return [200, updatedContact]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Contact - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/contacts/contact') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the contact and delete it + this._contacts.forEach((item, index) => { + + if ( item.id === id ) + { + this._contacts.splice(index, 1); + } + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Countries - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/contacts/countries') + .reply(() => [200, cloneDeep(this._countries)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/contacts/tags') + .reply(() => [200, cloneDeep(this._tags)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/contacts/tag') + .reply(({request}) => { + + // Get the tag + const newTag = cloneDeep(request.body.tag); + + // Generate a new GUID + newTag.id = FuseMockApiUtils.guid(); + + // Unshift the new tag + this._tags.unshift(newTag); + + // Return the response + return [200, newTag]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/contacts/tag') + .reply(({request}) => { + + // Get the id and tag + const id = request.body.id; + const tag = cloneDeep(request.body.tag); + + // Prepare the updated tag + let updatedTag = null; + + // Find the tag and update it + this._tags.forEach((item, index, tags) => { + + if ( item.id === id ) + { + // Update the tag + tags[index] = assign({}, tags[index], tag); + + // Store the updated tag + updatedTag = tags[index]; + } + }); + + // Return the response + return [200, updatedTag]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tag - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/contacts/tag') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the tag and delete it + this._tags.forEach((item, index) => { + + if ( item.id === id ) + { + this._tags.splice(index, 1); + } + }); + + // Get the contacts that have the tag + const contactsWithTag = this._contacts.filter(contact => contact.tags.indexOf(id) > -1); + + // Iterate through them and delete the tag + contactsWithTag.forEach((contact) => { + contact.tags.splice(contact.tags.indexOf(id), 1); + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Avatar - POST + // ----------------------------------------------------------------------------------------------------- + + /** + * Read the given file as mock-api url + * + * @param file + */ + const readAsDataURL = (file: File): Promise => { + + // Return a new promise + return new Promise((resolve, reject) => { + + // Create a new reader + const reader = new FileReader(); + + // Resolve the promise on success + reader.onload = () => { + resolve(reader.result); + }; + + // Reject the promise on error + reader.onerror = (e) => { + reject(e); + }; + + // Read the file as the + reader.readAsDataURL(file); + }); + }; + + this._fuseMockApiService + .onPost('api/apps/contacts/avatar') + .reply(({request}) => { + + // Get the id and avatar + const id = request.body.id; + const avatar = request.body.avatar; + + // Prepare the updated contact + let updatedContact: any = null; + + // In a real world application, this would return the path + // of the saved image file (from host, S3 bucket, etc.) but, + // for the sake of the demo, we encode the image to base64 + // and return it as the new path of the uploaded image since + // the src attribute of the img tag works with both image urls + // and encoded images. + return from(readAsDataURL(avatar)).pipe( + map((path) => { + + // Find the contact and update it + this._contacts.forEach((item, index, contacts) => { + + if ( item.id === id ) + { + // Update the avatar + contacts[index].avatar = path; + + // Store the updated contact + updatedContact = contacts[index]; + } + }); + + // Return the response + return [200, updatedContact]; + }) + ); + }); + } +} diff --git a/src/app/mock-api/apps/contacts/data.ts b/src/app/mock-api/apps/contacts/data.ts new file mode 100644 index 00000000..957bca53 --- /dev/null +++ b/src/app/mock-api/apps/contacts/data.ts @@ -0,0 +1,4432 @@ +/* tslint:disable:max-line-length */ +export const contacts = [ + { + id : 'cd5fa417-b667-482d-b208-798d9da3213c', + avatar : 'assets/images/avatars/male-01.jpg', + background : 'assets/images/cards/14-640x480.jpg', + name : 'Dejesus Michael', + emails : [ + { + email: 'dejesusmichael@mail.org', + label: 'Personal' + }, + { + email: 'michael.dejesus@vitricomp.io', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'bs', + number : '984 531 2468', + label : 'Mobile' + }, + { + country: 'bs', + number : '806 470 2693', + label : 'Work' + } + ], + title : 'Track Service Worker', + company : 'Vitricomp', + birthday : '1975-01-10T12:00:00.000Z', + address : '279 Independence Avenue, Calvary, Guam, PO4127', + notes : '

Do incididunt cillum duis eu pariatur enim proident minim officia amet proident consequat consequat qui consequat magna magna occaecat aliquip culpa pariatur velit nisi nostrud irure eu ullamco exercitation sint.

Cillum deserunt laborum laborum quis nisi enim et aliquip labore excepteur in excepteur labore amet in ipsum ipsum nostrud deserunt lorem nisi voluptate dolor minim enim ut eu cupidatat enim.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'beec5287-ed50-4504-858a-5dc3f8ce6935', + avatar : null, + background : null, + name : 'Dena Molina', + emails : [ + { + email: 'denamolina@mail.us', + label: 'Personal' + }, + { + email: 'molina.dena@envire.tv', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'io', + number : '934 537 3180', + label : 'Mobile' + } + ], + title : 'Weather Analyst', + company : 'Envire', + birthday : '1994-12-05T12:00:00.000Z', + address : '856 Woodside Avenue, Alfarata, Iowa, PO4992', + notes : '

Consequat duis ullamco sint elit pariatur esse dolore nostrud consequat lorem duis sunt veniam ipsum exercitation eiusmod consequat nisi quis voluptate quis officia irure fugiat ex duis eu amet ex.

Irure est nisi dolor culpa sunt nulla irure lorem adipisicing non do consequat deserunt et ea eu non reprehenderit fugiat ex elit nulla sunt quis voluptate enim nulla aliquip veniam.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '9d3f0e7f-dcbd-4e56-a5e8-87b8154e9edf', + avatar : 'assets/images/avatars/male-02.jpg', + background : 'assets/images/cards/15-640x480.jpg', + name : 'Bernard Langley', + emails : [ + { + email: 'bernardlangley@mail.com', + label: 'Personal' + }, + { + email: 'langley.bernard@boilcat.name', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'md', + number : '893 548 2862', + label : 'Mobile' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Boilcat', + birthday : '1988-05-26T12:00:00.000Z', + address : '943 Adler Place, Hamilton, South Dakota, PO5592', + notes : '

Est amet in adipisicing ex excepteur ullamco est lorem adipisicing veniam reprehenderit elit commodo cillum commodo eu officia fugiat id reprehenderit sunt mollit eiusmod dolor fugiat ad do esse aliquip.

Mollit amet adipisicing enim est est commodo sint et eu nulla in laboris ipsum aliqua elit aliqua adipisicing ea nulla nulla consectetur velit laborum labore ullamco eu sit consectetur velit.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '42a5da95-5e6d-42fd-a09d-de755d123a47', + avatar : 'assets/images/avatars/male-03.jpg', + background : 'assets/images/cards/16-640x480.jpg', + name : 'Mclaughlin Steele', + emails : [ + { + email: 'mclaughlinsteele@mail.me', + label: 'Personal' + }, + { + email: 'steele.mclaughlin@accel.info', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'va', + number : '830 484 3813', + label : 'Mobile' + }, + { + country: 'va', + number : '999 475 2789', + label : 'Work' + }, + { + country: 'va', + number : '933 406 3598', + label : 'Home' + } + ], + company : 'Accel', + birthday : '1968-08-13T12:00:00.000Z', + address : '334 Sandford Street, Savage, Virgin Islands, PO1858', + notes : '

Consequat eu aliquip dolor non consequat laborum ad non labore cillum consectetur quis dolore do ea nulla incididunt proident ea eiusmod in do qui eiusmod et irure dolor ea adipisicing.

Reprehenderit occaecat nostrud ad aliquip commodo amet velit id ut minim dolor mollit mollit in eiusmod voluptate lorem nisi labore culpa elit proident laborum ipsum occaecat esse sint nostrud esse.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'a7806ced-03f1-4197-8b30-00bdd463366b', + avatar : 'assets/images/avatars/male-04.jpg', + background : 'assets/images/cards/17-640x480.jpg', + name : 'Marsh Cochran', + emails : [ + { + email: 'marshcochran@mail.biz', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'tz', + number : '864 401 3980', + label : 'Mobile' + }, + { + country: 'tz', + number : '956 546 2589', + label : 'Work' + } + ], + title : 'Fundraising Director', + company : 'Xsports', + birthday : '1983-12-22T12:00:00.000Z', + address : '487 Hamilton Walk, Bergoo, American Samoa, PO5616', + notes : '

Id eiusmod deserunt amet lorem commodo consequat nostrud magna aliquip ex et pariatur labore non elit ad ad nulla culpa reprehenderit enim magna aliqua enim pariatur occaecat sint do lorem.

Adipisicing ut est nulla nisi cupidatat consequat aliqua et esse in voluptate amet eiusmod ut esse ea do irure commodo aute culpa amet consequat id adipisicing et incididunt ut duis.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : 'f4ad15d9-5a24-463a-88ea-6189d6bb3a53', + avatar : 'assets/images/avatars/male-05.jpg', + background : 'assets/images/cards/18-640x480.jpg', + name : 'Parrish Austin', + emails : [ + { + email: 'parrishaustin@mail.co.uk', + label: 'Personal' + }, + { + email: 'austin.parrish@insource.net', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'lv', + number : '834 426 3574', + label : 'Mobile' + }, + { + country: 'lv', + number : '816 573 3694', + label : 'Work' + }, + { + country: 'lv', + number : '967 515 2009', + label : 'Home' + } + ], + title : 'Motor Winder', + company : 'Insource', + birthday : '1963-08-24T12:00:00.000Z', + address : '610 Harbor Lane, Cascades, Minnesota, PO8639', + notes : '

Cillum enim eiusmod dolor aliqua ipsum exercitation sint aliqua lorem dolore id velit sint velit labore cupidatat minim cupidatat elit est magna eu proident eiusmod non pariatur est esse pariatur.

Sint do enim officia velit pariatur excepteur commodo adipisicing labore elit velit velit id exercitation excepteur veniam reprehenderit sint nulla duis ad incididunt cillum in in labore laboris magna esse.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '780d0111-5e5c-4694-8d1d-0ea421971fbf', + avatar : 'assets/images/avatars/female-02.jpg', + background : 'assets/images/cards/19-640x480.jpg', + name : 'Laverne Dodson', + emails : [ + { + email: 'lavernedodson@mail.ca', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'ar', + number : '964 417 2318', + label : 'Mobile' + }, + { + country: 'ar', + number : '830 410 2506', + label : 'Work' + } + ], + title : 'Television News Producer', + company : 'Lovepad', + birthday : '1973-09-25T12:00:00.000Z', + address : '428 Newport Street, Neahkahnie, Arkansas, PO8324', + notes : '

Incididunt lorem proident est anim amet nulla do nulla ea anim ullamco ea amet voluptate laboris do elit elit consequat in esse in dolor enim irure ut irure ad commodo.

Aliqua dolore nulla sunt ad nostrud aute labore occaecat non amet nulla adipisicing sint eu lorem velit sint do sint adipisicing esse adipisicing anim culpa quis dolor non magna ea.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'bf172879-423a-4fd6-8df3-6d1938bbfe1f', + avatar : 'assets/images/avatars/male-06.jpg', + background : 'assets/images/cards/20-640x480.jpg', + name : 'Edwards Mckenzie', + emails : [ + { + email: 'edwardsmckenzie@mail.org', + label: 'Personal' + }, + { + email: 'mckenzie.edwards@bugsall.io', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'pe', + number : '934 519 2903', + label : 'Mobile' + }, + { + country: 'pe', + number : '989 489 3662', + label : 'Work' + }, + { + country: 'pe', + number : '813 461 2790', + label : 'Home' + } + ], + title : 'Legal Assistant', + company : 'Bugsall', + birthday : '1988-07-27T12:00:00.000Z', + address : '384 Polhemus Place, Dalton, Palau, PO6038', + notes : '

Eu veniam consectetur eiusmod anim sint anim consectetur do consectetur aliqua cillum proident fugiat do in aliqua ipsum id consequat commodo qui officia adipisicing ullamco occaecat laboris proident incididunt exercitation.

Velit ullamco magna aute proident irure ut magna ullamco labore dolor deserunt deserunt tempor fugiat ex ullamco do sunt veniam reprehenderit officia elit duis sint ut proident pariatur est reprehenderit.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '1eaa3213-ece2-4ba6-8e15-eb36ca388f50', + avatar : 'assets/images/avatars/female-03.jpg', + background : 'assets/images/cards/21-640x480.jpg', + name : 'Trudy Berg', + emails : [ + { + email: 'trudyberg@mail.us', + label: 'Personal' + }, + { + email: 'berg.trudy@satiance.tv', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'ls', + number : '912 539 2770', + label : 'Mobile' + } + ], + title : 'Meteorologist', + company : 'Satiance', + birthday : '1989-12-15T12:00:00.000Z', + address : '945 Jerome Avenue, Riceville, North Carolina, PO1625', + notes : '

Excepteur ullamco aute aliqua reprehenderit ullamco do anim ut ut veniam et ut et ut commodo aliqua consequat occaecat fugiat dolor labore proident ipsum ad culpa est cillum aliqua reprehenderit.

Amet aliqua sint laboris in aute nostrud voluptate tempor ea tempor laborum tempor culpa dolore aliqua nulla dolore ad enim id cupidatat nostrud nostrud amet non velit id fugiat lorem.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : 'abd9e78b-9e96-428f-b3ff-4d934c401bee', + avatar : 'assets/images/avatars/female-04.jpg', + background : 'assets/images/cards/22-640x480.jpg', + name : 'Elsie Melendez', + emails : [ + { + email: 'elsiemelendez@mail.com', + label: 'Personal' + }, + { + email: 'melendez.elsie@chillium.name', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'tg', + number : '907 515 3007', + label : 'Mobile' + }, + { + country: 'tg', + number : '967 534 2803', + label : 'Work' + } + ], + title : 'Fundraising Director', + company : 'Chillium', + birthday : '1980-06-28T12:00:00.000Z', + address : '428 Varanda Place, Veyo, Oklahoma, PO6188', + notes : '

Laboris commodo consequat duis dolor ullamco nisi sunt ipsum nisi elit dolore aute sint tempor qui ad sit aliqua laboris consequat dolore aliqua est deserunt irure cillum tempor ut veniam.

Eiusmod nulla ex esse in deserunt consectetur non qui cillum reprehenderit magna sit ipsum lorem aute consequat sint magna id laboris velit adipisicing non ipsum ipsum sint velit ex non.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : 'efae92cc-3bd1-4c6a-a395-b6760c69bd55', + avatar : 'assets/images/avatars/male-07.jpg', + background : 'assets/images/cards/23-640x480.jpg', + name : 'Lamb Underwood', + emails : [ + { + email: 'lambunderwood@mail.me', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'pf', + number : '855 517 2767', + label : 'Mobile' + }, + { + country: 'pf', + number : '906 442 3593', + label : 'Work' + }, + { + country: 'pf', + number : '905 402 2121', + label : 'Home' + } + ], + title : 'Legal Assistant', + company : 'Exotechno', + birthday : '1990-07-26T12:00:00.000Z', + address : '609 Greenpoint Avenue, Beason, Vermont, PO5229', + notes : '

Exercitation tempor laboris dolor deserunt nulla et nisi ullamco minim duis sint nulla sint deserunt irure excepteur nostrud ipsum duis enim sit exercitation eiusmod tempor commodo excepteur mollit cupidatat fugiat.

Deserunt est dolore nulla laborum consequat veniam elit lorem do exercitation incididunt ea ad laboris lorem ipsum ex incididunt nostrud ipsum laborum et nostrud minim aute velit incididunt quis quis.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : 'bde636a7-c3d2-4bff-939a-aab11df1516b', + avatar : null, + background : null, + name : 'Tessa Valdez', + emails : [ + { + email: 'tessavaldez@mail.info', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'dz', + number : '892 430 2631', + label : 'Mobile' + }, + { + country: 'dz', + number : '997 525 2354', + label : 'Work' + }, + { + country: 'dz', + number : '907 472 2857', + label : 'Home' + } + ], + title : 'Banker Mason', + company : 'Securia', + birthday : '1994-01-10T12:00:00.000Z', + address : '183 Crosby Avenue, Blanco, Mississippi, PO3463', + notes : '

Mollit qui amet in esse ipsum nostrud cupidatat occaecat proident aliquip non mollit commodo ex labore enim culpa dolor aute occaecat cillum sit excepteur tempor culpa nostrud nulla qui commodo.

Labore nulla id excepteur non velit adipisicing tempor reprehenderit cillum sint do consectetur laboris ut proident pariatur quis aute ad dolor quis labore labore nostrud sunt elit proident enim aliqua.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '6519600a-5eaa-45f8-8bed-c46fddb3b26a', + avatar : 'assets/images/avatars/male-08.jpg', + background : 'assets/images/cards/24-640x480.jpg', + name : 'Mcleod Wagner', + emails : [ + { + email: 'mcleodwagner@mail.biz', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'at', + number : '977 590 2773', + label : 'Mobile' + }, + { + country: 'at', + number : '828 496 3813', + label : 'Work' + }, + { + country: 'at', + number : '831 432 2512', + label : 'Home' + } + ], + company : 'Inrt', + birthday : '1980-12-03T12:00:00.000Z', + address : '736 Glen Street, Kaka, West Virginia, PO9350', + notes : '

Laboris consequat est anim quis quis eiusmod ipsum non quis fugiat anim culpa non elit mollit pariatur veniam nisi irure velit dolore dolor proident nisi deserunt culpa nisi et laborum.

Eiusmod eu esse ipsum voluptate excepteur ipsum et proident cupidatat sint sunt aliquip lorem culpa esse et dolor fugiat sit est id consectetur sint et ea pariatur occaecat nulla irure.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '6d80a6f6-2884-4ac4-9c73-06b82c220017', + avatar : 'assets/images/avatars/female-06.jpg', + background : 'assets/images/cards/25-640x480.jpg', + name : 'Kristie Hall', + emails : [ + { + email: 'kristiehall@mail.co.uk', + label: 'Personal' + }, + { + email: 'hall.kristie@austech.net', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'tn', + number : '841 530 3641', + label : 'Mobile' + }, + { + country: 'tn', + number : '941 410 3743', + label : 'Work' + }, + { + country: 'tn', + number : '938 599 3850', + label : 'Home' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Austech', + birthday : '1975-08-31T12:00:00.000Z', + address : '547 Revere Place, Hoehne, New Hampshire, PO2125', + notes : '

Duis incididunt minim nisi sit qui dolor aliquip quis ipsum id amet occaecat sit ullamco minim velit est eiusmod anim proident consectetur non reprehenderit ea reprehenderit dolore in nisi eiusmod.

Ut commodo aliqua non ut proident velit et commodo voluptate eu mollit dolor veniam ipsum velit aute esse est adipisicing id aliqua nostrud nostrud nisi enim officia eiusmod in enim.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '35190d23-036e-44ef-b545-cc744c626edd', + avatar : 'assets/images/avatars/female-07.jpg', + background : 'assets/images/cards/26-640x480.jpg', + name : 'Shannon Kennedy', + emails : [ + { + email: 'shannonkennedy@mail.ca', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'gb', + number : '899 508 2992', + label : 'Mobile' + }, + { + country: 'gb', + number : '834 499 3354', + label : 'Work' + }, + { + country: 'gb', + number : '834 526 3388', + label : 'Home' + } + ], + title : 'Gas Meter Mechanic', + company : 'Eventix', + birthday : '1994-09-07T12:00:00.000Z', + address : '480 Chase Court, Edinburg, Kansas, PO5357', + notes : '

Lorem ex amet anim anim qui consequat ullamco consectetur et voluptate in velit dolore culpa pariatur amet enim ut non magna duis qui excepteur esse ullamco velit fugiat aute dolor.

Reprehenderit ullamco veniam sit laborum nulla sunt excepteur eiusmod anim eu ullamco tempor est qui adipisicing sit fugiat voluptate minim non incididunt quis ipsum et exercitation officia laborum incididunt nostrud.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'b018c194-68ec-4915-ab56-e9f3bd2d98db', + avatar : 'assets/images/avatars/female-08.jpg', + background : 'assets/images/cards/27-640x480.jpg', + name : 'Martha Swanson', + emails : [ + { + email: 'marthaswanson@mail.org', + label: 'Personal' + }, + { + email: 'swanson.martha@sequitur.io', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'gb', + number : '844 480 3309', + label : 'Mobile' + }, + { + country: 'gb', + number : '981 591 3239', + label : 'Work' + }, + { + country: 'gb', + number : '923 484 3147', + label : 'Home' + } + ], + title : 'Short Story Writer', + company : 'Sequitur', + birthday : '1993-12-31T12:00:00.000Z', + address : '595 Howard Place, Convent, Rhode Island, PO6993', + notes : '

Lorem nostrud cillum non cillum nisi eu labore anim ipsum consequat consectetur sunt ipsum ipsum ad culpa laborum in ea exercitation quis voluptate velit id elit labore cillum cillum consectetur.

Ullamco ullamco nostrud aute pariatur nulla officia proident magna laborum dolor reprehenderit ullamco in reprehenderit veniam aliqua elit magna voluptate amet ut minim in labore irure culpa consequat sit pariatur.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'b7c355e9-e003-467e-82d2-4f6978c1a696', + avatar : 'assets/images/avatars/female-09.jpg', + background : 'assets/images/cards/28-640x480.jpg', + name : 'Jacklyn Morgan', + emails : [ + { + email: 'jacklynmorgan@mail.us', + label: 'Personal' + }, + { + email: 'morgan.jacklyn@shopabout.tv', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'so', + number : '974 542 2061', + label : 'Mobile' + } + ], + title : 'Animal Sitter', + company : 'Shopabout', + birthday : '1976-09-30T12:00:00.000Z', + address : '971 Conover Street, Statenville, Louisiana, PO6622', + notes : '

Pariatur fugiat labore aliquip aute in adipisicing veniam et consequat magna nulla laboris eiusmod eu esse cupidatat ipsum amet sint est anim lorem consequat eiusmod sit aliquip consequat nisi duis.

Est esse excepteur non amet reprehenderit cillum ullamco ex excepteur laboris excepteur dolor magna enim consequat lorem commodo ipsum elit ea veniam non quis id nisi esse tempor enim ut.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : 'cfa07b7c-93d1-42e7-9592-493d9efc78ae', + avatar : 'assets/images/avatars/female-10.jpg', + background : 'assets/images/cards/29-640x480.jpg', + name : 'Tonya Bowers', + emails : [ + { + email: 'tonyabowers@mail.com', + label: 'Personal' + }, + { + email: 'bowers.tonya@tourmania.name', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'tv', + number : '922 585 2914', + label : 'Mobile' + }, + { + country: 'tv', + number : '913 538 2961', + label : 'Work' + } + ], + title : 'Track Service Worker', + company : 'Tourmania', + birthday : '1976-06-14T12:00:00.000Z', + address : '197 Marconi Place, Welda, Delaware, PO6061', + notes : '

Aliqua ea dolor est enim ipsum esse pariatur tempor nulla excepteur aliquip irure fugiat reprehenderit adipisicing ex tempor proident voluptate dolore ea dolore nostrud id incididunt culpa in do occaecat.

Aute fugiat magna velit enim in duis duis elit ipsum excepteur reprehenderit do ipsum qui cillum aliquip ut occaecat do ea et adipisicing cupidatat voluptate non elit ad aliqua ad.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : '00feeb63-c83a-4655-a37e-a07da10cfa1c', + avatar : 'assets/images/avatars/female-11.jpg', + background : 'assets/images/cards/30-640x480.jpg', + name : 'Latonya Cruz', + emails : [ + { + email: 'latonyacruz@mail.me', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'tm', + number : '981 508 2080', + label : 'Mobile' + }, + { + country: 'tm', + number : '817 425 2052', + label : 'Work' + }, + { + country: 'tm', + number : '939 434 3805', + label : 'Home' + } + ], + title : 'Motor Winder', + company : 'Zilch', + birthday : '1967-11-28T12:00:00.000Z', + address : '775 Dahill Road, Iberia, California, PO2169', + notes : '

Ut occaecat tempor deserunt proident enim ex ullamco ex aliquip mollit aute reprehenderit in occaecat anim aliquip ea laboris anim laboris do non aute aute ea laboris magna sunt sit.

Ullamco in in minim culpa eiusmod amet consequat consequat magna nisi cillum occaecat irure officia voluptate et eu duis officia nostrud culpa non eiusmod anim sint et anim enim voluptate.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '142abf21-e635-4a7d-9330-e57f66adcdbe', + avatar : 'assets/images/avatars/female-12.jpg', + background : 'assets/images/cards/31-640x480.jpg', + name : 'Evangelina Mcclain', + emails : [ + { + email: 'evangelinamcclain@mail.info', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'ck', + number : '992 583 3187', + label : 'Mobile' + }, + { + country: 'ck', + number : '881 472 3297', + label : 'Work' + }, + { + country: 'ck', + number : '846 477 3596', + label : 'Home' + } + ], + title : 'Congressional Representative', + company : 'Straloy', + birthday : '1976-02-15T12:00:00.000Z', + address : '305 Columbia Street, Dupuyer, Puerto Rico, PO8744', + notes : '

Proident nulla culpa magna nostrud do aliqua ullamco sit culpa ullamco eu amet culpa laborum enim fugiat non ad quis esse pariatur exercitation lorem incididunt exercitation aliquip labore minim adipisicing.

Sint ea voluptate tempor irure consequat aute laboris exercitation id minim voluptate aliquip tempor occaecat elit incididunt laboris enim labore sit aute sunt cillum ipsum ad laboris nostrud dolor excepteur.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : 'e4f255a3-b5dd-45a7-975f-c399604a399a', + avatar : 'assets/images/avatars/male-09.jpg', + background : 'assets/images/cards/32-640x480.jpg', + name : 'Herring Gonzales', + emails : [ + { + email: 'herringgonzales@mail.biz', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'ai', + number : '995 411 2513', + label : 'Mobile' + }, + { + country: 'ai', + number : '839 492 2760', + label : 'Work' + } + ], + title : 'Gas Meter Mechanic', + company : 'Cubix', + birthday : '1995-02-16T12:00:00.000Z', + address : '195 Brooklyn Road, Jeff, Marshall Islands, PO2943', + notes : '

Ex nulla nisi do cillum consequat amet incididunt eu minim eu ut excepteur ad anim minim aliquip ullamco fugiat labore esse aliquip ea incididunt incididunt nisi officia consectetur dolore minim.

Et dolor consectetur anim deserunt laborum eu lorem et in nisi et officia nostrud fugiat deserunt aute irure ullamco officia fugiat voluptate exercitation ut deserunt officia nostrud tempor velit pariatur.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'ab4f712d-d712-41a8-b567-be4c66c349a3', + avatar : 'assets/images/avatars/female-13.jpg', + background : 'assets/images/cards/33-640x480.jpg', + name : 'Alyce Cash', + emails : [ + { + email: 'alycecash@mail.co.uk', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'ht', + number : '969 499 3077', + label : 'Mobile' + }, + { + country: 'ht', + number : '907 513 2784', + label : 'Work' + } + ], + title : 'Weather Analyst', + company : 'Qnekt', + birthday : '1973-12-19T12:00:00.000Z', + address : '964 Henry Street, Eureka, Indiana, PO1035', + notes : '

Non proident pariatur nostrud dolor incididunt occaecat amet officia sunt magna anim dolor labore culpa ut laborum id incididunt officia amet mollit anim ea proident laboris non incididunt incididunt sint.

Nulla minim consectetur nostrud magna anim irure consectetur labore cupidatat laborum reprehenderit et et adipisicing in qui elit ipsum reprehenderit esse nisi non ipsum exercitation sunt eu elit velit fugiat.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '5d067800-c301-46c6-a7f7-28dc89d9a554', + avatar : null, + background : null, + name : 'Kristine Pacheco', + emails : [ + { + email: 'kristinepacheco@mail.net', + label: 'Personal' + }, + { + email: 'pacheco.kristine@vurbo.ca', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'mm', + number : '977 516 2492', + label : 'Mobile' + } + ], + title : 'Short Story Writer', + company : 'Vurbo', + birthday : '1985-10-22T12:00:00.000Z', + address : '622 Dodworth Street, Rose, Arizona, PO9530', + notes : '

Lorem laboris excepteur magna pariatur occaecat voluptate pariatur cillum exercitation anim enim elit laborum reprehenderit laboris ad velit ut ipsum irure id ullamco minim sint ipsum occaecat esse tempor ea.

Pariatur non labore cillum consectetur aute voluptate sint adipisicing nisi laborum culpa nisi elit et amet dolor incididunt velit ex laboris ea reprehenderit eiusmod qui esse veniam labore ea sit.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : 'c500255a-1173-47d0-a0e4-4944d48fc12a', + avatar : 'assets/images/avatars/male-10.jpg', + background : 'assets/images/cards/34-640x480.jpg', + name : 'English Haney', + emails : [ + { + email: 'englishhaney@mail.org', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'lb', + number : '989 567 3834', + label : 'Mobile' + } + ], + title : 'Meteorologist', + company : 'Photobin', + birthday : '1969-09-05T12:00:00.000Z', + address : '579 Pooles Lane, Belleview, Montana, PO4106', + notes : '

Incididunt labore sunt ullamco in deserunt dolore labore voluptate adipisicing eu id duis eiusmod elit ea ad cillum culpa excepteur labore fugiat excepteur ea culpa labore sit id dolor ullamco.

Eu eu ex dolore proident nostrud et minim lorem nulla lorem nulla duis velit voluptate nisi cillum anim minim amet dolore officia id cillum in cupidatat ipsum veniam velit dolor.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'b62359fd-f2a8-46e6-904e-31052d1cd675', + avatar : 'assets/images/avatars/male-11.jpg', + background : 'assets/images/cards/35-640x480.jpg', + name : 'Joseph Strickland', + emails : [ + { + email: 'josephstrickland@mail.io', + label: 'Personal' + }, + { + email: 'strickland.joseph@bytrex.us', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'jo', + number : '990 450 2729', + label : 'Mobile' + } + ], + title : 'Hotel Manager', + company : 'Bytrex', + birthday : '1991-09-08T12:00:00.000Z', + address : '844 Ellery Street, Hondah, Texas, PO1272', + notes : '

Excepteur consequat magna laborum dolore ut laborum ea excepteur ad officia mollit exercitation sunt tempor amet ex ipsum aliquip cillum mollit amet laborum voluptate ipsum sit esse duis eiusmod adipisicing.

Non tempor ad pariatur adipisicing excepteur est pariatur aute et velit lorem ut est eu voluptate pariatur ea consectetur excepteur sunt reprehenderit id irure aliqua tempor anim id voluptate culpa.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '16b9e696-ea95-4dd8-86c4-3caf705a1dc6', + avatar : 'assets/images/avatars/male-12.jpg', + background : 'assets/images/cards/36-640x480.jpg', + name : 'Nunez Faulkner', + emails : [ + { + email: 'nunezfaulkner@mail.tv', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'xk', + number : '909 552 3327', + label : 'Mobile' + } + ], + title : 'Hotel Manager', + company : 'Buzzopia', + birthday : '1982-01-23T12:00:00.000Z', + address : '614 Herkimer Court, Darrtown, Nebraska, PO9308', + notes : '

Culpa labore ullamco veniam est ullamco ipsum culpa excepteur esse esse aliqua nulla ullamco nulla amet consequat tempor aute exercitation do eu do ullamco elit excepteur est anim nisi excepteur.

Cillum eiusmod cupidatat officia ipsum ullamco adipisicing cillum adipisicing sint exercitation non enim consectetur est esse tempor fugiat sit eiusmod in exercitation enim quis duis dolor amet consequat pariatur dolor.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '19662ecf-0686-4aad-a46c-24b552eb2ff5', + avatar : 'assets/images/avatars/female-15.jpg', + background : 'assets/images/cards/14-640x480.jpg', + name : 'Juana Morrow', + emails : [ + { + email: 'juanamorrow@mail.com', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'ee', + number : '868 438 3943', + label : 'Mobile' + } + ], + title : 'Meteorologist', + company : 'Lyria', + birthday : '1992-03-29T12:00:00.000Z', + address : '663 Drew Street, Juntura, Georgia, PO9857', + notes : '

Mollit et amet qui incididunt officia anim est in consectetur qui anim qui labore ea mollit veniam adipisicing ex magna commodo mollit adipisicing sunt commodo laboris labore aliquip deserunt est.

Cupidatat ut cillum anim reprehenderit ea magna enim fugiat proident anim esse lorem lorem commodo cupidatat pariatur qui commodo nulla aliqua nisi labore in adipisicing minim excepteur do eu amet.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '26dfe954-8bf3-45ee-b285-1d0a88c8d3ea', + avatar : 'assets/images/avatars/male-13.jpg', + background : 'assets/images/cards/15-640x480.jpg', + name : 'Lara Gaines', + emails : [ + { + email: 'laragaines@mail.name', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'mr', + number : '891 498 2043', + label : 'Mobile' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Acruex', + birthday : '1961-06-07T12:00:00.000Z', + address : '762 Troutman Street, Drummond, Oregon, PO6973', + notes : '

Laboris dolor incididunt eiusmod deserunt officia labore eu est nulla velit id ex veniam qui fugiat velit irure reprehenderit dolor proident aliquip culpa nisi magna occaecat do nostrud cillum lorem.

Sit consequat laboris culpa quis laborum lorem ullamco occaecat labore duis ea et consequat pariatur reprehenderit excepteur excepteur exercitation sunt enim amet adipisicing laborum incididunt dolor aliquip culpa ea laboris.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : 'd6462af2-c488-4de7-9b26-3845bd2983f9', + avatar : 'assets/images/avatars/male-14.jpg', + background : 'assets/images/cards/16-640x480.jpg', + name : 'Johnston Riddle', + emails : [ + { + email: 'johnstonriddle@mail.me', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bt', + number : '979 541 2691', + label : 'Mobile' + }, + { + country: 'bt', + number : '909 407 3887', + label : 'Work' + }, + { + country: 'bt', + number : '864 557 3128', + label : 'Home' + } + ], + title : 'Hotel Manager', + company : 'Xleen', + birthday : '1972-09-13T12:00:00.000Z', + address : '674 Bryant Street, Grahamtown, Federated States Of Micronesia, PO2757', + notes : '

Velit consequat elit anim qui eu elit aliquip consectetur aliqua cupidatat lorem laboris dolor qui ad laborum adipisicing adipisicing consequat et nostrud ullamco consequat dolore deserunt irure do aliquip non.

Ipsum commodo voluptate qui ex ullamco amet do ex dolore quis cupidatat ut anim sunt dolore excepteur anim do dolor aliqua ex aute esse eiusmod sint laborum consequat laboris cillum.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'a1723c04-69fe-4573-a135-6645658afe76', + avatar : null, + background : null, + name : 'Vargas Gardner', + emails : [ + { + email: 'vargasgardner@mail.info', + label: 'Personal' + }, + { + email: 'gardner.vargas@cosmosis.biz', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'bi', + number : '855 456 2754', + label : 'Mobile' + } + ], + title : 'Bindery Machine Operator', + company : 'Cosmosis', + birthday : '1979-10-21T12:00:00.000Z', + address : '869 Seton Place, Chemung, Maine, PO8109', + notes : '

Amet non anim ex ullamco pariatur ullamco laboris eiusmod ut magna nisi amet incididunt sunt anim nisi qui ut ex sunt adipisicing consequat deserunt qui mollit duis anim quis veniam.

Magna ut id duis qui ea proident quis officia lorem commodo et et proident dolore qui quis incididunt nulla incididunt ut aliqua veniam est adipisicing adipisicing reprehenderit ad velit incididunt.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '823e6166-c0c8-4373-9270-8a0d17489a08', + avatar : 'assets/images/avatars/male-16.jpg', + background : 'assets/images/cards/17-640x480.jpg', + name : 'Mccall Day', + emails : [ + { + email: 'mccallday@mail.co.uk', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'se', + number : '993 504 3286', + label : 'Mobile' + }, + { + country: 'se', + number : '924 434 2238', + label : 'Work' + }, + { + country: 'se', + number : '816 466 2634', + label : 'Home' + } + ], + title : 'Historiographer', + company : 'Nipaz', + birthday : '1964-03-05T12:00:00.000Z', + address : '854 Hanover Place, Harleigh, New Jersey, PO9459', + notes : '

Ea occaecat nisi cillum officia in velit ipsum reprehenderit ex fugiat fugiat ad velit pariatur ullamco sint in elit quis aute id cupidatat nostrud quis culpa aliquip id officia excepteur.

Ea ut consequat sit ullamco do pariatur quis officia ad ipsum quis nisi in nulla incididunt esse pariatur amet qui ullamco consectetur dolor voluptate sit qui mollit reprehenderit reprehenderit amet.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '2c37ed00-427a-46d7-8f8f-d711c768d1ee', + avatar : 'assets/images/avatars/male-17.jpg', + background : 'assets/images/cards/18-640x480.jpg', + name : 'Silva Foster', + emails : [ + { + email: 'silvafoster@mail.net', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bn', + number : '916 511 3837', + label : 'Mobile' + }, + { + country: 'bn', + number : '949 564 3247', + label : 'Work' + } + ], + title : 'Insurance Analyst', + company : 'Extrawear', + birthday : '1980-04-29T12:00:00.000Z', + address : '137 Bridge Street, Sisquoc, District Of Columbia, PO4105', + notes : '

Ipsum velit est do velit do deserunt cupidatat officia duis laborum veniam sunt in ex reprehenderit esse ex ad aute anim duis ut sunt reprehenderit occaecat ut nostrud eu minim.

Aliqua consequat adipisicing adipisicing aliquip voluptate fugiat eu amet nostrud id proident non nisi fugiat velit nostrud ea officia non laboris magna cillum exercitation culpa eiusmod mollit fugiat et lorem.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '944764c0-b261-4428-9188-bbd3022d66a8', + avatar : 'assets/images/avatars/female-16.jpg', + background : 'assets/images/cards/19-640x480.jpg', + name : 'Cathryn Snider', + emails : [ + { + email: 'cathrynsnider@mail.ca', + label: 'Personal' + }, + { + email: 'snider.cathryn@phormula.org', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'na', + number : '896 471 3036', + label : 'Mobile' + }, + { + country: 'na', + number : '851 491 3567', + label : 'Work' + }, + { + country: 'na', + number : '805 487 2016', + label : 'Home' + } + ], + title : 'Short Story Writer', + company : 'Phormula', + birthday : '1981-06-09T12:00:00.000Z', + address : '528 Glenmore Avenue, Elrama, Illinois, PO2952', + notes : '

Ea enim exercitation lorem excepteur officia nulla culpa culpa nisi veniam quis non duis exercitation labore commodo et occaecat reprehenderit ex velit exercitation commodo cupidatat amet veniam mollit magna consectetur.

Voluptate consectetur eu id eiusmod anim reprehenderit incididunt duis veniam tempor cillum ea esse tempor do laborum dolore sint ea duis incididunt in do aliqua voluptate incididunt officia excepteur do.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'f2b3c756-5ad2-4d4b-aee5-b32c91457128', + avatar : null, + background : null, + name : 'Mooney Cantrell', + emails : [ + { + email: 'mooneycantrell@mail.io', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bh', + number : '915 577 3020', + label : 'Mobile' + }, + { + country: 'bh', + number : '923 431 3594', + label : 'Work' + } + ], + title : 'Fundraising Director', + company : 'Crustatia', + birthday : '1968-12-07T12:00:00.000Z', + address : '277 Coventry Road, Fairforest, Nevada, PO6031', + notes : '

Lorem mollit dolore nostrud sunt id anim veniam labore duis eiusmod duis fugiat aliqua occaecat do labore culpa consectetur consectetur sunt amet tempor incididunt tempor esse sunt id elit non.

Laborum mollit ullamco quis ad culpa nisi sit nisi veniam minim adipisicing sint eiusmod velit amet minim aliquip nulla eiusmod nulla laboris quis proident in adipisicing aute et ea anim.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : '54b1c201-4b2b-4be0-ad70-a6413e9628cd', + avatar : 'assets/images/avatars/female-17.jpg', + background : 'assets/images/cards/20-640x480.jpg', + name : 'Saundra Murphy', + emails : [ + { + email: 'saundramurphy@mail.us', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'mt', + number : '902 529 2999', + label : 'Mobile' + } + ], + title : 'Dental Laboratory Worker', + company : 'Zilencio', + birthday : '1983-11-07T12:00:00.000Z', + address : '557 Monroe Street, Mayfair, Maryland, PO7200', + notes : '

Fugiat mollit sunt aliquip consectetur ipsum ut aliqua id ex laboris labore id elit nulla irure id aute pariatur do officia proident eiusmod proident reprehenderit dolor non dolor laborum nulla.

Pariatur reprehenderit incididunt voluptate enim aliqua laborum anim veniam pariatur irure exercitation non dolore velit et ex culpa lorem ipsum mollit eu sint duis aliquip elit amet consectetur velit minim.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'faf979c7-a13b-445a-b30a-08845f5fa90e', + avatar : 'assets/images/avatars/female-18.jpg', + background : 'assets/images/cards/21-640x480.jpg', + name : 'Enid Sparks', + emails : [ + { + email: 'enidsparks@mail.tv', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bh', + number : '813 410 3258', + label : 'Mobile' + }, + { + country: 'bh', + number : '877 501 2767', + label : 'Work' + } + ], + title : 'Historiographer', + company : 'Skybold', + birthday : '1984-05-04T12:00:00.000Z', + address : '219 Village Court, Keyport, Alabama, PO7776', + notes : '

Velit enim anim est aliqua consequat exercitation velit quis magna est incididunt ipsum minim minim nulla adipisicing ad eiusmod id veniam eiusmod sit elit est pariatur velit ea laborum anim.

Ad lorem ea nisi irure id consequat ullamco nisi nostrud dolore officia ipsum veniam velit minim pariatur culpa culpa esse minim adipisicing sit labore commodo aute excepteur non do in.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '2bfa2be5-7688-48d5-b5ac-dc0d9ac97f14', + avatar : null, + background : null, + name : 'Nadia Mcknight', + emails : [ + { + email: 'nadiamcknight@mail.com', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'tk', + number : '943 511 2203', + label : 'Mobile' + }, + { + country: 'tk', + number : '817 578 2993', + label : 'Work' + } + ], + title : 'Legal Assistant', + company : 'Pearlesex', + birthday : '1973-10-06T12:00:00.000Z', + address : '448 Berriman Street, Reinerton, Washington, PO6704', + notes : '

Esse sint lorem exercitation velit tempor tempor voluptate nulla proident excepteur magna tempor consectetur aliquip qui nisi mollit cupidatat est adipisicing ipsum sint et excepteur sit labore velit dolore labore.

Duis nisi adipisicing lorem do excepteur magna consequat labore magna ut consectetur eu enim occaecat id nulla laboris minim officia est id nisi mollit ullamco irure ut dolore esse aliqua.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '77a4383b-b5a5-4943-bc46-04c3431d1566', + avatar : 'assets/images/avatars/male-19.jpg', + background : 'assets/images/cards/22-640x480.jpg', + name : 'Best Blackburn', + emails : [ + { + email: 'bestblackburn@mail.name', + label: 'Personal' + }, + { + email: 'blackburn.best@beadzza.me', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'gl', + number : '814 498 3701', + label : 'Mobile' + } + ], + title : 'Hotel Manager', + company : 'Beadzza', + birthday : '1987-06-07T12:00:00.000Z', + address : '578 Tampa Court, Wescosville, Ohio, PO4108', + notes : '

Lorem do deserunt nulla nostrud incididunt et laboris labore eu nisi ut ullamco veniam deserunt do non labore commodo amet aliquip exercitation ea occaecat amet non eiusmod ut minim fugiat.

Esse eu ex irure pariatur qui cillum labore nulla quis officia consequat commodo consequat fugiat culpa nostrud labore eu adipisicing magna irure aliquip est amet irure eiusmod esse reprehenderit mollit.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '8bb0f597-673a-47ca-8c77-2f83219cb9af', + avatar : null, + background : null, + name : 'Duncan Carver', + emails : [ + { + email: 'duncancarver@mail.info', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'jm', + number : '968 547 2111', + label : 'Mobile' + }, + { + country: 'jm', + number : '968 433 3120', + label : 'Work' + }, + { + country: 'jm', + number : '905 425 2777', + label : 'Home' + } + ], + title : 'Historiographer', + company : 'Hotcakes', + birthday : '1980-09-15T12:00:00.000Z', + address : '931 Bristol Street, Why, South Carolina, PO9700', + notes : '

Dolore laboris aute officia reprehenderit cupidatat aliquip duis labore aliquip officia est nostrud nisi voluptate eiusmod ad aute et ea cillum aliqua elit ipsum officia cillum laborum minim labore sit.

Exercitation labore ut pariatur occaecat ullamco non occaecat aliqua amet nostrud aliquip ipsum ad do ullamco enim laborum commodo minim elit ut quis laboris elit laborum proident sunt ullamco sit.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'c318e31f-1d74-49c5-8dae-2bc5805e2fdb', + avatar : 'assets/images/avatars/male-01.jpg', + background : 'assets/images/cards/23-640x480.jpg', + name : 'Martin Richards', + emails : [ + { + email: 'martinrichards@mail.biz', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'mg', + number : '902 500 2668', + label : 'Mobile' + }, + { + country: 'mg', + number : '947 559 2919', + label : 'Work' + }, + { + country: 'mg', + number : '934 434 3768', + label : 'Home' + } + ], + title : 'Dental Laboratory Worker', + company : 'Overfork', + birthday : '1977-04-12T12:00:00.000Z', + address : '268 Hutchinson Court, Drytown, Florida, PO3041', + notes : '

Eu ipsum nisi eu lorem cupidatat mollit exercitation elit ea culpa enim qui culpa ad aliqua exercitation tempor nulla excepteur fugiat ipsum quis amet occaecat adipisicing ullamco duis dolore occaecat.

Non eu et elit ea labore lorem adipisicing voluptate incididunt ut officia aute minim incididunt lorem qui adipisicing mollit magna nisi consectetur cillum sit exercitation eiusmod qui eu nisi sunt.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '0a8bc517-631a-4a93-aacc-000fa2e8294c', + avatar : 'assets/images/avatars/female-20.jpg', + background : 'assets/images/cards/24-640x480.jpg', + name : 'Candice Munoz', + emails : [ + { + email: 'candicemunoz@mail.co.uk', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'fm', + number : '838 562 2769', + label : 'Mobile' + } + ], + title : 'Legal Assistant', + company : 'Eclipto', + birthday : '1976-09-09T12:00:00.000Z', + address : '946 Remsen Street, Caroline, New Mexico, PO3247', + notes : '

Amet dolore elit irure in commodo in et eu eu nulla labore elit sunt et nisi quis officia nostrud et mollit dolor aute fugiat sunt reprehenderit quis sint minim ipsum.

Laboris ut sunt nisi aute incididunt reprehenderit mollit culpa velit exercitation reprehenderit irure id sunt officia magna est ea labore consectetur incididunt cillum qui tempor ea ullamco quis pariatur aliquip.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'a4c9945a-757b-40b0-8942-d20e0543cabd', + avatar : 'assets/images/avatars/female-01.jpg', + background : 'assets/images/cards/25-640x480.jpg', + name : 'Vickie Mosley', + emails : [ + { + email: 'vickiemosley@mail.net', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'tr', + number : '939 555 3054', + label : 'Mobile' + }, + { + country: 'tr', + number : '852 486 2053', + label : 'Work' + } + ], + title : 'Bindery Machine Operator', + company : 'Strozen', + birthday : '1989-06-21T12:00:00.000Z', + address : '397 Vandalia Avenue, Rockingham, Michigan, PO8089', + notes : '

Velit sunt sunt commodo ex amet laboris voluptate eu lorem aliqua minim occaecat cupidatat aliqua ipsum nisi velit id reprehenderit exercitation velit fugiat minim nisi deserunt voluptate anim cillum commodo.

Cillum velit nostrud cupidatat ex sit culpa deserunt cillum cupidatat cillum aute cupidatat exercitation ullamco sunt incididunt non magna sint lorem et incididunt laborum culpa qui sint sunt duis fugiat.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : 'b8258ccf-48b5-46a2-9c95-e0bd7580c645', + avatar : 'assets/images/avatars/female-02.jpg', + background : 'assets/images/cards/26-640x480.jpg', + name : 'Tina Harris', + emails : [ + { + email: 'tinaharris@mail.ca', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'gp', + number : '933 464 2431', + label : 'Mobile' + }, + { + country: 'gp', + number : '894 535 3609', + label : 'Work' + } + ], + title : 'Short Story Writer', + company : 'Gallaxia', + birthday : '1976-09-10T12:00:00.000Z', + address : '821 Beverly Road, Tyro, Colorado, PO4248', + notes : '

Incididunt non est consequat qui sit sunt aliquip sit quis minim laboris ullamco est culpa velit culpa cupidatat veniam incididunt non quis elit reprehenderit et officia cillum magna aliqua occaecat.

Cupidatat amet incididunt id pariatur minim veniam id dolor nisi labore cillum ea officia cupidatat do culpa aliqua consequat deserunt aliquip sit ea excepteur eiusmod labore tempor reprehenderit commodo exercitation.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'f004ea79-98fc-436c-9ba5-6cfe32fe583d', + avatar : 'assets/images/avatars/male-02.jpg', + background : 'assets/images/cards/27-640x480.jpg', + name : 'Holt Manning', + emails : [ + { + email: 'holtmanning@mail.org', + label: 'Personal' + }, + { + email: 'manning.holt@idetica.io', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'nz', + number : '822 531 2600', + label : 'Mobile' + }, + { + country: 'nz', + number : '922 549 2094', + label : 'Work' + } + ], + title : 'Fundraising Director', + company : 'Idetica', + birthday : '1973-11-08T12:00:00.000Z', + address : '364 Porter Avenue, Delshire, Missouri, PO8911', + notes : '

Velit fugiat minim sit nisi esse laboris ad velit proident non et cillum labore sint excepteur nisi eu amet voluptate duis duis id enim ea anim adipisicing consectetur id consectetur.

Ex eiusmod id magna in non lorem sunt sunt officia do adipisicing officia mollit occaecat sunt laborum aliquip adipisicing ullamco in sit proident et quis incididunt pariatur fugiat mollit anim.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '8b69fe2d-d7cc-4a3d-983d-559173e37d37', + avatar : 'assets/images/avatars/female-03.jpg', + background : 'assets/images/cards/28-640x480.jpg', + name : 'Misty Ramsey', + emails : [ + { + email: 'mistyramsey@mail.us', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'kp', + number : '990 457 2106', + label : 'Mobile' + }, + { + country: 'kp', + number : '918 550 2946', + label : 'Work' + } + ], + company : 'Grupoli', + birthday : '1969-08-10T12:00:00.000Z', + address : '101 Sackett Street, Naomi, Tennessee, PO6335', + notes : '

Ut cupidatat sint minim consectetur cupidatat aute ut anim consequat fugiat laboris quis sint sit nulla irure nulla officia eiusmod consequat ex quis ad ex ullamco et ut labore tempor.

Deserunt minim dolore voluptate aute aliqua est elit mollit ut ut consequat in esse est do ex officia nostrud aute id fugiat reprehenderit quis cillum fugiat id fugiat minim tempor.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : 'cdcc62e4-1520-4ccc-803d-52868c7e01ba', + avatar : 'assets/images/avatars/female-04.jpg', + background : 'assets/images/cards/29-640x480.jpg', + name : 'Dee Alvarado', + emails : [ + { + email: 'deealvarado@mail.tv', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'nu', + number : '855 445 2483', + label : 'Mobile' + }, + { + country: 'nu', + number : '858 415 2860', + label : 'Work' + }, + { + country: 'nu', + number : '968 587 2752', + label : 'Home' + } + ], + title : 'Dental Laboratory Worker', + company : 'Tsunamia', + birthday : '1996-06-17T12:00:00.000Z', + address : '956 Pierrepont Street, Crumpler, Hawaii, PO3299', + notes : '

Esse excepteur ad aliquip amet elit reprehenderit ut nostrud magna ex esse dolore magna excepteur irure esse incididunt sunt enim laborum ex mollit magna elit quis ullamco aute minim veniam.

Duis id ullamco laboris elit ea ea dolore tempor est eu esse aliqua quis quis ut laborum mollit cillum proident deserunt fugiat ipsum elit exercitation quis mollit eiusmod officia non.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'e2946946-b4b5-4fd7-bab4-62c38cdff2f1', + avatar : 'assets/images/avatars/female-05.jpg', + background : 'assets/images/cards/30-640x480.jpg', + name : 'Samantha Jacobson', + emails : [ + { + email: 'samanthajacobson@mail.com', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'es', + number : '879 591 3327', + label : 'Mobile' + } + ], + title : 'Dental Laboratory Worker', + company : 'Emoltra', + birthday : '1972-02-04T12:00:00.000Z', + address : '384 Love Lane, Dyckesville, New York, PO4115', + notes : '

Consectetur eu et ea anim magna occaecat anim labore velit nulla non magna laboris duis sit adipisicing commodo laboris consequat id quis aliqua est culpa quis in ex est culpa.

Sunt qui excepteur reprehenderit nostrud voluptate eu laborum laborum id esse occaecat irure esse elit magna tempor ad est elit non labore tempor laborum deserunt voluptate cupidatat excepteur sunt sint.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'fdc77706-6ba2-4397-b2f8-a9a0b6495153', + avatar : 'assets/images/avatars/female-06.jpg', + background : 'assets/images/cards/31-640x480.jpg', + name : 'Rhea Landry', + emails : [ + { + email: 'rhealandry@mail.name', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'jp', + number : '906 579 3698', + label : 'Mobile' + }, + { + country: 'jp', + number : '841 475 2681', + label : 'Work' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Comtent', + birthday : '1988-05-22T12:00:00.000Z', + address : '725 Arlington Avenue, Mathews, Wyoming, PO4562', + notes : '

Eiusmod ullamco laboris tempor reprehenderit culpa non sunt ea consequat velit id ipsum commodo eiusmod exercitation laboris aliqua magna reprehenderit culpa tempor mollit pariatur consectetur amet aliqua cillum voluptate exercitation.

Qui cillum consectetur qui proident adipisicing id qui esse aute velit excepteur pariatur ea excepteur sunt velit nostrud esse mollit sint ex irure sunt aliquip velit consequat minim do officia.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '12148fa2-e0a4-49fb-b3c5-daeecdb5180a', + avatar : 'assets/images/avatars/female-07.jpg', + background : 'assets/images/cards/32-640x480.jpg', + name : 'Olga Rhodes', + emails : [ + { + email: 'olgarhodes@mail.me', + label: 'Personal' + }, + { + email: 'rhodes.olga@moreganic.info', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'tl', + number : '971 514 3366', + label : 'Mobile' + }, + { + country: 'tl', + number : '807 480 2033', + label : 'Work' + }, + { + country: 'tl', + number : '810 528 3783', + label : 'Home' + } + ], + title : 'Pastry Baker', + company : 'Moreganic', + birthday : '1971-08-13T12:00:00.000Z', + address : '253 Beard Street, Staples, Massachusetts, PO8089', + notes : '

Proident est est et in commodo incididunt anim fugiat laboris pariatur eu enim dolor eiusmod dolor voluptate officia eiusmod excepteur culpa aute do do anim pariatur irure incididunt incididunt est.

Sint duis mollit dolor laborum ex non esse consequat anim et qui est nostrud incididunt fugiat anim veniam sunt cupidatat ut voluptate commodo non ex tempor ullamco magna culpa culpa.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '07dd64eb-8b8f-4765-a16c-8db083c45096', + avatar : 'assets/images/avatars/female-08.jpg', + background : 'assets/images/cards/33-640x480.jpg', + name : 'Lorraine Pennington', + emails : [ + { + email: 'lorrainepennington@mail.biz', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'fm', + number : '932 404 3308', + label : 'Mobile' + }, + { + country: 'fm', + number : '979 550 3200', + label : 'Work' + }, + { + country: 'fm', + number : '868 557 3568', + label : 'Home' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Marvane', + birthday : '1967-06-10T12:00:00.000Z', + address : '962 Whitney Avenue, Sussex, North Dakota, PO5796', + notes : '

Nulla nisi officia quis aliquip voluptate mollit ut anim eu et quis tempor incididunt consectetur exercitation cupidatat in nisi exercitation est culpa nostrud sit elit sit sunt do ipsum eu.

Enim voluptate ad ullamco tempor voluptate culpa et ut ullamco eu consequat est esse excepteur est nostrud velit enim culpa dolore non quis occaecat eiusmod velit ex mollit tempor labore.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '81fdc48c-5572-4123-8a73-71b7892120de', + avatar : 'assets/images/avatars/female-09.jpg', + background : 'assets/images/cards/34-640x480.jpg', + name : 'Earlene Rosales', + emails : [ + { + email: 'earlenerosales@mail.co.uk', + label: 'Personal' + }, + { + email: 'rosales.earlene@softmicro.net', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'ki', + number : '927 589 3619', + label : 'Mobile' + } + ], + title : 'Historiographer', + company : 'Softmicro', + birthday : '1960-11-13T12:00:00.000Z', + address : '981 Kingston Avenue, Topaz, Connecticut, PO6866', + notes : '

Adipisicing fugiat magna eiusmod consectetur id commodo incididunt ullamco ut sint minim nulla in do aute in sit pariatur irure dolor magna pariatur ad officia excepteur duis ullamco dolor sunt.

Dolor laborum proident voluptate eu esse lorem adipisicing enim consectetur veniam nisi pariatur aliquip sit laborum sunt adipisicing anim labore eiusmod nostrud irure irure nisi ipsum dolor aliquip ex exercitation.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : 'f8bbf6be-d49a-41a3-bb80-3d51df84c12b', + avatar : 'assets/images/avatars/female-10.jpg', + background : 'assets/images/cards/35-640x480.jpg', + name : 'Marcia Hatfield', + emails : [ + { + email: 'marciahatfield@mail.ca', + label: 'Personal' + }, + { + email: 'hatfield.marcia@datagen.org', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'no', + number : '883 432 3718', + label : 'Mobile' + }, + { + country: 'no', + number : '934 516 2135', + label : 'Work' + }, + { + country: 'no', + number : '923 596 3843', + label : 'Home' + } + ], + title : 'Track Service Worker', + company : 'Datagen', + birthday : '1980-02-26T12:00:00.000Z', + address : '802 Preston Court, Waikele, Pennsylvania, PO7421', + notes : '

Aliqua sint aute in cillum deserunt enim fugiat tempor est pariatur irure commodo commodo deserunt eu nulla laboris enim occaecat incididunt voluptate enim est reprehenderit qui anim veniam sint adipisicing.

Commodo veniam occaecat ex et laborum minim fugiat sunt commodo velit dolor labore excepteur fugiat ipsum eiusmod in esse ex nulla deserunt minim consectetur in est sunt eu commodo fugiat.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : 'cd482941-3eaf-4560-ac37-56a9296025df', + avatar : 'assets/images/avatars/female-11.jpg', + background : 'assets/images/cards/36-640x480.jpg', + name : 'Liliana Ayala', + emails : [ + { + email: 'lilianaayala@mail.io', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bd', + number : '936 590 2412', + label : 'Mobile' + } + ], + title : 'Insurance Analyst', + company : 'Pharmex', + birthday : '1988-04-27T12:00:00.000Z', + address : '935 Guider Avenue, Kipp, Wisconsin, PO5282', + notes : '

Magna et culpa cillum sint labore consequat aute aliqua amet ea consequat ut ullamco nisi commodo lorem enim amet dolor sit nisi dolor do sit lorem cillum esse reprehenderit ut.

Quis veniam anim nulla adipisicing veniam fugiat elit duis pariatur anim irure adipisicing elit labore eu aute exercitation qui exercitation commodo exercitation ipsum tempor non et ex eu aute proident.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '22f18d47-ff8d-440e-888d-a1747c093052', + avatar : 'assets/images/avatars/female-12.jpg', + background : 'assets/images/cards/14-640x480.jpg', + name : 'Alice Harding', + emails : [ + { + email: 'aliceharding@mail.us', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'sx', + number : '881 472 3113', + label : 'Mobile' + }, + { + country: 'sx', + number : '974 548 3124', + label : 'Work' + }, + { + country: 'sx', + number : '800 518 3615', + label : 'Home' + } + ], + title : 'Track Service Worker', + company : 'Futurity', + birthday : '1985-09-17T12:00:00.000Z', + address : '387 Holt Court, Thomasville, Alaska, PO2867', + notes : '

Adipisicing exercitation dolor nisi ipsum nostrud anim dolore sint veniam consequat lorem sit ex commodo nostrud occaecat elit magna magna commodo incididunt laborum ad irure pariatur et sit ullamco adipisicing.

Ullamco in dolore amet est quis consectetur fugiat non nisi incididunt id laborum adipisicing dolor proident velit ut quis aliquip dolore id anim sit adipisicing nisi incididunt enim amet pariatur.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : 'a9a9f382-e4c3-42fb-9fe9-65aa534732b5', + avatar : 'assets/images/avatars/female-13.jpg', + background : 'assets/images/cards/15-640x480.jpg', + name : 'Francisca Perkins', + emails : [ + { + email: 'franciscaperkins@mail.tv', + label: 'Personal' + }, + { + email: 'perkins.francisca@overplex.com', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'au', + number : '830 430 3437', + label : 'Mobile' + }, + { + country: 'au', + number : '868 538 2886', + label : 'Work' + } + ], + title : 'Dental Laboratory Worker', + company : 'Overplex', + birthday : '1966-08-14T12:00:00.000Z', + address : '733 Delmonico Place, Belvoir, Virginia, PO7102', + notes : '

Voluptate nisi adipisicing ex magna mollit non cillum dolor in magna duis exercitation irure elit duis eiusmod deserunt lorem nulla sunt laboris quis voluptate ullamco labore adipisicing quis minim ipsum.

Id ut esse elit proident mollit nulla exercitation magna voluptate sit eiusmod labore velit commodo exercitation dolore anim est eiusmod occaecat et consequat eiusmod culpa ipsum deserunt lorem non incididunt.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : '0222b24b-c288-48d1-b356-0f087fa172f8', + avatar : null, + background : null, + name : 'Warren Gates', + emails : [ + { + email: 'warrengates@mail.name', + label: 'Personal' + }, + { + email: 'gates.warren@qualitex.me', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'gt', + number : '847 513 2248', + label : 'Mobile' + }, + { + country: 'gt', + number : '866 591 3665', + label : 'Work' + }, + { + country: 'gt', + number : '877 539 3840', + label : 'Home' + } + ], + title : 'Banker Mason', + company : 'Qualitex', + birthday : '1977-02-23T12:00:00.000Z', + address : '713 Fane Court, Lemoyne, Kentucky, PO3601', + notes : '

Sint tempor consectetur ullamco ullamco consequat exercitation ea occaecat eiusmod cupidatat anim pariatur nisi pariatur excepteur ut labore anim excepteur sit eu consequat do enim pariatur et dolore in irure.

Commodo ut non minim sunt nisi tempor culpa duis anim ipsum qui irure lorem est voluptate voluptate officia occaecat lorem labore elit officia laboris mollit et eiusmod esse laborum nisi.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '0630f1ca-cdb9-405d-b134-68f733334089', + avatar : 'assets/images/avatars/female-14.jpg', + background : 'assets/images/cards/16-640x480.jpg', + name : 'Maryann Mcintyre', + emails : [ + { + email: 'maryannmcintyre@mail.info', + label: 'Personal' + }, + { + email: 'mcintyre.maryann@aquafire.biz', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'bf', + number : '861 419 2752', + label : 'Mobile' + }, + { + country: 'bf', + number : '935 553 3031', + label : 'Work' + } + ], + title : 'Fundraising Director', + company : 'Aquafire', + birthday : '1963-04-07T12:00:00.000Z', + address : '698 Brooklyn Avenue, Dixonville, Utah, PO2712', + notes : '

Pariatur velit ea ad quis elit pariatur consectetur eiusmod veniam non incididunt ex ex et nulla voluptate fugiat esse sit dolore voluptate in dolor nulla laborum irure consequat sit pariatur.

Dolore ex officia incididunt pariatur ea amet sunt enim aute labore cupidatat laboris eiusmod enim lorem labore nostrud ea consectetur et eu sunt exercitation dolore consequat fugiat anim in exercitation.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '999c24f3-7bb8-4a01-85ca-2fca7863c57e', + avatar : 'assets/images/avatars/female-15.jpg', + background : 'assets/images/cards/17-640x480.jpg', + name : 'Sharon Marshall', + emails : [ + { + email: 'sharonmarshall@mail.co.uk', + label: 'Personal' + }, + { + email: 'marshall.sharon@utara.net', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'fo', + number : '947 441 2999', + label : 'Mobile' + }, + { + country: 'fo', + number : '984 441 2615', + label : 'Work' + }, + { + country: 'fo', + number : '824 541 2714', + label : 'Home' + } + ], + title : 'Legal Assistant', + company : 'Utara', + birthday : '1960-01-26T12:00:00.000Z', + address : '923 Ivan Court, Hatteras, Idaho, PO7573', + notes : '

Est duis sint ullamco nulla do tempor do dolore laboris in sint ad duis est eu consequat nisi esse irure tempor sunt pariatur qui mollit ipsum quis esse ex ipsum.

Dolore anim irure quis ipsum adipisicing sint et incididunt aute nisi minim aliquip consectetur duis tempor laborum nostrud exercitation do mollit irure anim lorem non excepteur commodo laborum dolore dolor.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '7e8e1f1e-d19f-45c7-86bd-6fef599dae71', + avatar : 'assets/images/avatars/female-16.jpg', + background : 'assets/images/cards/18-640x480.jpg', + name : 'Margo Witt', + emails : [ + { + email: 'margowitt@mail.ca', + label: 'Personal' + }, + { + email: 'witt.margo@norsul.org', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'ao', + number : '992 596 3391', + label : 'Mobile' + }, + { + country: 'ao', + number : '950 489 2505', + label : 'Work' + }, + { + country: 'ao', + number : '891 540 2231', + label : 'Home' + } + ], + title : 'Television News Producer', + company : 'Norsul', + birthday : '1975-08-31T12:00:00.000Z', + address : '539 Rockaway Avenue, Whitmer, Guam, PO4871', + notes : '

Sunt quis officia elit laborum excepteur consequat amet cillum labore deserunt cillum cillum labore exercitation minim laboris anim incididunt voluptate minim duis enim eu duis veniam labore nisi culpa duis.

Pariatur irure sunt et commodo reprehenderit consectetur duis et ullamco fugiat occaecat culpa enim incididunt officia minim aliqua sit amet do dolore pariatur fugiat et adipisicing labore dolor id dolore.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : 'bedcb6a2-da83-4631-866a-77d10d239477', + avatar : 'assets/images/avatars/male-04.jpg', + background : 'assets/images/cards/19-640x480.jpg', + name : 'Alvarado Turner', + emails : [ + { + email: 'alvaradoturner@mail.io', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'lv', + number : '961 537 3956', + label : 'Mobile' + } + ], + title : 'Fundraising Director', + company : 'Geologix', + birthday : '1985-12-08T12:00:00.000Z', + address : '233 Willmohr Street, Cressey, Iowa, PO1962', + notes : '

In amet voluptate ad eiusmod cupidatat nulla sunt eu amet occaecat qui cillum occaecat tempor minim nostrud ullamco amet elit aliquip est nisi officia lorem occaecat ea lorem officia veniam.

Nulla tempor id excepteur irure do do veniam eiusmod esse ipsum sint dolore commodo enim officia nulla nulla proident in dolor et aliquip sit nulla sit proident duis aute deserunt.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '66f9de1b-f842-4d4c-bb59-f97e91db0462', + avatar : 'assets/images/avatars/male-05.jpg', + background : 'assets/images/cards/20-640x480.jpg', + name : 'Maldonado Rodriquez', + emails : [ + { + email: 'maldonadorodriquez@mail.us', + label: 'Personal' + }, + { + email: 'rodriquez.maldonado@zentility.tv', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'et', + number : '811 502 3398', + label : 'Mobile' + }, + { + country: 'et', + number : '877 402 2443', + label : 'Work' + }, + { + country: 'et', + number : '949 536 3451', + label : 'Home' + } + ], + title : 'Dental Laboratory Worker', + company : 'Zentility', + birthday : '1993-06-01T12:00:00.000Z', + address : '916 Cobek Court, Morningside, South Dakota, PO2019', + notes : '

Laboris consequat labore nisi aute voluptate minim amet nulla elit tempor dolor nulla do et consequat esse dolore fugiat laboris deserunt velit minim laboris voluptate enim ut non laboris nisi.

Magna pariatur voluptate veniam nostrud irure magna pariatur ut quis reprehenderit voluptate aute duis sunt laboris consequat lorem eu pariatur nulla incididunt quis lorem consectetur ex lorem commodo magna dolore.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '9cb0ea57-3461-4182-979b-593b0c1ec6c3', + avatar : 'assets/images/avatars/male-06.jpg', + background : 'assets/images/cards/21-640x480.jpg', + name : 'Tran Duke', + emails : [ + { + email: 'tranduke@mail.com', + label: 'Personal' + }, + { + email: 'duke.tran@splinx.name', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'si', + number : '837 503 2254', + label : 'Mobile' + }, + { + country: 'si', + number : '893 405 3190', + label : 'Work' + }, + { + country: 'si', + number : '931 402 3874', + label : 'Home' + } + ], + title : 'Legal Assistant', + company : 'Splinx', + birthday : '1976-04-27T12:00:00.000Z', + address : '405 Canarsie Road, Richville, Virgin Islands, PO2744', + notes : '

Occaecat do excepteur non ipsum labore consequat id eu sunt minim aliquip elit occaecat velit ut aute cupidatat irure ex eiusmod fugiat ea ea cupidatat nulla dolor labore consectetur amet.

Mollit enim dolore deserunt tempor aliqua velit nostrud nostrud id consectetur lorem in enim excepteur nisi laborum ex commodo sint ea et culpa lorem esse culpa ad officia do amet.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '2fb89a90-5622-4b5b-8df3-d49b85905392', + avatar : null, + background : null, + name : 'Estela Lyons', + emails : [ + { + email: 'estelalyons@mail.me', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'vg', + number : '864 459 3205', + label : 'Mobile' + }, + { + country: 'vg', + number : '886 524 2880', + label : 'Work' + }, + { + country: 'vg', + number : '815 484 3420', + label : 'Home' + } + ], + title : 'Animal Sitter', + company : 'Gonkle', + birthday : '1968-03-11T12:00:00.000Z', + address : '540 Metrotech Courtr, Garfield, American Samoa, PO2290', + notes : '

Ullamco dolore ipsum exercitation officia dolore sit consequat nisi consequat occaecat et ipsum veniam anim tempor pariatur sunt in adipisicing aliqua non dolor laborum veniam nisi dolore quis sunt incididunt.

Incididunt ullamco sunt magna reprehenderit velit dolor qui anim eiusmod nostrud commodo exercitation velit incididunt exercitation nulla ad aute eiusmod est amet exercitation est nostrud sit esse esse ad irure.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : '8141dd08-3a6e-4770-912c-59d0ed06dde6', + avatar : null, + background : null, + name : 'Madeleine Fletcher', + emails : [ + { + email: 'madeleinefletcher@mail.info', + label: 'Personal' + }, + { + email: 'fletcher.madeleine@genmom.biz', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'uy', + number : '898 554 3354', + label : 'Mobile' + } + ], + title : 'Fundraising Director', + company : 'Genmom', + birthday : '1970-07-15T12:00:00.000Z', + address : '825 Cherry Street, Foscoe, Minnesota, PO7290', + notes : '

Fugiat in exercitation nostrud labore labore irure ex magna ex aliquip veniam sit irure irure deserunt occaecat tempor cillum aliqua dolore ea tempor dolore laboris est amet quis consequat quis.

Esse officia velit consectetur ullamco ea pariatur mollit sit consectetur sint mollit commodo anim anim ea amet consectetur eiusmod aliqua excepteur elit laborum magna non fugiat nisi pariatur ut velit.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '7585015c-ada2-4f88-998d-9646865d1ad2', + avatar : 'assets/images/avatars/male-07.jpg', + background : 'assets/images/cards/22-640x480.jpg', + name : 'Meyer Roach', + emails : [ + { + email: 'meyerroach@mail.co.uk', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'uz', + number : '891 543 2053', + label : 'Mobile' + }, + { + country: 'uz', + number : '842 564 3671', + label : 'Work' + }, + { + country: 'uz', + number : '992 491 3514', + label : 'Home' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Zentime', + birthday : '1968-10-16T12:00:00.000Z', + address : '315 Albemarle Road, Allison, Arkansas, PO6008', + notes : '

Eiusmod deserunt aliqua dolore ipsum cillum veniam minim dolore nulla aute aliqua voluptate labore sint cillum excepteur nulla nostrud do cupidatat eu adipisicing reprehenderit deserunt elit qui mollit adipisicing eu.

Proident commodo magna eu voluptate eiusmod aliqua laborum eu ea elit quis ullamco ullamco magna minim enim amet dolore sit lorem aliqua officia amet officia non magna enim cillum sit.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '32c73a6a-67f2-48a9-b2a1-b23da83187bb', + avatar : null, + background : null, + name : 'Bolton Obrien', + emails : [ + { + email: 'boltonobrien@mail.net', + label: 'Personal' + }, + { + email: 'obrien.bolton@enersol.ca', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'tn', + number : '860 472 2458', + label : 'Mobile' + }, + { + country: 'tn', + number : '887 499 3580', + label : 'Work' + } + ], + title : 'Banker Mason', + company : 'Enersol', + birthday : '1968-09-08T12:00:00.000Z', + address : '818 Aviation Road, Geyserville, Palau, PO9655', + notes : '

Cupidatat lorem tempor commodo do eu ea dolor eiusmod do nisi occaecat fugiat labore non esse aliquip ullamco laboris adipisicing pariatur nostrud enim minim do fugiat culpa exercitation lorem duis.

Pariatur cupidatat tempor est et nostrud in amet aliquip sint nulla amet ea lorem irure sint sit ea aliquip voluptate id laboris fugiat cillum cillum dolore deserunt fugiat ad tempor.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '114642a2-ccb7-4cb1-ad2b-5e9b6a0c1d2e', + avatar : 'assets/images/avatars/male-09.jpg', + background : 'assets/images/cards/23-640x480.jpg', + name : 'Barber Johnson', + emails : [ + { + email: 'barberjohnson@mail.org', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'az', + number : '928 567 2521', + label : 'Mobile' + }, + { + country: 'az', + number : '898 515 2048', + label : 'Work' + }, + { + country: 'az', + number : '935 495 3348', + label : 'Home' + } + ], + title : 'Talent Manager', + company : 'Zounds', + birthday : '1967-03-02T12:00:00.000Z', + address : '386 Vernon Avenue, Dragoon, North Carolina, PO4559', + notes : '

Esse amet ex duis esse aliqua non tempor ullamco dolore et aliquip nisi pariatur qui laborum id consequat tempor sint eiusmod exercitation velit aliquip occaecat tempor nisi aute magna sint.

Deserunt veniam voluptate dolore eiusmod eu consequat dolor sit pariatur laboris anim excepteur consequat nulla officia exercitation magna sint ea excepteur qui eu officia pariatur culpa sint elit nulla officia.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '310ece7d-dbb0-45d6-9e69-14c24e50fe3d', + avatar : 'assets/images/avatars/male-10.jpg', + background : 'assets/images/cards/24-640x480.jpg', + name : 'Cervantes Kramer', + emails : [ + { + email: 'cervanteskramer@mail.io', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'vg', + number : '998 498 2507', + label : 'Mobile' + }, + { + country: 'vg', + number : '856 477 3445', + label : 'Work' + } + ], + title : 'Motor Winder', + company : 'Xeronk', + birthday : '1992-09-04T12:00:00.000Z', + address : '238 Rochester Avenue, Lydia, Oklahoma, PO3914', + notes : '

Excepteur do ullamco voluptate deserunt tempor ullamco enim non incididunt adipisicing sunt sint sit qui occaecat occaecat id laboris et duis amet reprehenderit cupidatat aliquip dolore ea eu ea nulla.

Cillum nulla deserunt laboris eu sint dolor non laboris cupidatat aute nisi amet mollit ipsum cillum excepteur consequat tempor exercitation consequat nostrud ipsum qui excepteur eiusmod nostrud laboris pariatur sint.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : 'dcc673f6-de59-4715-94ed-8f64663d449b', + avatar : 'assets/images/avatars/female-19.jpg', + background : 'assets/images/cards/25-640x480.jpg', + name : 'Megan Suarez', + emails : [ + { + email: 'megansuarez@mail.us', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bb', + number : '875 422 2053', + label : 'Mobile' + }, + { + country: 'bb', + number : '861 487 2597', + label : 'Work' + }, + { + country: 'bb', + number : '873 414 3953', + label : 'Home' + } + ], + title : 'Bindery Machine Operator', + company : 'Cemention', + birthday : '1984-09-08T12:00:00.000Z', + address : '112 Tillary Street, Camptown, Vermont, PO8827', + notes : '

Pariatur tempor laborum deserunt commodo eiusmod adipisicing amet anim irure fugiat laboris velit do velit elit aute deserunt officia fugiat nulla ullamco est elit veniam officia sit veniam velit commodo.

Laboris duis eu adipisicing esse fugiat voluptate enim sint in voluptate lorem laboris eiusmod commodo nostrud dolor qui incididunt non fugiat culpa aliquip minim voluptate lorem sint sunt velit eiusmod.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '3e4ca731-d39b-4ad9-b6e0-f84e67f4b74a', + avatar : 'assets/images/avatars/female-20.jpg', + background : 'assets/images/cards/26-640x480.jpg', + name : 'Ofelia Ratliff', + emails : [ + { + email: 'ofeliaratliff@mail.tv', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'vu', + number : '978 546 3699', + label : 'Mobile' + }, + { + country: 'vu', + number : '892 551 2229', + label : 'Work' + }, + { + country: 'vu', + number : '949 495 3479', + label : 'Home' + } + ], + company : 'Buzzmaker', + birthday : '1988-11-11T12:00:00.000Z', + address : '951 Hampton Avenue, Bartonsville, Mississippi, PO4232', + notes : '

Ad lorem id irure aute ipsum ex occaecat commodo dolore eu dolor exercitation anim quis officia deserunt lorem sunt officia eu sit aliquip laborum id duis aliqua quis aute magna.

Do do lorem est amet aliqua ex excepteur nisi cupidatat esse consequat ipsum in ad eiusmod proident cupidatat dolore anim ut pariatur sint do elit incididunt officia adipisicing amet eu.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + }, + { + id : '2012d4a5-19e4-444d-aaff-1d8b1d853650', + avatar : 'assets/images/avatars/female-01.jpg', + background : 'assets/images/cards/27-640x480.jpg', + name : 'Laurel Parker', + emails : [ + { + email: 'laurelparker@mail.com', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'lu', + number : '805 502 3677', + label : 'Mobile' + }, + { + country: 'lu', + number : '925 527 2973', + label : 'Work' + }, + { + country: 'lu', + number : '975 495 2977', + label : 'Home' + } + ], + title : 'Fundraising Director', + company : 'Omnigog', + birthday : '1987-05-17T12:00:00.000Z', + address : '157 Woodhull Street, Rutherford, West Virginia, PO6646', + notes : '

Duis laboris consectetur et anim eiusmod laborum aute mollit ut officia ipsum dolore eiusmod ex eu elit officia est amet aliquip ullamco veniam proident id aliquip duis qui voluptate fugiat.

Sunt aliquip nulla amet sint culpa laboris quis proident qui veniam excepteur ullamco irure non eu occaecat est enim ut velit dolore sit tempor cillum reprehenderit proident velit lorem ad.

', + tags : [ + '2026ce08-d08f-4b4f-9506-b10cdb5b104f' + ] + }, + { + id : '012b8219-74bf-447c-af2c-66904d90a956', + avatar : 'assets/images/avatars/female-02.jpg', + background : 'assets/images/cards/28-640x480.jpg', + name : 'Tracy Delacruz', + emails : [ + { + email: 'tracydelacruz@mail.name', + label: 'Personal' + }, + { + email: 'delacruz.tracy@shepard.me', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'co', + number : '974 428 2886', + label : 'Mobile' + } + ], + title : 'Bindery Machine Operator', + company : 'Shepard', + birthday : '1963-08-10T12:00:00.000Z', + address : '604 Merit Court, Wyano, New Hampshire, PO1641', + notes : '

Dolor anim fugiat aliquip eiusmod lorem nisi adipisicing ea deserunt est quis non sit nulla voluptate deserunt magna eiusmod irure labore fugiat consectetur laboris velit voluptate exercitation aute magna sit.

Sunt ullamco quis qui ea ullamco quis sit ex nisi deserunt fugiat qui culpa minim proident dolor veniam lorem nulla amet do dolor proident sunt ex incididunt ipsum cillum non.

', + tags : [ + 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309' + ] + }, + { + id : '8b1befd2-66a7-4981-ae52-77f01b382d18', + avatar : 'assets/images/avatars/female-03.jpg', + background : 'assets/images/cards/29-640x480.jpg', + name : 'Jeannette Stanton', + emails : [ + { + email: 'jeannettestanton@mail.info', + label: 'Personal' + }, + { + email: 'stanton.jeannette@zentury.biz', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'dz', + number : '947 561 3783', + label : 'Mobile' + }, + { + country: 'dz', + number : '917 463 3737', + label : 'Work' + }, + { + country: 'dz', + number : '835 510 2059', + label : 'Home' + } + ], + title : 'Hotel Manager', + company : 'Zentury', + birthday : '1975-09-02T12:00:00.000Z', + address : '100 Menahan Street, Snyderville, Kansas, PO1006', + notes : '

Sint anim sint tempor proident irure proident exercitation dolor enim in sint non occaecat tempor mollit dolore ea labore ipsum sunt in incididunt proident excepteur id in velit et quis.

Amet mollit ut nostrud cupidatat ut culpa irure in ex occaecat aute aliqua tempor incididunt elit nulla irure aliqua ea do amet ex elit incididunt minim eu fugiat elit pariatur.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '844668c3-5e20-4fed-9e3a-7d274f696e61', + avatar : 'assets/images/avatars/female-04.jpg', + background : 'assets/images/cards/30-640x480.jpg', + name : 'Johnnie Cleveland', + emails : [ + { + email: 'johnniecleveland@mail.co.uk', + label: 'Personal' + }, + { + email: 'cleveland.johnnie@viasia.net', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'au', + number : '947 468 2942', + label : 'Mobile' + } + ], + title : 'Fundraising Director', + company : 'Viasia', + birthday : '1986-03-15T12:00:00.000Z', + address : '283 Albany Avenue, Jennings, Rhode Island, PO1646', + notes : '

Id est dolore nostrud consectetur ullamco aliquip dolore nisi consectetur cupidatat consectetur ut lorem exercitation laborum est culpa qui aliquip fugiat fugiat laborum minim sint sit laborum elit consectetur occaecat.

Cillum eu aliquip ex enim dolore enim ea pariatur elit voluptate in eu magna eu voluptate est cupidatat aliqua cupidatat ex eu dolor voluptate velit fugiat ipsum labore labore aliqua.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '5a01e870-8be1-45a5-b58a-ec09c06e8f28', + avatar : 'assets/images/avatars/female-05.jpg', + background : 'assets/images/cards/31-640x480.jpg', + name : 'Staci Hyde', + emails : [ + { + email: 'stacihyde@mail.ca', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'id', + number : '944 525 2944', + label : 'Mobile' + }, + { + country: 'id', + number : '877 500 2506', + label : 'Work' + } + ], + title : 'Banker Mason', + company : 'Zilla', + birthday : '1975-04-22T12:00:00.000Z', + address : '560 Dooley Street, Ellerslie, Louisiana, PO1005', + notes : '

Pariatur esse ex laborum ex dolor laborum proident enim consectetur occaecat magna adipisicing magna dolore officia aute et dolor aliquip enim adipisicing culpa reprehenderit aliqua officia qui pariatur aliquip occaecat.

Excepteur est nisi officia eiusmod et duis mollit labore minim duis officia lorem ipsum duis deserunt cupidatat excepteur nostrud incididunt non cillum fugiat adipisicing anim consectetur nostrud aliquip labore cupidatat.

', + tags : [ + '56ddbd47-4078-4ddd-8448-73c5e88d5f59' + ] + }, + { + id : '5ac1f193-f150-45f9-bfe4-b7b4e1a83ff9', + avatar : 'assets/images/avatars/female-06.jpg', + background : 'assets/images/cards/32-640x480.jpg', + name : 'Angela Gallagher', + emails : [ + { + email: 'angelagallagher@mail.org', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'et', + number : '996 514 3856', + label : 'Mobile' + }, + { + country: 'et', + number : '903 539 2049', + label : 'Work' + }, + { + country: 'et', + number : '938 463 3685', + label : 'Home' + } + ], + title : 'Electromedical Equipment Technician', + company : 'Zenolux', + birthday : '1965-08-02T12:00:00.000Z', + address : '445 Remsen Avenue, Ruckersville, Delaware, PO2712', + notes : '

Pariatur do nisi labore culpa minim aliquip excepteur voluptate id id aute eu aliquip adipisicing nulla laboris consectetur dolore ullamco ut exercitation fugiat excepteur veniam ex cillum cupidatat ad adipisicing.

Dolor culpa dolor magna incididunt voluptate sunt amet dolor cillum ut nostrud nisi quis ex pariatur enim dolore sunt sunt cupidatat id non lorem magna esse amet commodo minim id.

', + tags : [ + 'cbde2486-5033-4e09-838e-e901b108cd41' + ] + }, + { + id : '995df091-d78a-4bb7-840c-ba6a7d14a1bd', + avatar : 'assets/images/avatars/male-11.jpg', + background : 'assets/images/cards/33-640x480.jpg', + name : 'Hutchinson Levy', + emails : [ + { + email: 'hutchinsonlevy@mail.io', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'et', + number : '970 546 3452', + label : 'Mobile' + }, + { + country: 'et', + number : '894 438 2430', + label : 'Work' + } + ], + title : 'Congressional Representative', + company : 'Zytrek', + birthday : '1978-03-22T12:00:00.000Z', + address : '911 Lois Avenue, Epworth, California, PO6557', + notes : '

Veniam deserunt aliquip culpa commodo et est ea cillum ea pariatur reprehenderit dolore adipisicing voluptate dolor eiusmod tempor exercitation reprehenderit nostrud labore nostrud do nulla commodo officia qui culpa ea.

Velit deserunt do ut esse tempor minim cupidatat amet qui consequat enim duis elit veniam sunt sit aliquip irure cillum irure sunt officia incididunt cupidatat commodo amet non qui anim.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : '7184be71-a28f-4f2b-8c45-15f78cf2f825', + avatar : 'assets/images/avatars/female-05.jpg', + background : 'assets/images/cards/34-640x480.jpg', + name : 'Alissa Nelson', + emails : [ + { + email: 'alissanelson@mail.us', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'lu', + number : '893 600 2639', + label : 'Mobile' + } + ], + title : 'Bindery Machine Operator', + company : 'Emtrak', + birthday : '1993-10-19T12:00:00.000Z', + address : '514 Sutter Avenue, Shindler, Puerto Rico, PO3862', + notes : '

Ullamco ut aute reprehenderit velit incididunt veniam consequat ut ipsum sint laborum duis officia pariatur mollit enim nulla reprehenderit dolor aliquip labore ex aute in sunt dolor nulla reprehenderit dolor.

Ad enim ex non minim commodo culpa culpa ex est anim aute adipisicing proident ut ex et aliquip amet exercitation lorem tempor laborum quis reprehenderit veniam proident ullamco id eiusmod.

', + tags : [ + '3eaab175-ec0d-4db7-bc3b-efc633c769be' + ] + }, + { + id : '325d508c-ca49-42bf-b0d5-c4a6b8da3d5c', + avatar : null, + background : null, + name : 'Oliver Head', + emails : [ + { + email: 'oliverhead@mail.tv', + label: 'Personal' + } + ], + phoneNumbers: [ + { + country: 'bn', + number : '977 528 3294', + label : 'Mobile' + } + ], + title : 'Meteorologist', + company : 'Rameon', + birthday : '1967-01-05T12:00:00.000Z', + address : '569 Clermont Avenue, Movico, Marshall Islands, PO7293', + notes : '

Duis laborum magna ipsum officia cillum ea ut commodo anim exercitation incididunt id ipsum nisi consectetur aute officia culpa anim in veniam ad officia consequat qui ullamco ea laboris ad.

Ad ea excepteur ea veniam nostrud est labore ea consectetur laboris cupidatat aute pariatur aute mollit dolor do deserunt nisi mollit fugiat qui officia ullamco est officia est ullamco consequat.

', + tags : [ + '65930b5a-5d2a-4303-b11f-865d69e6fdb5' + ] + }, + { + id : 'c674b6e1-b846-4bba-824b-0b4df0cdec48', + avatar : 'assets/images/avatars/male-13.jpg', + background : 'assets/images/cards/35-640x480.jpg', + name : 'Duran Barr', + emails : [ + { + email: 'duranbarr@mail.com', + label: 'Personal' + }, + { + email: 'barr.duran@hinway.name', + label: 'Work' + } + ], + phoneNumbers: [ + { + country: 'sr', + number : '857 457 2508', + label : 'Mobile' + }, + { + country: 'sr', + number : '887 522 2146', + label : 'Work' + }, + { + country: 'sr', + number : '947 574 3174', + label : 'Home' + } + ], + title : 'Insurance Analyst', + company : 'Hinway', + birthday : '1977-11-06T12:00:00.000Z', + address : '103 Chestnut Avenue, Glenbrook, Indiana, PO2578', + notes : '

Ad ipsum occaecat dolore ullamco labore ex sint est pariatur aliquip ea do esse do est dolore duis excepteur esse irure eiusmod pariatur elit nostrud laboris ad ex nostrud nostrud.

Occaecat proident magna elit ullamco ea incididunt fugiat est nulla reprehenderit in veniam esse qui minim aliqua tempor excepteur dolor et tempor occaecat in veniam esse qui exercitation laborum esse.

', + tags : [ + 'a8991c76-2fda-4bbd-a718-df13d6478847' + ] + } +]; +export const countries = [ + { + id : '19430ee3-b0fe-4987-a7c8-74453ad5504d', + iso : 'af', + name : 'Afghanistan', + code : '+93', + flagImagePos: '-1px -3180px' + }, + { + id : '6c6b5c5c-97d5-4881-b5e1-e05b8f739ee7', + iso : 'al', + name : 'Albania', + code : '+355', + flagImagePos: '-1px -1310px' + }, + { + id : 'd1f3941f-075e-4777-a5fd-8b196d98cd5a', + iso : 'dz', + name : 'Algeria', + code : '+213', + flagImagePos: '-1px -681px' + }, + { + id : '0dc3d1b8-f7f3-4c3d-8493-0d8b5a679910', + iso : 'as', + name : 'American Samoa', + code : '+1', + flagImagePos: '-1px -2058px' + }, + { + id : 'e2e88578-b410-499f-aa59-9bb8da13c781', + iso : 'ad', + name : 'Andorra', + code : '+376', + flagImagePos: '-1px -766px' + }, + { + id : '4446885b-b391-4b84-866f-2b36603053c4', + iso : 'ao', + name : 'Angola', + code : '+244', + flagImagePos: '-1px -2636px' + }, + { + id : '07024099-a3db-4881-a628-24e8c0ba2508', + iso : 'ai', + name : 'Anguilla', + code : '+1', + flagImagePos: '-1px -2687px' + }, + { + id : '26be08bc-d87a-4134-9fb0-73b6a5b47cea', + iso : 'ag', + name : 'Antigua & Barbuda', + code : '+1', + flagImagePos: '-1px -1140px' + }, + { + id : '53c77399-494e-49df-9e3a-587b536c033e', + iso : 'ar', + name : 'Argentina', + code : '+54', + flagImagePos: '-1px -3282px' + }, + { + id : '9f5753c4-e9e4-4975-86b4-9eb9f4f484de', + iso : 'am', + name : 'Armenia', + code : '+374', + flagImagePos: '-1px -205px' + }, + { + id : 'f1bbb833-5c47-4e17-b8c3-1d492107dc86', + iso : 'aw', + name : 'Aruba', + code : '+297', + flagImagePos: '-1px -1021px' + }, + { + id : 'dc7e3322-8bd5-4c49-932d-a8e50bd1f9ad', + iso : 'ac', + name : 'Ascension Island', + code : '+247', + flagImagePos: '-1px -86px' + }, + { + id : '4505ba35-afa5-47ef-a6c7-9b57f1dcd187', + iso : 'au', + name : 'Australia', + code : '+61', + flagImagePos: '-1px -2279px' + }, + { + id : '57b3cd1f-d5d6-403b-8137-fbeeacaf136a', + iso : 'at', + name : 'Austria', + code : '+43', + flagImagePos: '-1px -1735px' + }, + { + id : '11cbde08-3c33-422c-bf4b-85561595ffb5', + iso : 'az', + name : 'Azerbaijan', + code : '+994', + flagImagePos: '-1px -1599px' + }, + { + id : '48c1e060-e685-4e91-8de8-725f42576e6c', + iso : 'bs', + name : 'Bahamas', + code : '+1', + flagImagePos: '-1px -460px' + }, + { + id : 'ee23ffb8-9540-4630-948e-ceba52fa54ce', + iso : 'bh', + name : 'Bahrain', + code : '+973', + flagImagePos: '-1px -1956px' + }, + { + id : 'b5f37cb6-7870-4ed9-8f92-3864bd870062', + iso : 'bd', + name : 'Bangladesh', + code : '+880', + flagImagePos: '-1px -2364px' + }, + { + id : '92de9080-f709-493e-a9fa-d23b3d4093d4', + iso : 'bb', + name : 'Barbados', + code : '+1', + flagImagePos: '-1px -2075px' + }, + { + id : 'a2f4ff04-86b8-4bc0-952f-686bfe99c07f', + iso : 'by', + name : 'Belarus', + code : '+375', + flagImagePos: '-1px -1412px' + }, + { + id : '2025b6b3-1287-4b4c-8b13-36deb44e5751', + iso : 'be', + name : 'Belgium', + code : '+32', + flagImagePos: '-1px -1px' + }, + { + id : '70d82950-3eca-496f-866d-d99c136260e5', + iso : 'bz', + name : 'Belize', + code : '+501', + flagImagePos: '-1px -613px' + }, + { + id : 'dc0bedf5-e197-46b4-af21-c2e495b15768', + iso : 'bj', + name : 'Benin', + code : '+229', + flagImagePos: '-1px -1684px' + }, + { + id : 'aeee4f9d-99a1-4c6b-826c-f3c0ff707dce', + iso : 'bm', + name : 'Bermuda', + code : '+1', + flagImagePos: '-1px -2585px' + }, + { + id : '73b80fa7-50d0-4fd5-8d26-24baade525a2', + iso : 'bt', + name : 'Bhutan', + code : '+975', + flagImagePos: '-1px -2483px' + }, + { + id : '571bf396-810b-4fc4-9ffc-c9e4db9d3bef', + iso : 'bo', + name : 'Bolivia', + code : '+591', + flagImagePos: '-1px -2177px' + }, + { + id : 'cbfbf28b-b79b-4b7d-a2e9-37a2000aa15b', + iso : 'ba', + name : 'Bosnia & Herzegovina', + code : '+387', + flagImagePos: '-1px -2092px' + }, + { + id : 'f929da82-915c-4ac8-ba13-aa1b44174c71', + iso : 'bw', + name : 'Botswana', + code : '+267', + flagImagePos: '-1px -3724px' + }, + { + id : '2dea0689-0548-400c-a58f-ebcd6373cd07', + iso : 'br', + name : 'Brazil', + code : '+55', + flagImagePos: '-1px -1004px' + }, + { + id : 'd2c2c16f-15f8-467b-8c42-a02babe5362b', + iso : 'io', + name : 'British Indian Ocean Territory', + code : '+246', + flagImagePos: '-1px -86px' + }, + { + id : '1d90db23-ca7c-4d23-a995-9b2a8021f4ad', + iso : 'vg', + name : 'British Virgin Islands', + code : '+1', + flagImagePos: '-1px -1854px' + }, + { + id : 'f16aebb2-cdae-4af2-aba5-f66f34d6ac3a', + iso : 'bn', + name : 'Brunei', + code : '+673', + flagImagePos: '-1px -2228px' + }, + { + id : '499d6ee6-8f8b-4a5b-bb92-9cce9d1c6546', + iso : 'bg', + name : 'Bulgaria', + code : '+359', + flagImagePos: '-1px -3537px' + }, + { + id : '67e2986b-98d0-44c3-b08f-6cbba8b14ff8', + iso : 'bf', + name : 'Burkina Faso', + code : '+226', + flagImagePos: '-1px -953px' + }, + { + id : 'fea611f2-4aa3-427f-86e1-657e8aef24a8', + iso : 'bi', + name : 'Burundi', + code : '+257', + flagImagePos: '-1px -2551px' + }, + { + id : '3b959360-3d04-4018-afdf-a392afa1881d', + iso : 'kh', + name : 'Cambodia', + code : '+855', + flagImagePos: '-1px -290px' + }, + { + id : '9336ba3b-01be-4b84-82b5-f02395856ac5', + iso : 'cm', + name : 'Cameroon', + code : '+237', + flagImagePos: '-1px -2806px' + }, + { + id : '36a159b0-f33e-4481-85b0-751bdd9ea79d', + iso : 'ca', + name : 'Canada', + code : '+1', + flagImagePos: '-1px -1803px' + }, + { + id : 'a3038010-382e-436e-b61d-e4b923aa1cb3', + iso : 'cv', + name : 'Cape Verde', + code : '+238', + flagImagePos: '-1px -3639px' + }, + { + id : 'dd898165-12a9-4c90-a3e4-012149c0feac', + iso : 'bq', + name : 'Caribbean Netherlands', + code : '+599', + flagImagePos: '-1px -3741px' + }, + { + id : 'a1f30091-26da-481a-a84f-2638b2d7c14d', + iso : 'ky', + name : 'Cayman Islands', + code : '+1', + flagImagePos: '-1px -375px' + }, + { + id : '469b4a79-8a1a-4428-b7bd-4665202b7292', + iso : 'cf', + name : 'Central African Republic', + code : '+236', + flagImagePos: '-1px -2466px' + }, + { + id : 'a9c2fa4b-c22a-41bd-9735-b4adeadab7f7', + iso : 'td', + name : 'Chad', + code : '+235', + flagImagePos: '-1px -1055px' + }, + { + id : 'f0825f0d-e086-49e0-846e-9e4784bf872c', + iso : 'cl', + name : 'Chile', + code : '+56', + flagImagePos: '-1px -1752px' + }, + { + id : '89d3f07d-446e-459d-b168-595af96d708f', + iso : 'cn', + name : 'China', + code : '+86', + flagImagePos: '-1px -1072px' + }, + { + id : '903801ce-2f83-4df8-a380-9dc6df6c35cf', + iso : 'co', + name : 'Colombia', + code : '+57', + flagImagePos: '-1px -409px' + }, + { + id : '55d7d2be-8273-4770-844c-1ef87524cd27', + iso : 'km', + name : 'Comoros', + code : '+269', + flagImagePos: '-1px -1871px' + }, + { + id : 'a5b00b2f-01de-4c0d-914f-fe05c92c8f43', + iso : 'cg', + name : 'Congo - Brazzaville', + code : '+242', + flagImagePos: '-1px -2398px' + }, + { + id : '58e07572-21b9-4630-a17c-a51c0ade4b8a', + iso : 'cd', + name : 'Congo - Kinshasa', + code : '+243', + flagImagePos: '-1px -1990px' + }, + { + id : '5a09d08e-b6ab-4084-8350-1d97d504c222', + iso : 'ck', + name : 'Cook Islands', + code : '+682', + flagImagePos: '-1px -3112px' + }, + { + id : '760f2b33-0822-4ad9-83cf-b497dcf273bb', + iso : 'cr', + name : 'Costa Rica', + code : '+506', + flagImagePos: '-1px -2857px' + }, + { + id : '489db55f-6316-4f43-a1c7-a0921e16743a', + iso : 'ci', + name : 'Côte d’Ivoire', + code : '+225', + flagImagePos: '-1px -2194px' + }, + { + id : '398c1d99-7ee4-44cd-9c2a-067acba2c8fb', + iso : 'hr', + name : 'Croatia', + code : '+385', + flagImagePos: '-1px -1174px' + }, + { + id : '572da7dc-8463-4797-ad84-7fcf8f53bb80', + iso : 'cu', + name : 'Cuba', + code : '+53', + flagImagePos: '-1px -987px' + }, + { + id : '572674e5-b0d4-4206-8310-70f4656e65e2', + iso : 'cw', + name : 'Curaçao', + code : '+599', + flagImagePos: '-1px -3758px' + }, + { + id : 'ac1e2a9d-a888-427e-9ad3-a0cbb27e603a', + iso : 'cy', + name : 'Cyprus', + code : '+357', + flagImagePos: '-1px -732px' + }, + { + id : '075ce3fd-83e7-472a-89cb-8b5e224102c4', + iso : 'cz', + name : 'Czechia', + code : '+420', + flagImagePos: '-1px -3095px' + }, + { + id : '4cde631a-97e9-4fc2-9465-9d9a433ca5c1', + iso : 'dk', + name : 'Denmark', + code : '+45', + flagImagePos: '-1px -1820px' + }, + { + id : '1b9c40a6-bf03-4759-b6ab-8edefafd8b44', + iso : 'dj', + name : 'Djibouti', + code : '+253', + flagImagePos: '-1px -2874px' + }, + { + id : 'f5eec2ba-1a0b-465c-b3e5-9bd8458d0704', + iso : 'dm', + name : 'Dominica', + code : '+1', + flagImagePos: '-1px -3350px' + }, + { + id : 'cb6921fc-df2a-4a97-8a34-4d901ac1e994', + iso : 'do', + name : 'Dominican Republic', + code : '+1', + flagImagePos: '-1px -2007px' + }, + { + id : '7d6641f1-ef97-4bee-b1b8-0f54fea35aeb', + iso : 'ec', + name : 'Ecuador', + code : '+593', + flagImagePos: '-1px -1531px' + }, + { + id : 'dfeb30b9-b4b8-4931-9334-c3961b7843a6', + iso : 'eg', + name : 'Egypt', + code : '+20', + flagImagePos: '-1px -3027px' + }, + { + id : '7d9f7158-7206-491f-a614-6a3e7e6af354', + iso : 'sv', + name : 'El Salvador', + code : '+503', + flagImagePos: '-1px -2160px' + }, + { + id : 'bcdbebc2-a51d-4891-93b0-52b463d0841d', + iso : 'gq', + name : 'Equatorial Guinea', + code : '+240', + flagImagePos: '-1px -1973px' + }, + { + id : '53c2c225-f321-406f-b377-7c8b6720bcb4', + iso : 'er', + name : 'Eritrea', + code : '+291', + flagImagePos: '-1px -936px' + }, + { + id : 'ba0e995a-17a8-48ff-88e6-54ff8207b038', + iso : 'ee', + name : 'Estonia', + code : '+372', + flagImagePos: '-1px -3333px' + }, + { + id : 'abe9af9b-91da-4bba-9adf-a496bf414719', + iso : 'sz', + name : 'Eswatini', + code : '+268', + flagImagePos: '-1px -3129px' + }, + { + id : 'e993ecc8-732a-4446-8ab1-144c084f3192', + iso : 'et', + name : 'Ethiopia', + code : '+251', + flagImagePos: '-1px -3367px' + }, + { + id : '6c7aae9d-e18d-4d09-8467-7bb99d925768', + iso : 'fk', + name : 'Falkland Islands (Islas Malvinas)', + code : '+500', + flagImagePos: '-1px -3809px' + }, + { + id : '92e704eb-9573-4d91-b932-2b1eddaacb3e', + iso : 'fo', + name : 'Faroe Islands', + code : '+298', + flagImagePos: '-1px -1429px' + }, + { + id : '561c079c-69c2-4e62-b947-5cd76783a67c', + iso : 'fj', + name : 'Fiji', + code : '+679', + flagImagePos: '-1px -2500px' + }, + { + id : '3f31a88e-c7ed-47fa-9aae-2058be7cbe09', + iso : 'fi', + name : 'Finland', + code : '+358', + flagImagePos: '-1px -2568px' + }, + { + id : '4c8ba1fc-0203-4a8f-8321-4dda4a0c6732', + iso : 'fr', + name : 'France', + code : '+33', + flagImagePos: '-1px -324px' + }, + { + id : '198074d5-67a2-4fd3-b13d-429a394b6371', + iso : 'gf', + name : 'French Guiana', + code : '+594', + flagImagePos: '-1px -324px' + }, + { + id : '2f5ff3d1-745e-48a1-b4e8-a377b22af812', + iso : 'pf', + name : 'French Polynesia', + code : '+689', + flagImagePos: '-1px -2262px' + }, + { + id : 'a8b80121-5529-4cfe-83fb-6b1f6c81abcb', + iso : 'ga', + name : 'Gabon', + code : '+241', + flagImagePos: '-1px -1157px' + }, + { + id : 'c9bc7d57-7883-4f63-bc6e-5dcc3db8612d', + iso : 'gm', + name : 'Gambia', + code : '+220', + flagImagePos: '-1px -817px' + }, + { + id : '1fc146d8-cebe-4ef1-bb0f-30bd0870ccf9', + iso : 'ge', + name : 'Georgia', + code : '+995', + flagImagePos: '-1px -1123px' + }, + { + id : 'e74ac4b1-0b4b-4630-bac0-2e53e270b363', + iso : 'de', + name : 'Germany', + code : '+49', + flagImagePos: '-1px -3452px' + }, + { + id : 'adda89c9-4b47-4552-85c4-668f2cef2dbd', + iso : 'gh', + name : 'Ghana', + code : '+233', + flagImagePos: '-1px -2891px' + }, + { + id : '962a059b-a5ac-4e2f-9405-5c418cadb6b0', + iso : 'gi', + name : 'Gibraltar', + code : '+350', + flagImagePos: '-1px -341px' + }, + { + id : '0acd0dae-0f39-4c23-be1d-c0295539d8c4', + iso : 'gr', + name : 'Greece', + code : '+30', + flagImagePos: '-1px -188px' + }, + { + id : '7529a6e4-8a6a-4c27-885e-ff0c5e15e515', + iso : 'gl', + name : 'Greenland', + code : '+299', + flagImagePos: '-1px -2347px' + }, + { + id : '416ba85d-f860-48dc-9c60-32602c07e266', + iso : 'gd', + name : 'Grenada', + code : '+1', + flagImagePos: '-1px -3316px' + }, + { + id : 'f43f1f96-1fb1-4e5e-b818-71e60e501fd4', + iso : 'gp', + name : 'Guadeloupe', + code : '+590', + flagImagePos: '-1px -511px' + }, + { + id : 'e29122da-20cf-4d24-bc68-93f9c3296730', + iso : 'gu', + name : 'Guam', + code : '+1', + flagImagePos: '-1px -3265px' + }, + { + id : '8a24ff28-dcae-4846-b0c1-18cfcb04de06', + iso : 'gt', + name : 'Guatemala', + code : '+502', + flagImagePos: '-1px -1208px' + }, + { + id : 'b617a005-be15-49c8-9533-c0376681a564', + iso : 'gn', + name : 'Guinea', + code : '+224', + flagImagePos: '-1px -3520px' + }, + { + id : 'd9913e74-e340-4a4f-bf4b-aaaf1747364b', + iso : 'gw', + name : 'Guinea-Bissau', + code : '+245', + flagImagePos: '-1px -2602px' + }, + { + id : 'c8245da4-cd4f-4818-a41e-42afec6faa9a', + iso : 'gy', + name : 'Guyana', + code : '+592', + flagImagePos: '-1px -1038px' + }, + { + id : 'c598961d-3040-4dbb-8934-6d8eb4b9be97', + iso : 'ht', + name : 'Haiti', + code : '+509', + flagImagePos: '-1px -392px' + }, + { + id : 'f51aadf1-3c7a-4d24-b8fb-69c7e05243e4', + iso : 'hn', + name : 'Honduras', + code : '+504', + flagImagePos: '-1px -2959px' + }, + { + id : 'a621dbe5-fb11-4f7f-9a8d-2330bd20c563', + iso : 'hk', + name : 'Hong Kong', + code : '+852', + flagImagePos: '-1px -3707px' + }, + { + id : 'a113fe26-d409-4ab7-b27c-0e8ac112071f', + iso : 'hu', + name : 'Hungary', + code : '+36', + flagImagePos: '-1px -902px' + }, + { + id : '6430b612-4071-4614-bfdb-408fbb0b8fa4', + iso : 'is', + name : 'Iceland', + code : '+354', + flagImagePos: '-1px -2704px' + }, + { + id : '4cce1334-df1f-4b11-9f15-a4faaac3d0db', + iso : 'in', + name : 'India', + code : '+91', + flagImagePos: '-1px -2245px' + }, + { + id : '54969b2f-6aa9-4a58-850d-b4779ef3038e', + iso : 'id', + name : 'Indonesia', + code : '+62', + flagImagePos: '-1px -2653px' + }, + { + id : 'cb631628-5854-44d2-9dbc-47cdf9c9ea5e', + iso : 'ir', + name : 'Iran', + code : '+98', + flagImagePos: '-1px -2738px' + }, + { + id : '21a50cc1-954c-49c2-8296-696f1f57b79e', + iso : 'iq', + name : 'Iraq', + code : '+964', + flagImagePos: '-1px -851px' + }, + { + id : '3e17cb8a-9c44-4c75-b417-556546ceebff', + iso : 'ie', + name : 'Ireland', + code : '+353', + flagImagePos: '-1px -2670px' + }, + { + id : '0a15f5a3-7571-478a-9fcd-6cbd6563e08c', + iso : 'il', + name : 'Israel', + code : '+972', + flagImagePos: '-1px -426px' + }, + { + id : '2cbab786-d79b-4ea1-ab26-0553c5e423d3', + iso : 'it', + name : 'Italy', + code : '+39', + flagImagePos: '-1px -154px' + }, + { + id : '33a67cd8-0858-46c3-b833-4fd395d2daa4', + iso : 'jm', + name : 'Jamaica', + code : '+1', + flagImagePos: '-1px -2296px' + }, + { + id : '5edf8bb6-6a29-44ee-b5f2-7d7cbf61f971', + iso : 'jp', + name : 'Japan', + code : '+81', + flagImagePos: '-1px -528px' + }, + { + id : '879b69bb-3f8f-484f-a767-7fdeef6bae15', + iso : 'jo', + name : 'Jordan', + code : '+962', + flagImagePos: '-1px -1905px' + }, + { + id : '4217e52c-2835-4c7b-87d3-e290c4fa6074', + iso : 'kz', + name : 'Kazakhstan', + code : '+7', + flagImagePos: '-1px -1565px' + }, + { + id : '934b172d-4427-47f6-8648-6411652be23d', + iso : 'ke', + name : 'Kenya', + code : '+254', + flagImagePos: '-1px -3605px' + }, + { + id : '2358e177-3956-4bcf-a954-56275e90e28d', + iso : 'ki', + name : 'Kiribati', + code : '+686', + flagImagePos: '-1px -477px' + }, + { + id : '98e8fae8-cd1b-419f-813b-ee348b51d843', + iso : 'xk', + name : 'Kosovo', + code : '+383', + flagImagePos: '-1px -3860px' + }, + { + id : '5376f774-4fcb-47dc-b118-e48d34b030ef', + iso : 'kw', + name : 'Kuwait', + code : '+965', + flagImagePos: '-1px -3435px' + }, + { + id : '9bc380c4-5840-4d26-a615-310cd817ae94', + iso : 'kg', + name : 'Kyrgyzstan', + code : '+996', + flagImagePos: '-1px -2143px' + }, + { + id : '3278e7f0-176b-4352-9e38-df59b052b91f', + iso : 'la', + name : 'Laos', + code : '+856', + flagImagePos: '-1px -562px' + }, + { + id : 'e2ba5fad-f531-467c-b195-a6cd90136e19', + iso : 'lv', + name : 'Latvia', + code : '+371', + flagImagePos: '-1px -2619px' + }, + { + id : '49f74ca5-9ff1-44af-8e9c-59e1c4704e83', + iso : 'lb', + name : 'Lebanon', + code : '+961', + flagImagePos: '-1px -1616px' + }, + { + id : 'd94b6d96-17c1-4de8-abc3-3e14873b62c0', + iso : 'ls', + name : 'Lesotho', + code : '+266', + flagImagePos: '-1px -3010px' + }, + { + id : 'e35005f8-285e-4fe5-9cda-def721d9cc7b', + iso : 'lr', + name : 'Liberia', + code : '+231', + flagImagePos: '-1px -2823px' + }, + { + id : '60788779-78f0-4b2b-8ad8-c7e4bbde10b5', + iso : 'ly', + name : 'Libya', + code : '+218', + flagImagePos: '-1px -137px' + }, + { + id : 'f24ad4ea-454a-4d40-a1f1-db188ec0b75e', + iso : 'li', + name : 'Liechtenstein', + code : '+423', + flagImagePos: '-1px -1276px' + }, + { + id : 'f6709b72-4150-4cde-a37b-e6eb95f5bd1d', + iso : 'lt', + name : 'Lithuania', + code : '+370', + flagImagePos: '-1px -1446px' + }, + { + id : '0d0c1a84-f645-4ffe-87d2-9a7bb4f88bbc', + iso : 'lu', + name : 'Luxembourg', + code : '+352', + flagImagePos: '-1px -1922px' + }, + { + id : '5b3fdebe-a4ed-47c6-88c3-d867d3a79bf0', + iso : 'mo', + name : 'Macao', + code : '+853', + flagImagePos: '-1px -3554px' + }, + { + id : '6a84f456-bc77-4b76-8651-e2a0994f3278', + iso : 'mg', + name : 'Madagascar', + code : '+261', + flagImagePos: '-1px -1667px' + }, + { + id : '2a5d5baf-1db7-4606-a330-227834c77098', + iso : 'mw', + name : 'Malawi', + code : '+265', + flagImagePos: '-1px -2942px' + }, + { + id : 'f2b32090-6d8d-40db-ba50-a63037926508', + iso : 'my', + name : 'Malaysia', + code : '+60', + flagImagePos: '-1px -2517px' + }, + { + id : '51c7830c-0c76-44ed-bcdf-be75688e1d0c', + iso : 'mv', + name : 'Maldives', + code : '+960', + flagImagePos: '-1px -800px' + }, + { + id : 'ea7a2274-0542-4bbb-b629-aa63bef97442', + iso : 'ml', + name : 'Mali', + code : '+223', + flagImagePos: '-1px -3469px' + }, + { + id : '6f70796e-8f64-4a1a-ac2a-990d7d502db3', + iso : 'mt', + name : 'Malta', + code : '+356', + flagImagePos: '-1px -2041px' + }, + { + id : 'c60f429e-0d4f-42cf-96f9-e7dc4fdcd5ee', + iso : 'mh', + name : 'Marshall Islands', + code : '+692', + flagImagePos: '-1px -1463px' + }, + { + id : 'e8afae89-e5b0-4551-bbd4-bbfcee50c8ad', + iso : 'mq', + name : 'Martinique', + code : '+596', + flagImagePos: '-1px -239px' + }, + { + id : '361afc7c-ee94-464b-b5cb-f059ecd79e99', + iso : 'mr', + name : 'Mauritania', + code : '+222', + flagImagePos: '-1px -307px' + }, + { + id : 'bce43b5e-d2f7-47ca-b5c9-9ae72ba67bda', + iso : 'mu', + name : 'Mauritius', + code : '+230', + flagImagePos: '-1px -2993px' + }, + { + id : 'd153dc32-4821-4f05-a5c8-564d003da5e1', + iso : 'mx', + name : 'Mexico', + code : '+52', + flagImagePos: '-1px -2755px' + }, + { + id : '80f9f386-231f-4d96-b950-5f6b6edbeb63', + iso : 'fm', + name : 'Micronesia', + code : '+691', + flagImagePos: '-1px -2313px' + }, + { + id : 'a1d89e32-4b91-4519-b0d9-7d61299394ef', + iso : 'md', + name : 'Moldova', + code : '+373', + flagImagePos: '-1px -3690px' + }, + { + id : '0afeb22c-c106-479b-af45-1380fb8b404c', + iso : 'mc', + name : 'Monaco', + code : '+377', + flagImagePos: '-1px -1191px' + }, + { + id : 'a18d0204-7c4a-425c-a33e-cbfac01be162', + iso : 'mn', + name : 'Mongolia', + code : '+976', + flagImagePos: '-1px -3503px' + }, + { + id : '260479fc-0410-4ccd-a963-e06c9f059bdb', + iso : 'me', + name : 'Montenegro', + code : '+382', + flagImagePos: '-1px -2976px' + }, + { + id : 'a66872f1-ba90-420f-8f55-f0fbb10abce1', + iso : 'ms', + name : 'Montserrat', + code : '+1', + flagImagePos: '-1px -749px' + }, + { + id : '8fd1ba13-cb1a-488d-b715-01724d56d9dd', + iso : 'ma', + name : 'Morocco', + code : '+212', + flagImagePos: '-1px -3214px' + }, + { + id : '5d26fba4-6d15-4cd4-a23f-9034d952e580', + iso : 'mz', + name : 'Mozambique', + code : '+258', + flagImagePos: '-1px -834px' + }, + { + id : 'f9c12031-14dc-495f-b150-28dddce17e3f', + iso : 'mm', + name : 'Myanmar (Burma)', + code : '+95', + flagImagePos: '-1px -18px' + }, + { + id : '6e21e956-2740-4058-a758-3b249f628a7b', + iso : 'na', + name : 'Namibia', + code : '+264', + flagImagePos: '-1px -2534px' + }, + { + id : '4a07dd5a-9341-4b06-969f-4bcd9c32e2a0', + iso : 'nr', + name : 'Nauru', + code : '+674', + flagImagePos: '-1px -2330px' + }, + { + id : '9d7121ce-1445-4c84-9401-ddc703d9dedb', + iso : 'np', + name : 'Nepal', + code : '+977', + flagImagePos: '-1px -120px' + }, + { + id : '31fbb24d-7c38-4ca8-b385-48d76a0685e3', + iso : 'nl', + name : 'Netherlands', + code : '+31', + flagImagePos: '-1px -1888px' + }, + { + id : '18071cc2-c457-4b4f-9217-2519a0b52c25', + iso : 'nc', + name : 'New Caledonia', + code : '+687', + flagImagePos: '-1px -1650px' + }, + { + id : 'c4b0e7d1-08b2-421b-8ff6-913020cbf271', + iso : 'nz', + name : 'New Zealand', + code : '+64', + flagImagePos: '-1px -2024px' + }, + { + id : '25719230-2c64-4525-96c4-d4427dd2e40b', + iso : 'ni', + name : 'Nicaragua', + code : '+505', + flagImagePos: '-1px -171px' + }, + { + id : 'a1090a0b-7f89-4d75-8c92-e460da9103ab', + iso : 'ne', + name : 'Niger', + code : '+227', + flagImagePos: '-1px -715px' + }, + { + id : '6869e4bb-32b8-43ff-84d1-67d9ee832e1f', + iso : 'ng', + name : 'Nigeria', + code : '+234', + flagImagePos: '-1px -3418px' + }, + { + id : '52b3ae35-196a-4e22-81e2-67b816a32d0e', + iso : 'nu', + name : 'Niue', + code : '+683', + flagImagePos: '-1px -2840px' + }, + { + id : '9f4e45d4-c7e1-4ba9-84d0-e712e7213c95', + iso : 'nf', + name : 'Norfolk Island', + code : '+672', + flagImagePos: '-1px -256px' + }, + { + id : '2db1b02c-631e-40a0-94d8-f1e567b1f705', + iso : 'kp', + name : 'North Korea', + code : '+850', + flagImagePos: '-1px -2415px' + }, + { + id : '92621b3f-55f5-42bb-8604-d0302e355e31', + iso : 'mk', + name : 'North Macedonia', + code : '+389', + flagImagePos: '-1px -1769px' + }, + { + id : '3cee8ab2-5cb3-43ea-b8ab-7016187d33e9', + iso : 'mp', + name : 'Northern Mariana Islands', + code : '+1', + flagImagePos: '-1px -919px' + }, + { + id : '77683fad-f106-4a94-a629-9562650edb35', + iso : 'no', + name : 'Norway', + code : '+47', + flagImagePos: '-1px -1089px' + }, + { + id : '09090411-ef9b-44f3-aeb9-65b5e338b8d6', + iso : 'om', + name : 'Oman', + code : '+968', + flagImagePos: '-1px -3384px' + }, + { + id : '18d4f06b-233b-4398-a9f8-6b4a4eaf6c71', + iso : 'pk', + name : 'Pakistan', + code : '+92', + flagImagePos: '-1px -2772px' + }, + { + id : 'b1da5023-aab9-431c-921c-4f3e12b1aa7a', + iso : 'pw', + name : 'Palau', + code : '+680', + flagImagePos: '-1px -273px' + }, + { + id : 'e6442ab2-ac99-4a02-9d7c-fd878e50de8a', + iso : 'ps', + name : 'Palestine', + code : '+970', + flagImagePos: '-1px -1548px' + }, + { + id : '6bb10fb5-8b4a-4136-a82e-6be6c017ab76', + iso : 'pa', + name : 'Panama', + code : '+507', + flagImagePos: '-1px -1106px' + }, + { + id : 'b070a014-2ce4-4939-a868-951bd1e70923', + iso : 'pg', + name : 'Papua New Guinea', + code : '+675', + flagImagePos: '-1px -1939px' + }, + { + id : '5e23c743-ce7d-4abc-9dd4-44a700b29090', + iso : 'py', + name : 'Paraguay', + code : '+595', + flagImagePos: '-1px -3231px' + }, + { + id : '1a83f99d-91b3-438d-a576-5bf0f05fdd12', + iso : 'pe', + name : 'Peru', + code : '+51', + flagImagePos: '-1px -1225px' + }, + { + id : '667c9699-46b9-40f9-a41f-2c52826bb3cb', + iso : 'ph', + name : 'Philippines', + code : '+63', + flagImagePos: '-1px -2432px' + }, + { + id : 'b84030ab-3193-4aa2-aef2-d4d21997e536', + iso : 'pl', + name : 'Poland', + code : '+48', + flagImagePos: '-1px -1514px' + }, + { + id : 'e26d0064-6173-42ab-b761-bf8c639199fa', + iso : 'pt', + name : 'Portugal', + code : '+351', + flagImagePos: '-1px -664px' + }, + { + id : '0fd9770d-2a91-4b81-8633-f465bc151e16', + iso : 'pr', + name : 'Puerto Rico', + code : '+1', + flagImagePos: '-1px -596px' + }, + { + id : 'f866eeeb-e64f-4123-ab63-c16e0a00d029', + iso : 'qa', + name : 'Qatar', + code : '+974', + flagImagePos: '-1px -579px' + }, + { + id : 'c3a3fb54-5731-4a28-96bd-4190cfeeaff0', + iso : 're', + name : 'Réunion', + code : '+262', + flagImagePos: '-1px -324px' + }, + { + id : 'a6a48809-7e33-42c8-a25a-56ccdd7ccdfe', + iso : 'ro', + name : 'Romania', + code : '+40', + flagImagePos: '-1px -885px' + }, + { + id : '9556d1e9-3d02-4c5b-a0ce-97a2fd55c74a', + iso : 'ru', + name : 'Russia', + code : '+7', + flagImagePos: '-1px -868px' + }, + { + id : '6f7f0a97-e8b5-455d-bace-6953de7324eb', + iso : 'rw', + name : 'Rwanda', + code : '+250', + flagImagePos: '-1px -3673px' + }, + { + id : 'e251cad5-7655-48f7-9892-6edf04a14fd7', + iso : 'ws', + name : 'Samoa', + code : '+685', + flagImagePos: '-1px -3163px' + }, + { + id : 'f1cfec8c-a960-43b3-8e11-2cad72b4fff8', + iso : 'sm', + name : 'San Marino', + code : '+378', + flagImagePos: '-1px -2908px' + }, + { + id : 'c5301260-13dc-4012-9678-2b57a5e409ae', + iso : 'st', + name : 'São Tomé & Príncipe', + code : '+239', + flagImagePos: '-1px -3299px' + }, + { + id : '02599f80-225a-451b-8c25-03b8993f88ac', + iso : 'sa', + name : 'Saudi Arabia', + code : '+966', + flagImagePos: '-1px -52px' + }, + { + id : 'a54c3469-9668-4063-bfa0-04c450b43d3e', + iso : 'sn', + name : 'Senegal', + code : '+221', + flagImagePos: '-1px -2925px' + }, + { + id : '687ea07b-a7df-4778-b802-b040676fa56c', + iso : 'rs', + name : 'Serbia', + code : '+381', + flagImagePos: '-1px -3401px' + }, + { + id : 'd010fb25-7044-4055-9c60-25bc89d83f64', + iso : 'sc', + name : 'Seychelles', + code : '+248', + flagImagePos: '-1px -1327px' + }, + { + id : '0c46a1e9-fcd8-4e7e-bbb1-ef3bfa83539b', + iso : 'sl', + name : 'Sierra Leone', + code : '+232', + flagImagePos: '-1px -970px' + }, + { + id : 'e724edb6-9df4-42fb-bc1e-417996aa3020', + iso : 'sg', + name : 'Singapore', + code : '+65', + flagImagePos: '-1px -35px' + }, + { + id : '7478814a-dc3f-41ff-9341-da7e07ba8499', + iso : 'sx', + name : 'Sint Maarten', + code : '+1', + flagImagePos: '-1px -3826px' + }, + { + id : 'b1a34e32-38dd-4a38-b63a-7133baf1417a', + iso : 'sk', + name : 'Slovakia', + code : '+421', + flagImagePos: '-1px -3044px' + }, + { + id : '1c1689a5-580b-411f-9283-b1e8333b351e', + iso : 'si', + name : 'Slovenia', + code : '+386', + flagImagePos: '-1px -1582px' + }, + { + id : '4b1c6a42-90b0-49ea-b968-8c95b871f0ec', + iso : 'sb', + name : 'Solomon Islands', + code : '+677', + flagImagePos: '-1px -1361px' + }, + { + id : '7ec9fdff-8ae6-4a14-b55e-6262d46bc3ef', + iso : 'so', + name : 'Somalia', + code : '+252', + flagImagePos: '-1px -1786px' + }, + { + id : '5e62f404-3e2c-4d63-ad7b-ab0755903842', + iso : 'za', + name : 'South Africa', + code : '+27', + flagImagePos: '-1px -3248px' + }, + { + id : '31966c2a-7d24-4ebc-8e02-392e4f04f12b', + iso : 'kr', + name : 'South Korea', + code : '+82', + flagImagePos: '-1px -3078px' + }, + { + id : '1b7ba825-bf7d-42c0-bb73-81f10a4009bf', + iso : 'ss', + name : 'South Sudan', + code : '+211', + flagImagePos: '-1px -3775px' + }, + { + id : '55c4137b-e437-4e80-bc8f-7857cd7c9364', + iso : 'es', + name : 'Spain', + code : '+34', + flagImagePos: '-1px -1480px' + }, + { + id : 'fce4c284-e6a1-4e8c-96ca-6edf09e8a401', + iso : 'lk', + name : 'Sri Lanka', + code : '+94', + flagImagePos: '-1px -3622px' + }, + { + id : '0ae719a5-ae43-45d0-b669-66976a050ef1', + iso : 'bl', + name : 'St. Barthélemy', + code : '+590', + flagImagePos: '-1px -324px' + }, + { + id : 'a588cc85-32a4-45ff-ba69-627105dab27a', + iso : 'sh', + name : 'St. Helena', + code : '+290', + flagImagePos: '-1px -630px' + }, + { + id : 'f065aa7c-8d9e-419c-bbf0-9a97011cf272', + iso : 'kn', + name : 'St. Kitts & Nevis', + code : '+1', + flagImagePos: '-1px -103px' + }, + { + id : '9ea73bcc-2bf5-4ad9-9b39-de33de125f98', + iso : 'lc', + name : 'St. Lucia', + code : '+1', + flagImagePos: '-1px -1837px' + }, + { + id : '86a5a0e8-bfd4-480e-9bc0-7b88b2248a57', + iso : 'mf', + name : 'St. Martin', + code : '+590', + flagImagePos: '-1px -86px' + }, + { + id : '540857ba-923a-4656-a19f-cb3914825ecc', + iso : 'pm', + name : 'St. Pierre & Miquelon', + code : '+508', + flagImagePos: '-1px -1378px' + }, + { + id : 'd381eb44-e77a-4dbd-abbb-224d7158e96d', + iso : 'vc', + name : 'St. Vincent & Grenadines', + code : '+1', + flagImagePos: '-1px -3588px' + }, + { + id : '7015db62-072d-49a2-8320-7587ec8b952f', + iso : 'sd', + name : 'Sudan', + code : '+249', + flagImagePos: '-1px -443px' + }, + { + id : 'd7bbb285-aa4e-4a92-8613-8d2645c351ee', + iso : 'sr', + name : 'Suriname', + code : '+597', + flagImagePos: '-1px -3656px' + }, + { + id : '78978092-7be3-4ec8-b201-068089035cff', + iso : 'se', + name : 'Sweden', + code : '+46', + flagImagePos: '-1px -494px' + }, + { + id : '9f3fbec3-b58a-4b5a-9c4b-3997398c4148', + iso : 'ch', + name : 'Switzerland', + code : '+41', + flagImagePos: '-1px -1718px' + }, + { + id : '7ce0562c-fdc4-444c-bba3-02239c3c17da', + iso : 'sy', + name : 'Syria', + code : '+963', + flagImagePos: '-1px -2449px' + }, + { + id : '2d57a4a1-3f5a-41a2-a320-74a8f0db92e5', + iso : 'tw', + name : 'Taiwan', + code : '+886', + flagImagePos: '-1px -647px' + }, + { + id : 'e1f747c5-4e91-487b-8265-8f70b3430849', + iso : 'tj', + name : 'Tajikistan', + code : '+992', + flagImagePos: '-1px -222px' + }, + { + id : 'f07e257c-e049-4046-b031-f4348fb1734a', + iso : 'tz', + name : 'Tanzania', + code : '+255', + flagImagePos: '-1px -3146px' + }, + { + id : '684a0dde-5b5f-4072-98a4-46fc8de09556', + iso : 'th', + name : 'Thailand', + code : '+66', + flagImagePos: '-1px -1242px' + }, + { + id : '0376e29f-d9dd-4449-aa4e-d47353c16873', + iso : 'tl', + name : 'Timor-Leste', + code : '+670', + flagImagePos: '-1px -3843px' + }, + { + id : 'fd647814-fc64-4724-bba7-4cd4da26c11e', + iso : 'tg', + name : 'Togo', + code : '+228', + flagImagePos: '-1px -783px' + }, + { + id : 'ed271b14-39ee-4403-9be6-b54ac89b0ed3', + iso : 'tk', + name : 'Tokelau', + code : '+690', + flagImagePos: '-1px -3792px' + }, + { + id : 'e2b83ecb-5a79-4ca0-9860-4baeae0380bb', + iso : 'to', + name : 'Tonga', + code : '+676', + flagImagePos: '-1px -1395px' + }, + { + id : '33bca09c-cc33-4680-929b-191ccbbc959a', + iso : 'tt', + name : 'Trinidad & Tobago', + code : '+1', + flagImagePos: '-1px -545px' + }, + { + id : 'ab25c5da-7698-4b96-af34-5d20523915d9', + iso : 'tn', + name : 'Tunisia', + code : '+216', + flagImagePos: '-1px -698px' + }, + { + id : '784ac645-bc50-4b35-b5fb-effd72f99749', + iso : 'tr', + name : 'Turkey', + code : '+90', + flagImagePos: '-1px -2126px' + }, + { + id : '9a3b8bd3-bc73-4251-a068-a4842365e91a', + iso : 'tm', + name : 'Turkmenistan', + code : '+993', + flagImagePos: '-1px -3486px' + }, + { + id : '361bcad4-44d1-41fb-9bbf-39ea0fb87d49', + iso : 'tc', + name : 'Turks & Caicos Islands', + code : '+1', + flagImagePos: '-1px -1701px' + }, + { + id : '26fb1484-c756-4592-8523-99af9c870bb5', + iso : 'tv', + name : 'Tuvalu', + code : '+688', + flagImagePos: '-1px -358px' + }, + { + id : 'cdb8455e-4eda-48f7-b30a-63c20838a364', + iso : 'vi', + name : 'U.S. Virgin Islands', + code : '+1', + flagImagePos: '-1px -2381px' + }, + { + id : 'f47476cc-3da6-4377-83c9-33ab9f5293d1', + iso : 'ug', + name : 'Uganda', + code : '+256', + flagImagePos: '-1px -1497px' + }, + { + id : '5fcb791a-91be-416a-895d-0502fc509838', + iso : 'ua', + name : 'Ukraine', + code : '+380', + flagImagePos: '-1px -2721px' + }, + { + id : '7c8e1ced-0dd7-42b6-880b-19b3486d11e5', + iso : 'ae', + name : 'United Arab Emirates', + code : '+971', + flagImagePos: '-1px -3061px' + }, + { + id : '9f1362e7-e87c-4123-ade8-e5cfa6e99c09', + iso : 'gb', + name : 'United Kingdom', + code : '+44', + flagImagePos: '-1px -86px' + }, + { + id : 'f9033267-9df0-46e4-9f79-c8b022e5c835', + iso : 'us', + name : 'United States', + code : '+1', + flagImagePos: '-1px -69px' + }, + { + id : '2cab7122-ec9a-48ac-8415-392b4f67ae51', + iso : 'uy', + name : 'Uruguay', + code : '+598', + flagImagePos: '-1px -3571px' + }, + { + id : 'f442740c-94c3-4f2f-afb2-c7c279224b5f', + iso : 'uz', + name : 'Uzbekistan', + code : '+998', + flagImagePos: '-1px -1293px' + }, + { + id : 'e6774547-6ab1-41a2-8107-201f913937b2', + iso : 'vu', + name : 'Vanuatu', + code : '+678', + flagImagePos: '-1px -1633px' + }, + { + id : 'd600d6b0-e21f-4b6e-9036-0435a6ac2ea6', + iso : 'va', + name : 'Vatican City', + code : '+39', + flagImagePos: '-1px -3197px' + }, + { + id : 'b8e0072d-498b-4bb4-a5b6-354d4200f882', + iso : 've', + name : 'Venezuela', + code : '+58', + flagImagePos: '-1px -1344px' + }, + { + id : '15dc081a-4690-42e9-a40d-b3bcea3173fc', + iso : 'vn', + name : 'Vietnam', + code : '+84', + flagImagePos: '-1px -1259px' + }, + { + id : '4452a787-5f31-4eb7-b14c-ae3175564ae5', + iso : 'wf', + name : 'Wallis & Futuna', + code : '+681', + flagImagePos: '-1px -324px' + }, + { + id : '237c9f8d-3b6c-4b70-af72-8a58a7154144', + iso : 'ye', + name : 'Yemen', + code : '+967', + flagImagePos: '-1px -2211px' + }, + { + id : '02a76f62-3078-472a-bd42-edb759cf3079', + iso : 'zm', + name : 'Zambia', + code : '+260', + flagImagePos: '-1px -2109px' + }, + { + id : '10e8e117-6832-4d3f-9b05-f66832c2f5ec', + iso : 'zw', + name : 'Zimbabwe', + code : '+263', + flagImagePos: '-1px -2789px' + } +]; +export const tags = [ + { + id : 'c31e9e5d-e0cb-4574-a13f-8a6ee5ff8309', + title: 'Work' + }, + { + id : 'a8991c76-2fda-4bbd-a718-df13d6478847', + title: 'Friend' + }, + { + id : '56ddbd47-4078-4ddd-8448-73c5e88d5f59', + title: 'Family' + }, + { + id : '2026ce08-d08f-4b4f-9506-b10cdb5b104f', + title: 'High School' + }, + { + id : '65930b5a-5d2a-4303-b11f-865d69e6fdb5', + title: 'College' + }, + { + id : '3eaab175-ec0d-4db7-bc3b-efc633c769be', + title: 'Baseball Team' + }, + { + id : 'cbde2486-5033-4e09-838e-e901b108cd41', + title: 'Band' + } +]; diff --git a/src/app/mock-api/apps/ecommerce/inventory/api.ts b/src/app/mock-api/apps/ecommerce/inventory/api.ts new file mode 100644 index 00000000..93303344 --- /dev/null +++ b/src/app/mock-api/apps/ecommerce/inventory/api.ts @@ -0,0 +1,346 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { brands as brandsData, categories as categoriesData, products as productsData, tags as tagsData, vendors as vendorsData } from 'app/mock-api/apps/ecommerce/inventory/data'; + +@Injectable({ + providedIn: 'root' +}) +export class ECommerceInventoryMockApi +{ + private _categories: any[] = categoriesData; + private _brands: any[] = brandsData; + private _products: any[] = productsData; + private _tags: any[] = tagsData; + private _vendors: any[] = vendorsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Categories - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/categories') + .reply(() => [200, cloneDeep(this._categories)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Brands - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/brands') + .reply(() => [200, cloneDeep(this._brands)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Products - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/products', 625) + .reply(({request}) => { + + // Get available queries + const search = request.params.get('search'); + const sort = request.params.get('sort') || 'name'; + const order = request.params.get('order') || 'asc'; + const page = parseInt(request.params.get('page') ?? '1', 10); + const size = parseInt(request.params.get('size') ?? '10', 10); + + // Clone the products + let products: any[] | null = cloneDeep(this._products); + + // Sort the products + if ( sort === 'sku' || sort === 'name' || sort === 'active' ) + { + products.sort((a, b) => { + const fieldA = a[sort].toString().toUpperCase(); + const fieldB = b[sort].toString().toUpperCase(); + return order === 'asc' ? fieldA.localeCompare(fieldB) : fieldB.localeCompare(fieldA); + }); + } + else + { + products.sort((a, b) => order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]); + } + + // If search exists... + if ( search ) + { + // Filter the products + products = products.filter((contact) => { + return contact.name && contact.name.toLowerCase().includes(search.toLowerCase()); + }); + } + + // Paginate - Start + const productsLength = products.length; + + // Calculate pagination details + const begin = page * size; + const end = Math.min((size * (page + 1)), productsLength); + const lastPage = Math.max(Math.ceil(productsLength / size), 1); + + // Prepare the pagination object + let pagination = {}; + + // If the requested page number is bigger than + // the last possible page number, return null for + // products but also send the last possible page so + // the app can navigate to there + if ( page > lastPage ) + { + products = null; + pagination = { + lastPage + }; + } + else + { + // Paginate the results by size + products = products.slice(begin, end); + + // Prepare the pagination mock-api + pagination = { + length : productsLength, + size : size, + page : page, + lastPage : lastPage, + startIndex: begin, + endIndex : end - 1 + }; + } + + // Return the response + return [ + 200, + { + products, + pagination + } + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Product - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/product') + .reply(({request}) => { + + // Get the id from the params + const id = request.params.get('id'); + + // Clone the products + const products = cloneDeep(this._products); + + // Find the product + const product = products.find((item) => { + return item.id === id; + }); + + // Return the response + return [200, product]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Product - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/ecommerce/inventory/product') + .reply(() => { + + // Generate a new product + const newProduct = { + id : FuseMockApiUtils.guid(), + category : '', + name : 'A New Product', + description: '', + tags : [], + sku : '', + barcode : '', + brand : '', + vendor : '', + stock : '', + reserved : '', + cost : '', + basePrice : '', + taxPercent : '', + price : '', + weight : '', + thumbnail : '', + images : [], + active : false + }; + + // Unshift the new product + this._products.unshift(newProduct); + + // Return the response + return [200, newProduct]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Product - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/ecommerce/inventory/product') + .reply(({request}) => { + + // Get the id and product + const id = request.body.id; + const product = cloneDeep(request.body.product); + + // Prepare the updated product + let updatedProduct = null; + + // Find the product and update it + this._products.forEach((item, index, products) => { + + if ( item.id === id ) + { + // Update the product + products[index] = assign({}, products[index], product); + + // Store the updated product + updatedProduct = products[index]; + } + }); + + // Return the response + return [200, updatedProduct]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Product - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/ecommerce/inventory/product') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the product and delete it + this._products.forEach((item, index) => { + + if ( item.id === id ) + { + this._products.splice(index, 1); + } + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/tags') + .reply(() => [200, cloneDeep(this._tags)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/ecommerce/inventory/tag') + .reply(({request}) => { + + // Get the tag + const newTag = cloneDeep(request.body.tag); + + // Generate a new GUID + newTag.id = FuseMockApiUtils.guid(); + + // Unshift the new tag + this._tags.unshift(newTag); + + // Return the response + return [200, newTag]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/ecommerce/inventory/tag') + .reply(({request}) => { + + // Get the id and tag + const id = request.body.id; + const tag = cloneDeep(request.body.tag); + + // Prepare the updated tag + let updatedTag = null; + + // Find the tag and update it + this._tags.forEach((item, index, tags) => { + + if ( item.id === id ) + { + // Update the tag + tags[index] = assign({}, tags[index], tag); + + // Store the updated tag + updatedTag = tags[index]; + } + }); + + // Return the response + return [200, updatedTag]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tag - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/ecommerce/inventory/tag') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the tag and delete it + this._tags.forEach((item, index) => { + + if ( item.id === id ) + { + this._tags.splice(index, 1); + } + }); + + // Get the products that have the tag + const productsWithTag = this._products.filter(product => product.tags.indexOf(id) > -1); + + // Iterate through them and delete the tag + productsWithTag.forEach((product) => { + product.tags.splice(product.tags.indexOf(id), 1); + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Vendors - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/ecommerce/inventory/vendors') + .reply(() => [200, cloneDeep(this._vendors)]); + } +} diff --git a/src/app/mock-api/apps/ecommerce/inventory/data.ts b/src/app/mock-api/apps/ecommerce/inventory/data.ts new file mode 100644 index 00000000..66f0131c --- /dev/null +++ b/src/app/mock-api/apps/ecommerce/inventory/data.ts @@ -0,0 +1,822 @@ +/* tslint:disable:max-line-length */ +export const categories = [ + { + id : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + parentId: null, + name : 'Mens', + slug : 'mens' + }, + { + id : '07986d93-d4eb-4de1-9448-2538407f7254', + parentId: null, + name : 'Ladies', + slug : 'ladies' + }, + { + id : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + parentId: null, + name : 'Unisex', + slug : 'unisex' + } +]; +export const brands = [ + { + id : 'e1789f32-9475-43e7-9256-451d2e3a2282', + name: 'Benton', + slug: 'benton' + }, + { + id : '61d52c2a-8947-4a2c-8c35-f36baef45b96', + name: 'Capmia', + slug: 'capmia' + }, + { + id : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + name: 'Lara', + slug: 'lara' + }, + { + id : '5913ee46-a497-41db-a118-ee506011529f', + name: 'Premera', + slug: 'premera' + }, + { + id : '2c4d98d8-f334-4125-9596-862515f5526b', + name: 'Zeon', + slug: 'zeon' + } +]; +export const tags = [ + { + id : '167190fa-51b4-45fc-a742-8ce1b33d24ea', + title: 'mens' + }, + { + id : '3baea410-a7d6-4916-b79a-bdce50c37f95', + title: 'ladies' + }, + { + id : '8ec8f60d-552f-4216-9f11-462b95b1d306', + title: 'unisex' + }, + { + id : '8837b93f-388b-43cc-851d-4ca8f23f3a61', + title: '44mm' + }, + { + id : '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + title: '40mm' + }, + { + id : '2300ac48-f268-466a-b765-8b878b6e14a7', + title: '5 ATM' + }, + { + id : '0b11b742-3125-4d75-9a6f-84af7fde1969', + title: '10 ATM' + }, + { + id : '0fc39efd-f640-41f8-95a5-3f1d749df200', + title: 'automatic' + }, + { + id : '7d6dd47e-7472-4f8b-93d4-46c114c44533', + title: 'chronograph' + }, + { + id : 'b1286f3a-e2d0-4237-882b-f0efc0819ec3', + title: 'watch' + } +]; +export const vendors = [ + { + id : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + name: 'Evel', + slug: 'evel' + }, + { + id : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + name: 'Mivon', + slug: 'mivon' + }, + { + id : '05ebb527-d733-46a9-acfb-a4e4ec960024', + name: 'Neogen', + slug: 'neogen' + } +]; +export const products = [ + { + id : '7eb7c859-1347-4317-96b6-9476a7e2ba3c', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Capmia Mens Chronograph Watch 44mm 5 ATM', + description: 'Consequat esse in culpa commodo anim. Et ullamco anim amet est. Sunt dolore ex occaecat officia anim. In sit minim laborum nostrud. Consequat ex do velit voluptate do exercitation est adipisicing quis velit.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ETV-2425', + barcode : '8346201275534', + brand : '61d52c2a-8947-4a2c-8c35-f36baef45b96', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 30, + reserved : 5, + cost : 450.18, + basePrice : 1036, + taxPercent : 30, + price : 1346.8, + weight : 0.61, + thumbnail : 'assets/images/apps/ecommerce/products/watch-01-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-01-01.jpg', + 'assets/images/apps/ecommerce/products/watch-01-02.jpg', + 'assets/images/apps/ecommerce/products/watch-01-03.jpg' + ], + active : true + }, + { + id : '00b0292f-3d50-4669-a0c4-7a9d85efc98d', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Zeon Ladies Chronograph Watch 40mm 10 ATM', + description: 'Nulla duis dolor fugiat culpa proident. Duis anim est excepteur occaecat adipisicing occaecat. Labore id laborum non elit proident est veniam officia eu. Labore aliqua nisi duis sint ex consequat nostrud excepteur duis ex incididunt adipisicing.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATH-7573', + barcode : '8278968055700', + brand : '2c4d98d8-f334-4125-9596-862515f5526b', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 37, + reserved : 2, + cost : 723.55, + basePrice : 1686, + taxPercent : 30, + price : 2191.8, + weight : 0.79, + thumbnail : 'assets/images/apps/ecommerce/products/watch-02-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-02-01.jpg', + 'assets/images/apps/ecommerce/products/watch-02-02.jpg', + 'assets/images/apps/ecommerce/products/watch-02-03.jpg' + ], + active : true + }, + { + id : '3f34e2fb-95bf-4f61-be28-956d2c7e4eb2', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Benton Mens Automatic Watch 44mm 5 ATM', + description: 'Velit irure deserunt aliqua officia. Eiusmod quis sunt magna laboris aliquip non dolor consequat cupidatat dolore esse. Consectetur mollit officia laborum fugiat nulla duis ad excepteur do aliqua fugiat. Fugiat non laboris exercitation ipsum in incididunt.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADH-1921', + barcode : '8808746892183', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 30, + reserved : 3, + cost : 390.63, + basePrice : 950, + taxPercent : 10, + price : 1045, + weight : 0.76, + thumbnail : null, + images : [ + 'assets/images/apps/ecommerce/products/watch-03-01.jpg', + 'assets/images/apps/ecommerce/products/watch-03-02.jpg', + 'assets/images/apps/ecommerce/products/watch-03-03.jpg' + ], + active : false + }, + { + id : '8fcce528-d878-4cc8-99f7-bd3451ed5405', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Capmia Mens Chronograph Watch 44mm 10 ATM', + description: 'Velit nisi proident cupidatat exercitation occaecat et adipisicing nostrud id ex nostrud sint. Qui fugiat velit minim amet reprehenderit voluptate velit exercitation proident Lorem nisi culpa. Commodo quis officia officia eiusmod mollit aute fugiat duis quis minim culpa in. Exercitation laborum fugiat ex excepteur officia reprehenderit magna ipsum. Laboris dolore nostrud id labore sint consectetur aliqua tempor ea aute do.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'EAP-7752', + barcode : '8866355574164', + brand : '61d52c2a-8947-4a2c-8c35-f36baef45b96', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 37, + reserved : 4, + cost : 395.37, + basePrice : 839, + taxPercent : 30, + price : 1090.7, + weight : 0.62, + thumbnail : 'assets/images/apps/ecommerce/products/watch-04-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-04-01.jpg', + 'assets/images/apps/ecommerce/products/watch-04-02.jpg', + 'assets/images/apps/ecommerce/products/watch-04-03.jpg' + ], + active : true + }, + { + id : '91d96e18-d3f5-4c32-a8bf-1fc525cb92c0', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Benton Ladies Automatic Watch 40mm 5 ATM', + description: 'Pariatur proident labore commodo consequat qui et. Ad labore fugiat consectetur ea magna dolore mollit consequat reprehenderit laborum ad mollit eiusmod. Esse laboris voluptate ullamco occaecat labore esse laboris enim ipsum aliquip ipsum. Ea ea proident eu enim anim mollit non consequat enim nulla.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADP-5745', + barcode : '8390590339828', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 12, + reserved : 3, + cost : 442.61, + basePrice : 961, + taxPercent : 20, + price : 1153.2, + weight : 0.67, + thumbnail : 'assets/images/apps/ecommerce/products/watch-05-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-05-01.jpg', + 'assets/images/apps/ecommerce/products/watch-05-02.jpg', + 'assets/images/apps/ecommerce/products/watch-05-03.jpg' + ], + active : false + }, + { + id : 'd7a47d7c-4cdf-4319-bbaa-37ade38c622c', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Benton Mens Chronograph Watch 44mm 10 ATM', + description: 'Nulla enim reprehenderit proident ut Lorem laborum cillum eiusmod est ex anim. Nisi non non laboris excepteur ullamco elit do duis anim esse labore aliqua adipisicing velit. Deserunt magna exercitation cillum amet.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATV-2569', + barcode : '8238990048137', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 36, + reserved : 2, + cost : 563.43, + basePrice : 1370, + taxPercent : 30, + price : 1781, + weight : 0.62, + thumbnail : 'assets/images/apps/ecommerce/products/watch-06-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-06-01.jpg', + 'assets/images/apps/ecommerce/products/watch-06-02.jpg', + 'assets/images/apps/ecommerce/products/watch-06-03.jpg' + ], + active : true + }, + { + id : 'ecf0b3df-38c3-45dc-972b-c509a3dc053e', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Benton Mens Chronograph Watch 44mm 10 ATM', + description: 'Esse culpa ut ullamco dolore quis adipisicing. Minim veniam quis magna officia non. In pariatur nostrud nisi eiusmod minim anim id. Commodo ex incididunt dolor ad id aliqua incididunt minim in Lorem reprehenderit. Commodo ullamco consectetur aliqua Lorem cupidatat esse veniam consectetur sint veniam duis commodo.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'EAH-2563', + barcode : '8638426908385', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 35, + reserved : 5, + cost : 705.26, + basePrice : 1721, + taxPercent : 20, + price : 2065.2, + weight : 0.67, + thumbnail : 'assets/images/apps/ecommerce/products/watch-07-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-07-01.jpg', + 'assets/images/apps/ecommerce/products/watch-07-02.jpg', + 'assets/images/apps/ecommerce/products/watch-07-03.jpg' + ], + active : false + }, + { + id : '5765080a-aaee-40b9-86be-c18b9d79c73c', + category : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + name : 'Benton Unisex Automatic Watch 40mm 10 ATM', + description: 'Anim duis nisi ut ex amet reprehenderit cillum consequat pariatur ipsum elit voluptate excepteur non. Anim enim proident laboris pariatur mollit quis incididunt labore. Incididunt tempor aliquip ex labore ad consequat cillum est sunt anim dolor. Dolore adipisicing non nulla cillum Lorem deserunt. Nostrud incididunt amet sint velit.', + tags : [ + '8ec8f60d-552f-4216-9f11-462b95b1d306', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATH-6399', + barcode : '8881883828441', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 17, + reserved : 5, + cost : 624.12, + basePrice : 1448, + taxPercent : 10, + price : 1592.8, + weight : 0.55, + thumbnail : 'assets/images/apps/ecommerce/products/watch-08-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-08-01.jpg', + 'assets/images/apps/ecommerce/products/watch-08-02.jpg', + 'assets/images/apps/ecommerce/products/watch-08-03.jpg' + ], + active : false + }, + { + id : '6e71be88-b225-474c-91e5-111ced7d6220', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Premera Ladies Chronograph Watch 40mm 5 ATM', + description: 'Velit fugiat adipisicing ut quis anim deserunt ex culpa nostrud laborum. Consectetur duis velit esse commodo voluptate magna dolor in enim exercitation. Ea aliquip cupidatat aute dolor tempor magna id laboris nulla eiusmod ut amet. Veniam irure ex incididunt officia commodo eiusmod nostrud ad consequat commodo ad voluptate.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ELH-2495', + barcode : '8268777127281', + brand : '5913ee46-a497-41db-a118-ee506011529f', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 49, + reserved : 5, + cost : 738.91, + basePrice : 1848, + taxPercent : 30, + price : 2402.4, + weight : 0.54, + thumbnail : 'assets/images/apps/ecommerce/products/watch-09-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-09-01.jpg', + 'assets/images/apps/ecommerce/products/watch-09-02.jpg', + 'assets/images/apps/ecommerce/products/watch-09-03.jpg' + ], + active : false + }, + { + id : '51242500-6983-4a78-bff3-d278eb4e3a57', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Lara Mens Automatic Watch 44mm 10 ATM', + description: 'Enim laboris ut non elit dolore est consectetur. Duis irure minim elit velit anim incididunt minim ipsum ullamco ad dolore sunt. Proident aute proident velit elit ex reprehenderit ut. Lorem laborum excepteur elit proident sunt ipsum incididunt id do. Occaecat proident proident qui aute officia cupidatat aliqua aliqua nostrud proident laboris est ad qui. Magna eiusmod amet ut pariatur esse nisi aliquip deserunt minim ad et ea occaecat. Sunt enim cupidatat id eiusmod ea aute quis excepteur irure commodo dolore excepteur.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATT-6019', + barcode : '8452763551765', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 24, + reserved : 4, + cost : 688.89, + basePrice : 1502, + taxPercent : 8, + price : 1622.16, + weight : 0.76, + thumbnail : 'assets/images/apps/ecommerce/products/watch-10-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-10-01.jpg', + 'assets/images/apps/ecommerce/products/watch-10-02.jpg', + 'assets/images/apps/ecommerce/products/watch-10-03.jpg' + ], + active : true + }, + { + id : '844a4395-233f-4ffb-85bd-7baa0e490a88', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Lara Mens Chronograph Watch 44mm 5 ATM', + description: 'Labore irure qui sunt consectetur. Elit nulla id cillum duis. Nulla nulla eu occaecat eiusmod duis irure id do esse. Ad eu incididunt voluptate amet nostrud ullamco mollit dolore occaecat cupidatat nisi reprehenderit. Proident fugiat laborum sit velit ea voluptate.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADH-2335', + barcode : '8385907318041', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 44, + reserved : 3, + cost : 708.41, + basePrice : 1467, + taxPercent : 18, + price : 1731.06, + weight : 0.7, + thumbnail : 'assets/images/apps/ecommerce/products/watch-11-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-11-01.jpg', + 'assets/images/apps/ecommerce/products/watch-11-02.jpg', + 'assets/images/apps/ecommerce/products/watch-11-03.jpg' + ], + active : false + }, + { + id : '7520f1b6-3c45-46ef-a4d5-881971212d1e', + category : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + name : 'Benton Unisex Automatic Watch 40mm 10 ATM', + description: 'Esse nisi amet occaecat culpa aliqua est ad ea velit. Consectetur in voluptate sit pariatur eiusmod exercitation eu aute occaecat in duis. Voluptate consectetur eu commodo proident id sunt labore irure.', + tags : [ + '8ec8f60d-552f-4216-9f11-462b95b1d306', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATH-3064', + barcode : '8608510561856', + brand : 'e1789f32-9475-43e7-9256-451d2e3a2282', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 25, + reserved : 2, + cost : 731.94, + basePrice : 1743, + taxPercent : 10, + price : 1917.3, + weight : 0.47, + thumbnail : 'assets/images/apps/ecommerce/products/watch-12-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-12-01.jpg', + 'assets/images/apps/ecommerce/products/watch-12-02.jpg', + 'assets/images/apps/ecommerce/products/watch-12-03.jpg' + ], + active : false + }, + { + id : '683e41d8-6ebc-4e6a-a7c1-9189ca52ef19', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Zeon Mens Chronograph Watch 44mm 10 ATM', + description: 'Eu irure do cupidatat esse in. Aliqua laborum deserunt qui Lorem deserunt minim fugiat deserunt voluptate minim. Anim nulla tempor eiusmod ad exercitation reprehenderit officia. Nisi proident labore eu anim excepteur aliqua occaecat. Laboris nostrud ipsum commodo cupidatat.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADV-3188', + barcode : '8334758988643', + brand : '2c4d98d8-f334-4125-9596-862515f5526b', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 14, + reserved : 5, + cost : 375.76, + basePrice : 786, + taxPercent : 30, + price : 1021.8, + weight : 0.53, + thumbnail : 'assets/images/apps/ecommerce/products/watch-13-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-13-01.jpg', + 'assets/images/apps/ecommerce/products/watch-13-02.jpg', + 'assets/images/apps/ecommerce/products/watch-13-03.jpg' + ], + active : false + }, + { + id : 'd4e52238-292d-462b-b9bb-1751030132e2', + category : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + name : 'Lara Unisex Chronograph Watch 40mm 5 ATM', + description: 'Nulla nostrud aliquip consequat laborum ut enim exercitation. Aute dolor duis aliquip consequat minim officia. Nisi labore et magna et sunt consectetur id anim pariatur officia et esse ut. Ullamco dolor cillum consequat velit eiusmod consectetur. Ullamco reprehenderit tempor minim dolore officia do nisi cupidatat adipisicing fugiat velit.', + tags : [ + '8ec8f60d-552f-4216-9f11-462b95b1d306', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATT-7423', + barcode : '8417153336369', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 33, + reserved : 2, + cost : 743.93, + basePrice : 1793, + taxPercent : 8, + price : 1936.44, + weight : 0.86, + thumbnail : 'assets/images/apps/ecommerce/products/watch-14-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-14-01.jpg', + 'assets/images/apps/ecommerce/products/watch-14-02.jpg', + 'assets/images/apps/ecommerce/products/watch-14-03.jpg' + ], + active : false + }, + { + id : '98861dfc-0d21-4fd5-81aa-49785d003d95', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Premera Mens Automatic Watch 44mm 10 ATM', + description: 'Veniam sint aliquip aliquip aliquip amet Lorem irure proident laborum et eiusmod aliqua. Aliquip deserunt voluptate magna ut quis magna dolor in dolore. Commodo adipisicing excepteur occaecat aute nisi in. Est aute ad ut incididunt anim ea commodo. Sunt excepteur duis sunt est laborum magna Lorem ullamco exercitation dolore irure.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'AAT-6453', + barcode : '8501386761670', + brand : '5913ee46-a497-41db-a118-ee506011529f', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 38, + reserved : 3, + cost : 364.64, + basePrice : 806, + taxPercent : 18, + price : 951.08, + weight : 0.59, + thumbnail : 'assets/images/apps/ecommerce/products/watch-15-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-15-01.jpg', + 'assets/images/apps/ecommerce/products/watch-15-02.jpg', + 'assets/images/apps/ecommerce/products/watch-15-03.jpg' + ], + active : false + }, + { + id : 'a71f9b10-e884-4aad-9810-29fe10ce6d42', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Lara Ladies Chronograph Watch 40mm 5 ATM', + description: 'Deserunt non deserunt ut do labore cupidatat duis veniam in non adipisicing officia esse id. Adipisicing Lorem sint excepteur culpa labore consequat incididunt nulla minim amet. Sint do et fugiat laborum exercitation reprehenderit ut non nostrud occaecat nisi et qui dolore. Amet eiusmod nulla est officia ad magna cillum non dolor ullamco officia incididunt.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'AAP-4902', + barcode : '8847387136582', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 40, + reserved : 3, + cost : 525.3, + basePrice : 1303, + taxPercent : 10, + price : 1433.3, + weight : 0.69, + thumbnail : 'assets/images/apps/ecommerce/products/watch-16-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-16-01.jpg', + 'assets/images/apps/ecommerce/products/watch-16-02.jpg', + 'assets/images/apps/ecommerce/products/watch-16-03.jpg' + ], + active : false + }, + { + id : '149e6db5-4ecc-4021-bc56-08b27514a746', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Lara Ladies Chronograph Watch 40mm 5 ATM', + description: 'Occaecat proident fugiat consectetur ullamco est. Duis non minim eiusmod magna dolor reprehenderit ad deserunt et qui amet. Tempor cillum dolore veniam Lorem sit ad pariatur et sint. Sunt anim et cupidatat Lorem proident fugiat incididunt incididunt minim non sint. Eiusmod quis et ullamco cillum et veniam do tempor officia sint.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '2300ac48-f268-466a-b765-8b878b6e14a7', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ALV-194', + barcode : '8860845382207', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 20, + reserved : 2, + cost : 670.87, + basePrice : 1537, + taxPercent : 8, + price : 1659.96, + weight : 0.66, + thumbnail : 'assets/images/apps/ecommerce/products/watch-17-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-17-01.jpg', + 'assets/images/apps/ecommerce/products/watch-17-02.jpg', + 'assets/images/apps/ecommerce/products/watch-17-03.jpg' + ], + active : false + }, + { + id : '655287de-2e24-41f3-a82f-8b08548ecc39', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Zeon Mens Automatic Watch 44mm 10 ATM', + description: 'Eiusmod magna tempor est est quis eu. Minim irure magna anim mollit non adipisicing aute. Nostrud aute consectetur eu in non laboris excepteur esse esse occaecat officia.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADH-5492', + barcode : '8611606513571', + brand : '2c4d98d8-f334-4125-9596-862515f5526b', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 47, + reserved : 2, + cost : 645.13, + basePrice : 1581, + taxPercent : 10, + price : 1739.1, + weight : 0.54, + thumbnail : 'assets/images/apps/ecommerce/products/watch-18-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-18-01.jpg', + 'assets/images/apps/ecommerce/products/watch-18-02.jpg', + 'assets/images/apps/ecommerce/products/watch-18-03.jpg' + ], + active : true + }, + { + id : 'c215b427-d840-4537-aea1-a9bdfa49441b', + category : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + name : 'Lara Unisex Automatic Watch 40mm 10 ATM', + description: 'Excepteur enim non qui consequat sunt exercitation laborum ipsum sunt. Sunt pariatur fugiat voluptate ipsum consectetur do magna culpa labore. Cupidatat non ex labore incididunt aliquip commodo est in. Consectetur mollit nisi aliquip cupidatat do laborum est ullamco velit aliqua fugiat qui adipisicing. Aute reprehenderit quis id sint nulla.', + tags : [ + '8ec8f60d-552f-4216-9f11-462b95b1d306', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'AAT-6702', + barcode : '8330223562386', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 21, + reserved : 3, + cost : 704.26, + basePrice : 1733, + taxPercent : 10, + price : 1906.3, + weight : 0.84, + thumbnail : 'assets/images/apps/ecommerce/products/watch-19-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-19-01.jpg', + 'assets/images/apps/ecommerce/products/watch-19-02.jpg', + 'assets/images/apps/ecommerce/products/watch-19-03.jpg' + ], + active : true + }, + { + id : '8b1d9366-891e-49cd-aafb-ac65ce2741e2', + category : '07986d93-d4eb-4de1-9448-2538407f7254', + name : 'Zeon Ladies Automatic Watch 40mm 10 ATM', + description: 'Reprehenderit magna reprehenderit ex mollit Lorem labore ut. Duis consectetur aliqua cillum occaecat quis ex excepteur fugiat nulla nisi dolor minim. Elit voluptate exercitation nulla et ut adipisicing esse eu nisi amet eu. Ut cillum ipsum quis fugiat proident Lorem est aute ipsum sint dolore consequat.', + tags : [ + '3baea410-a7d6-4916-b79a-bdce50c37f95', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'EDH-5599', + barcode : '8309212335274', + brand : '2c4d98d8-f334-4125-9596-862515f5526b', + vendor : '05ebb527-d733-46a9-acfb-a4e4ec960024', + stock : 35, + reserved : 2, + cost : 712.66, + basePrice : 1711, + taxPercent : 30, + price : 2224.3, + weight : 0.47, + thumbnail : 'assets/images/apps/ecommerce/products/watch-20-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-20-01.jpg', + 'assets/images/apps/ecommerce/products/watch-20-02.jpg', + 'assets/images/apps/ecommerce/products/watch-20-03.jpg' + ], + active : false + }, + { + id : '54e29534-518b-4006-b72a-f21fac6c4d5e', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Lara Mens Chronograph Watch 44mm 10 ATM', + description: 'Officia eu magna eu amet fugiat qui ullamco eu. Occaecat dolore minim ad tempor consequat adipisicing non Lorem consequat. In nostrud incididunt adipisicing in. Irure occaecat aliquip deserunt minim officia ad excepteur do commodo magna.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ADP-3719', + barcode : '8879167838673', + brand : 'f9987124-7ada-4b93-bef7-35280b3ddbd7', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 28, + reserved : 3, + cost : 374.38, + basePrice : 749, + taxPercent : 8, + price : 808.92, + weight : 0.52, + thumbnail : 'assets/images/apps/ecommerce/products/watch-21-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-21-01.jpg', + 'assets/images/apps/ecommerce/products/watch-21-02.jpg', + 'assets/images/apps/ecommerce/products/watch-21-03.jpg' + ], + active : false + }, + { + id : '6a5726e8-c467-45ea-92ab-d83235a06405', + category : 'b899ec30-b85a-40ab-bb1f-18a596d5c6de', + name : 'Premera Mens Chronograph Watch 44mm 10 ATM', + description: 'Duis id consequat ex officia nisi. Et reprehenderit tempor sunt nostrud. Duis dolore tempor anim non duis qui aute magna officia. Ullamco proident esse enim amet nostrud occaecat veniam. Nostrud ea eiusmod laborum id laborum veniam nulla. Voluptate proident ullamco exercitation id consequat dolore id pariatur esse nulla consectetur.', + tags : [ + '167190fa-51b4-45fc-a742-8ce1b33d24ea', + '7d6dd47e-7472-4f8b-93d4-46c114c44533', + '8837b93f-388b-43cc-851d-4ca8f23f3a61', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'ATH-3399', + barcode : '8356410903599', + brand : '5913ee46-a497-41db-a118-ee506011529f', + vendor : '987dd10a-43b1-49f9-bfd9-05bb2dbc7029', + stock : 20, + reserved : 2, + cost : 444.68, + basePrice : 1103, + taxPercent : 18, + price : 1301.54, + weight : 0.56, + thumbnail : 'assets/images/apps/ecommerce/products/watch-22-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-22-01.jpg', + 'assets/images/apps/ecommerce/products/watch-22-02.jpg', + 'assets/images/apps/ecommerce/products/watch-22-03.jpg' + ], + active : false + }, + { + id : 'd7d1d6df-e91f-4c53-982a-2720bc2b4cdd', + category : 'ad12aa94-3863-47f8-acab-a638ef02a3e9', + name : 'Capmia Unisex Automatic Watch 40mm 10 ATM', + description: 'Voluptate consectetur nisi aliquip cupidatat sunt labore. Adipisicing voluptate tempor sunt eu irure cupidatat laboris. Enim aliquip aute sit non laborum Lorem in enim duis eu deserunt. Laboris magna irure aute ut proident fugiat laborum aliquip tempor nostrud id. Et esse cupidatat sunt ullamco reprehenderit enim dolore ea in do esse esse id.', + tags : [ + '8ec8f60d-552f-4216-9f11-462b95b1d306', + '0fc39efd-f640-41f8-95a5-3f1d749df200', + '8f868ddb-d4a2-461d-bc3b-d7c8668687c3', + '0b11b742-3125-4d75-9a6f-84af7fde1969', + 'b1286f3a-e2d0-4237-882b-f0efc0819ec3' + ], + sku : 'EAV-4030', + barcode : '8545771786193', + brand : '61d52c2a-8947-4a2c-8c35-f36baef45b96', + vendor : '998b0c07-abfd-4ba3-8de1-7563ef3c4d57', + stock : 23, + reserved : 3, + cost : 538.72, + basePrice : 1213, + taxPercent : 10, + price : 1334.3, + weight : 0.75, + thumbnail : 'assets/images/apps/ecommerce/products/watch-23-thumb.jpg', + images : [ + 'assets/images/apps/ecommerce/products/watch-23-01.jpg', + 'assets/images/apps/ecommerce/products/watch-23-02.jpg', + 'assets/images/apps/ecommerce/products/watch-23-03.jpg' + ], + active : true + } +]; diff --git a/src/app/mock-api/apps/file-manager/api.ts b/src/app/mock-api/apps/file-manager/api.ts new file mode 100644 index 00000000..a1c6cc9d --- /dev/null +++ b/src/app/mock-api/apps/file-manager/api.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service'; +import { items as itemsData } from 'app/mock-api/apps/file-manager/data'; + +@Injectable({ + providedIn: 'root' +}) +export class FileManagerMockApi +{ + private _items: any[] = itemsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Items - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/file-manager') + .reply(() => { + + // Clone the items + const items = cloneDeep(this._items); + + // Separate the items by folders and files + const folders = items.filter((item) => item.type === 'folder'); + const files = items.filter((item) => item.type !== 'folder'); + + // Sort the folders and files alphabetically by filename + folders.sort((a, b) => a.name.localeCompare(b.name)); + files.sort((a, b) => a.name.localeCompare(b.name)); + + return [ + 200, + { + folders, + files + } + ]; + }); + } +} diff --git a/src/app/mock-api/apps/file-manager/data.ts b/src/app/mock-api/apps/file-manager/data.ts new file mode 100644 index 00000000..40b28532 --- /dev/null +++ b/src/app/mock-api/apps/file-manager/data.ts @@ -0,0 +1,179 @@ +/* tslint:disable:max-line-length */ +export const items = [ + { + id : 'cd6897cb-acfd-4016-8b53-3f66a5b5fc68', + name : 'Personal', + createdBy : 'Brian Hughes', + createdAt : 'April 24, 2018', + modifiedAt : 'April 24, 2018', + size : '87 MB', + type : 'folder', + contents : '57 files', + description: 'Personal documents such as insurance policies, tax papers and etc.' + }, + { + id : '6da8747f-b474-4c9a-9eba-5ef212285500', + name : 'Photos', + createdBy : 'Brian Hughes', + createdAt : 'November 01, 2021', + modifiedAt : 'November 01, 2021', + size : '3015 MB', + type : 'folder', + contents : '907 files', + description: 'Personal photos; selfies, family, vacation and etc.' + }, + { + id : 'ed58add1-45a7-41db-887d-3ca7ee7f2719', + name : 'Work', + createdBy : 'Brian Hughes', + createdAt : 'May 8, 2020', + modifiedAt : 'May 8, 2020', + size : '14 MB', + type : 'folder', + contents : '24 files', + description: 'Work related files, mainly documents and paychecks.' + }, + { + id : '5cb66e32-d1ac-4b9a-8c34-5991ce25add2', + name : 'Contract #123', + createdBy : 'Brian Hughes', + createdAt : 'January 14, 2021', + modifiedAt : 'January 14, 2021', + size : '1.2 MB', + type : 'PDF', + contents : null, + description: null + }, + { + id : '3ffc3d84-8f2d-4929-903a-ef6fc21657a7', + name : 'Estimated budget', + createdBy : 'Brian Hughes', + createdAt : 'December 14, 2020', + modifiedAt : 'December 14, 2020', + size : '679 KB', + type : 'XLS', + contents : null, + description: null + }, + { + id : '157adb9a-14f8-4559-ac93-8be893c9f80a', + name : 'DMCA notice #42', + createdBy : 'Brian Hughes', + createdAt : 'May 8, 2021', + modifiedAt : 'May 8, 2021', + size : '1.5 MB', + type : 'DOC', + contents : null, + description: null + }, + { + id : '4f64597a-df7e-461c-ad60-f33e5f7e0747', + name : 'Invoices', + createdBy : 'Brian Hughes', + createdAt : 'January 12, 2020', + modifiedAt : 'January 12, 2020', + size : '17.8 MB', + type : 'PDF', + contents : null, + description: null + }, + { + id : 'e445c445-57b2-4476-8c62-b068e3774b8e', + name : 'Crash logs', + createdBy : 'Brian Hughes', + createdAt : 'June 8, 2020', + modifiedAt : 'June 8, 2020', + size : '11.3 MB', + type : 'TXT', + contents : null, + description: null + }, + { + id : 'b482f93e-7847-4614-ad48-b78b78309f81', + name : 'System logs', + createdBy : 'Brian Hughes', + createdAt : 'June 8, 2020', + modifiedAt : 'June 8, 2020', + size : '9.3 MB', + type : 'TXT', + contents : null, + description: null + }, + { + id : 'ec07a98d-2e5b-422c-a9b2-b5d1c0e263f5', + name : 'Personal projects', + createdBy : 'Brian Hughes', + createdAt : 'March 18, 2020', + modifiedAt : 'March 18, 2020', + size : '4.3 MB', + type : 'DOC', + contents : null, + description: null + }, + { + id : 'ae908d59-07da-4dd8-aba0-124e50289295', + name : 'Biometric portrait', + createdBy : 'Brian Hughes', + createdAt : 'August 29, 2020', + modifiedAt : 'August 29, 2020', + size : '4.5 MB', + type : 'JPG', + contents : null, + description: null + }, + { + id : '4038a5b6-5b1a-432d-907c-e037aeb817a8', + name : 'Scanned image 20201012-1', + createdBy : 'Brian Hughes', + createdAt : 'September 13, 2020', + modifiedAt : 'September 13, 2020', + size : '7.8 MB', + type : 'JPG', + contents : null, + description: null + }, + { + id : '630d2e9a-d110-47a0-ac03-256073a0f56d', + name : 'Scanned image 20201012-2', + createdBy : 'Brian Hughes', + createdAt : 'September 14, 2020', + modifiedAt : 'September 14, 2020', + size : '7.4 MB', + type : 'JPG', + contents : null, + description: null + }, + { + id : '1417d5ed-b616-4cff-bfab-286677b69d79', + name : 'Prices', + createdBy : 'Brian Hughes', + createdAt : 'April 07, 2020', + modifiedAt : 'April 07, 2020', + size : '2.6 MB', + type : 'DOC', + contents : null, + description: null + }, + { + id : 'bd2817c7-6751-40dc-b252-b6b5634c0689', + name : 'Shopping list', + createdBy : 'Brian Hughes', + createdAt : 'March 26, 2021', + modifiedAt : 'March 26, 2021', + size : '2.1 MB', + type : 'DOC', + contents : null, + description: null + }, + { + id : '14fb47c9-6eeb-4070-919c-07c8133285d1', + name : 'Summer budget', + createdBy : 'Brian Hughes', + createdAt : 'June 02, 2020', + modifiedAt : 'June 02, 2020', + size : '943 KB', + type : 'XLS', + contents : null, + description: null + }, +]; diff --git a/src/app/mock-api/apps/help-center/api.ts b/src/app/mock-api/apps/help-center/api.ts new file mode 100644 index 00000000..f51c4d5c --- /dev/null +++ b/src/app/mock-api/apps/help-center/api.ts @@ -0,0 +1,173 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { faqCategories as faqCategoriesData, faqs as faqsData, guideCategories as guideCategoriesData, guideContent as guideContentData, guides as guidesData } from 'app/mock-api/apps/help-center/data'; + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterMockApi +{ + private _faqCategories: any[] = faqCategoriesData; + private _faqs: any[] = faqsData; + private _guideCategories: any[] = guideCategoriesData; + private _guides: any[] = guidesData; + private _guideContent: string = guideContentData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ FAQs - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/help-center/faqs') + .reply(({request}) => { + + // Get the category slug + const slug = request.params.get('slug'); + + // Prepare the results + const results = []; + + // Get FAQs + const faqs = cloneDeep(this._faqs); + + // Get FAQ Categories + const categories = cloneDeep(this._faqCategories); + + // If slug is not provided... + if ( !slug ) + { + // Go through each category and set the results + categories.forEach((category) => { + + results.push( + { + ...category, + faqs: faqs.filter(faq => faq.categoryId === category.id) + } + ); + }); + } + // Otherwise... + else + { + // Find the category by the slug + const category = categories.find(item => item.slug === slug); + + // Set the results + results.push( + { + ...category, + faqs: faqs.filter(faq => faq.categoryId === category.id) + } + ); + } + + // Return the response + return [200, results]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Guides - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/help-center/guides') + .reply(({request}) => { + + // Get the slug & limit + const slug = request.params.get('slug'); + const limit = request.params.get('limit'); + + // Prepare the results + const results = []; + + // Get all Guides + const guides = cloneDeep(this._guides); + + // Get Guide categories + const categories = cloneDeep(this._guideCategories); + + // If slug is not provided... + if ( !slug ) + { + // Parse the limit as an integer + const limitNum = parseInt(limit ?? '5', 10); + + // Go through each category and set the results + categories.forEach((category) => { + + results.push( + { + ...category, + visibleGuides: limitNum, + totalGuides : guides.filter(guide => guide.categoryId === category.id).length, + guides : guides.filter(guide => guide.categoryId === category.id).slice(0, limitNum) + } + ); + }); + } + // Otherwise... + else + { + // Find the category by the slug + const category = categories.find(item => item.slug === slug); + + // Set the results + results.push( + { + ...category, + guides: guides.filter(guide => guide.categoryId === category.id) + } + ); + } + + // Return the response + return [200, results]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Guide - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/help-center/guide') + .reply(({request}) => { + + // Get the slugs + const categorySlug = request.params.get('categorySlug'); + const guideSlug = request.params.get('guideSlug'); + + // Get all Guides and Guide Categories + const guides = cloneDeep(this._guides); + const categories = cloneDeep(this._guideCategories); + + // Prepare the result + const result = { + ...categories.find(category => category.slug === categorySlug), + guides: [guides.find(guide => guide.slug === guideSlug)] + }; + + // Add the content to the guide + result.guides[0]['content'] = this._guideContent; + + // Return the response + return [200, result]; + }); + } +} diff --git a/src/app/mock-api/apps/help-center/data.ts b/src/app/mock-api/apps/help-center/data.ts new file mode 100644 index 00000000..4d3dff5b --- /dev/null +++ b/src/app/mock-api/apps/help-center/data.ts @@ -0,0 +1,507 @@ +/* tslint:disable:max-line-length */ +export const faqCategories = [ + { + id : '28924eab-97cc-465a-ba21-f232bb95843f', + slug : 'most-asked', + title: 'Most asked' + }, + { + id : '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + slug : 'general-inquiries', + title: 'General inquiries' + }, + { + id : 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + slug : 'licenses', + title: 'Licenses' + }, + { + id : '71c34043-d89d-4aca-951d-8606c3943c43', + slug : 'payments', + title: 'Payments' + }, + { + id : 'bea49ee0-26da-46ad-97be-116cd7ab416d', + slug : 'support', + title: 'Support' + } +]; +export const faqs = [ + // Most asked + { + id : 'f65d517a-6f69-4c88-81f5-416f47405ce1', + categoryId: '28924eab-97cc-465a-ba21-f232bb95843f', + question : 'Is there a 14-days trial?', + answer : 'Magna consectetur culpa duis ad est tempor pariatur velit ullamco aute exercitation magna sunt commodo minim enim aliquip eiusmod ipsum adipisicing magna ipsum reprehenderit lorem magna voluptate magna aliqua culpa.\n\nSit nisi adipisicing pariatur enim enim sunt officia ad labore voluptate magna proident velit excepteur pariatur cillum sit excepteur elit veniam excepteur minim nisi cupidatat proident dolore irure veniam mollit.' + }, + { + id : '0fcece82-1691-4b98-a9b9-b63218f9deef', + categoryId: '28924eab-97cc-465a-ba21-f232bb95843f', + question : 'What’s the benefits of the Premium Membership?', + answer : 'Et in lorem qui ipsum deserunt duis exercitation lorem elit qui qui ipsum tempor nulla velit aliquip enim consequat incididunt pariatur duis excepteur elit irure nulla ipsum dolor dolore est.\n\nAute deserunt nostrud id non ipsum do adipisicing laboris in minim officia magna elit minim mollit elit velit veniam lorem pariatur veniam sit excepteur irure commodo excepteur duis quis in.' + }, + { + id : '2e6971cd-49d5-49f1-8cbd-fba5c71e6062', + categoryId: '28924eab-97cc-465a-ba21-f232bb95843f', + question : 'How much time I will need to learn this app?', + answer : 'Id fugiat et cupidatat magna nulla nulla eu cillum officia nostrud dolore in veniam ullamco nulla ex duis est enim nisi aute ipsum velit et laboris est pariatur est culpa.\n\nCulpa sunt ipsum esse quis excepteur enim culpa est voluptate reprehenderit consequat duis officia irure voluptate veniam dolore fugiat dolor est amet nostrud non velit irure do voluptate id sit.' + }, + { + id : '974f93b8-336f-4eec-b011-9ddb412ee828', + categoryId: '28924eab-97cc-465a-ba21-f232bb95843f', + question : 'Are there any free tutorials available?', + answer : 'Excepteur deserunt tempor do lorem elit id magna pariatur irure ullamco elit dolor consectetur ad officia fugiat incididunt do elit aute esse eu voluptate adipisicing incididunt ea dolor aliqua dolor.\n\nConsequat est quis deserunt voluptate ipsum incididunt laboris occaecat irure laborum voluptate non sit labore voluptate sunt id sint ut laboris aute cupidatat occaecat eiusmod non magna aliquip deserunt nisi.' + }, + { + id : '5d877fc7-b881-4527-a6aa-d39d642feb23', + categoryId: '28924eab-97cc-465a-ba21-f232bb95843f', + question : 'Is there a month-to-month payment option?', + answer : 'Labore mollit in aliqua exercitation aliquip elit nisi nisi voluptate reprehenderit et dolor incididunt cupidatat ullamco nulla consequat voluptate adipisicing dolor qui magna sint aute do excepteur in aliqua consectetur.\n\nElit laborum non duis irure ad ullamco aliqua enim exercitation quis fugiat aute esse esse magna et ad cupidatat voluptate sint nulla nulla lorem et enim deserunt proident deserunt consectetur.' + }, + // General inquiries + { + id : '3d1c26c5-1e5e-4eb6-8006-ed6037ed9aca', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'How to download your items', + answer : 'Sunt mollit irure dolor aliquip sit veniam amet ut sunt dolore cillum sint pariatur qui irure proident velit non excepteur quis ut et quis velit aliqua ea sunt cillum sit.\n\nReprehenderit est culpa ut incididunt sit dolore mollit in occaecat velit culpa consequat reprehenderit ex lorem cupidatat proident reprehenderit ad eu sunt sit ut sit culpa ea reprehenderit aliquip est.' + }, + { + id : '11bd2b9a-85b4-41c9-832c-bd600dfa3a52', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'View and download invoices', + answer : 'Sint mollit consectetur voluptate fugiat sunt ipsum adipisicing labore exercitation eiusmod enim excepteur enim proident velit sint magna commodo dolor ex ipsum sit nisi deserunt labore eu irure amet ea.\n\nOccaecat ut velit et sint pariatur laboris voluptate duis aliqua aliqua exercitation et duis duis eu laboris excepteur occaecat quis esse enim ex dolore commodo fugiat excepteur adipisicing in fugiat.' + }, + { + id : 'f55c023a-785e-4f0f-b5b7-47da75224deb', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'I\'ve forgotten my username or password', + answer : 'In exercitation sunt ad anim commodo sunt do in sunt est officia amet ex ullamco do nisi consectetur lorem proident lorem adipisicing incididunt consequat fugiat voluptate sint est anim officia.\n\nVelit sint aliquip elit culpa amet eu mollit veniam esse deserunt ex occaecat quis lorem minim occaecat culpa esse veniam enim duis excepteur ipsum esse ut ut velit cillum adipisicing.' + }, + { + id : 'c577a67d-357a-4b88-96e8-a0ee1fe9162e', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'Where is my license code?', + answer : 'Ad adipisicing duis consequat magna sunt consequat aliqua eiusmod qui et nostrud voluptate sit enim reprehenderit anim exercitation ipsum ipsum anim ipsum laboris aliqua ex lorem aute officia voluptate culpa.\n\nNostrud anim ex pariatur ipsum et nostrud esse veniam ipsum ipsum irure velit ad quis irure tempor nulla amet aute id esse reprehenderit ea consequat consequat ea minim magna magna.' + }, + { + id : '1a680c29-7ece-4a80-9709-277ad4da8b4b', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'How to contact an author', + answer : 'Magna laborum et amet magna fugiat officia deserunt in exercitation aliquip nulla magna velit ea labore quis deserunt ipsum occaecat id id consequat non eiusmod mollit est voluptate ea ex.\n\nReprehenderit mollit ut excepteur minim veniam fugiat enim id pariatur amet elit nostrud occaecat pariatur et esse aliquip irure quis officia reprehenderit voluptate voluptate est et voluptate sint esse dolor.' + }, + { + id : 'c49c2216-8bdb-4df0-be25-d5ea1dbb5688', + categoryId: '395b0d41-b9a8-4cd6-8b5c-f07855e82d62', + question : 'How does the affiliate program work?', + answer : 'Adipisicing laboris ipsum fugiat et cupidatat aute esse ad labore et est cillum ipsum sunt duis do veniam minim officia deserunt in eiusmod eu duis dolore excepteur consectetur id elit.\n\nAnim excepteur occaecat laborum sunt in elit quis sit duis adipisicing laboris anim laborum et pariatur elit qui consectetur laborum reprehenderit occaecat nostrud pariatur aliqua elit nisi commodo eu excepteur.' + }, + // Licenses + { + id : '3ef176fa-6cba-4536-9f43-540c686a4faa', + categoryId: 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + question : 'How do licenses work for items I bought?', + answer : 'Culpa duis nostrud qui velit sint magna officia fugiat ipsum eiusmod enim laborum pariatur anim culpa elit ipsum lorem pariatur exercitation laborum do labore cillum exercitation nisi reprehenderit exercitation quis.\n\nMollit aute dolor non elit et incididunt eiusmod non in commodo occaecat id in excepteur aliqua ea anim pariatur sint elit voluptate dolor eu non laborum laboris voluptate qui duis.' + }, + { + id : '7bc6b7b4-7ad8-4cbe-af36-7301642d35fb', + categoryId: 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + question : 'Do licenses have an expiry date?', + answer : 'Ea proident dolor tempor dolore incididunt velit incididunt ullamco quis proident consectetur magna excepteur cillum officia ex do aliqua reprehenderit est esse officia labore dolore aute laboris eu commodo aute.\n\nOfficia quis id ipsum adipisicing ipsum eu exercitation cillum ex elit pariatur adipisicing ullamco ullamco nulla dolore magna aliqua reprehenderit eu laborum voluptate reprehenderit non eiusmod deserunt velit magna do.' + }, + { + id : '56c9ed66-a1d2-4803-a160-fba29b826cb4', + categoryId: 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + question : 'I want to make multiple end products with the same item', + answer : 'Elit cillum incididunt enim cupidatat ex elit cillum aute dolor consectetur proident non minim eu est deserunt proident mollit ullamco laborum anim ea labore anim ex enim ullamco consectetur enim.\n\nEx magna consectetur esse enim consequat non aliqua nulla labore mollit sit quis ex fugiat commodo eu cupidatat irure incididunt consequat enim ut deserunt consequat elit consequat sint adipisicing sunt.' + }, + { + id : '21c1b662-33c8-44d7-9530-91896afeeac7', + categoryId: 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + question : 'How easy is it to change the license type?', + answer : 'Duis culpa ut veniam voluptate consequat proident magna eiusmod id est magna culpa nulla enim culpa mollit velit lorem mollit ut minim dolore in tempor reprehenderit cillum occaecat proident ea.\n\nVeniam fugiat ea duis qui et eu eiusmod voluptate id cillum eiusmod eu reprehenderit minim reprehenderit nisi cillum nostrud duis eu magna minim sunt voluptate eu pariatur nulla ullamco elit.' + }, + { + id : '5fa52c90-82be-41ae-96ec-5fc67cf054a4', + categoryId: 'b388a87f-bfbb-44d0-800c-0ddbce2a5d22', + question : 'Do I need a Regular License or an Extended License?', + answer : 'Mollit nostrud ea irure ex ipsum in cupidatat irure sit officia reprehenderit adipisicing et occaecat cupidatat exercitation mollit esse in excepteur qui elit exercitation velit fugiat exercitation est officia excepteur.\n\nQuis esse voluptate laborum non veniam duis est fugiat tempor culpa minim velit minim ut duis qui officia consectetur ex nostrud ut elit elit nulla in consectetur voluptate aliqua aliqua.' + }, + // Payments + { + id : '81ac908c-35a2-4705-8d75-539863c35c09', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'Common PayPal, Skrill, and credit card issues', + answer : 'Sit occaecat sint nulla in esse dolor occaecat in ea sit irure magna magna veniam fugiat consequat exercitation ipsum ex officia velit consectetur consequat voluptate lorem eu proident lorem incididunt.\n\nExcepteur exercitation et qui labore nisi eu voluptate ipsum deserunt deserunt eu est minim dolor ad proident nulla reprehenderit culpa minim voluptate dolor nostrud dolor anim labore aliqua officia nostrud.' + }, + { + id : 'b6d8909f-f36d-4885-8848-46b8230d4476', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'How do I find my transaction ID?', + answer : 'Laboris ea nisi commodo nulla cillum consequat consectetur nisi velit adipisicing minim nulla culpa amet quis sit duis id id aliqua aute exercitation non reprehenderit aliquip enim eiusmod eu irure.\n\nNon irure consectetur sunt cillum do adipisicing excepteur labore proident ut officia dolor fugiat velit sint consectetur cillum qui amet enim anim mollit laboris consectetur non do laboris lorem aliqua.' + }, + { + id : '9496235d-4d0c-430b-817e-1cba96404f95', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'PayPal disputes And chargebacks', + answer : 'Ullamco eiusmod do pariatur pariatur consectetur commodo proident ex voluptate ullamco culpa commodo deserunt pariatur incididunt nisi magna dolor est minim eu ex voluptate deserunt labore id magna excepteur et.\n\nReprehenderit dolore pariatur exercitation ad non fugiat quis proident fugiat incididunt ea magna pariatur et exercitation tempor cillum eu consequat adipisicing est laborum sit cillum ea fugiat mollit cupidatat est.' + }, + { + id : '7fde17e6-4ac1-47dd-a363-2f4f14dcf76a', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'Saving your credit card details', + answer : 'Qui quis nulla excepteur voluptate elit culpa occaecat id ex do adipisicing est mollit id anim nisi irure amet officia ut sint aliquip dolore labore cupidatat magna laborum esse ea.\n\nEnim magna duis sit incididunt amet anim et nostrud laborum eiusmod et ea fugiat aliquip velit sit fugiat consectetur ipsum anim do enim excepteur cupidatat consequat sunt irure tempor ut.' + }, + { + id : '90a3ed58-e13b-40cf-9219-f933bf9c9b8f', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'Why do prepaid credits expire?', + answer : 'Consequat consectetur commodo deserunt sunt aliquip deserunt ex tempor esse nostrud sit dolore anim nostrud nulla dolore veniam minim laboris non dolor veniam lorem veniam deserunt laborum aute amet irure.\n\nEiusmod officia veniam reprehenderit ea aliquip velit anim aute minim aute nisi tempor qui sunt deserunt voluptate velit elit ut adipisicing ipsum et excepteur ipsum eu ullamco nisi esse dolor.' + }, + { + id : '153376ed-691f-4dfd-ae99-e204a49edc44', + categoryId: '71c34043-d89d-4aca-951d-8606c3943c43', + question : 'Why is there a minimum $20 credit?', + answer : 'Duis sint velit incididunt exercitation eiusmod nisi sunt ex est fugiat ad cupidatat sunt nisi elit do duis amet voluptate ipsum aliquip lorem aliqua sint esse in magna irure officia.\n\nNon eu ex elit ut est voluptate tempor amet ut officia in duis deserunt cillum labore do culpa id dolore magna anim consectetur qui consectetur fugiat labore mollit magna irure.' + }, + // Support + { + id : '4e7ce72f-863a-451f-9160-cbd4fbbc4c3d', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'What is item support?', + answer : 'Exercitation sit eiusmod enim officia exercitation eiusmod sunt eiusmod excepteur ad commodo eiusmod qui proident quis aliquip excepteur sit cillum occaecat non dolore sit in labore ut duis esse duis.\n\nConsequat sunt voluptate consectetur dolor laborum enim nostrud deserunt incididunt sint veniam laboris sunt amet velit anim duis aliqua sunt aliqua aute qui nisi mollit qui irure ullamco aliquip laborum.' + }, + { + id : '0795a74f-7a84-4edf-8d66-296cdef70003', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'How to contact an author', + answer : 'Minim commodo cillum do id qui irure aliqua laboris excepteur laboris magna enim est lorem consectetur tempor laboris proident proident eu irure dolor eiusmod in officia lorem quis laborum ullamco.\n\nQui excepteur ex sit esse dolore deserunt ullamco occaecat laboris fugiat cupidatat excepteur laboris amet dolore enim velit ipsum velit sint cupidatat consectetur cupidatat deserunt sit eu do ullamco quis.' + }, + { + id : '05532574-c102-4228-89a8-55fff32ec6fc', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'Extending and renewing item support', + answer : 'Reprehenderit anim consectetur anim dolor magna consequat excepteur tempor enim duis magna proident ullamco aute voluptate elit laborum mollit labore id ex lorem est mollit do qui ex labore nulla.\n\nUt proident elit proident adipisicing elit fugiat ex ullamco dolore excepteur excepteur labore laborum sunt ipsum proident magna ex voluptate laborum voluptate sint proident eu reprehenderit non excepteur quis eiusmod.' + }, + { + id : 'b3917466-aa51-4293-9d5b-120b0ce6635c', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'Rating or review removal policy', + answer : 'Ipsum officia mollit qui laboris sunt amet aliquip cupidatat minim non elit commodo eiusmod labore mollit pariatur aute reprehenderit ullamco occaecat enim pariatur aute amet occaecat incididunt irure ad ut.\n\nIncididunt cupidatat pariatur magna sint sit culpa ad cupidatat cillum exercitation consequat minim pariatur consectetur aliqua non adipisicing magna ad nulla ea do est nostrud eu aute id occaecat ut.' + }, + { + id : '2f2fb472-24d4-4a00-aa80-d513fa6c059c', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'Purchasing supported and unsupported items', + answer : 'Dolor cupidatat do qui in tempor dolor magna magna ut dolor est aute veniam consectetur enim sunt sunt duis magna magna aliquip id reprehenderit dolor in veniam ullamco incididunt occaecat.\n\nId duis pariatur anim cillum est sint non veniam voluptate deserunt anim nostrud duis voluptate occaecat elit ut veniam voluptate do qui est ad velit irure sint lorem ullamco aliqua.' + }, + { + id : '2fffd148-7644-466d-8737-7dde88c54154', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'I haven\'t received a response from the author', + answer : 'Velit commodo pariatur ullamco elit sunt dolor quis irure amet tempor laboris labore tempor nisi consectetur ea proident dolore culpa nostrud esse amet commodo do esse laboris laboris in magna.\n\nAute officia labore minim laborum irure cupidatat occaecat laborum ex labore ipsum aliqua cillum do exercitation esse et veniam excepteur mollit incididunt ut qui irure culpa qui deserunt nostrud tempor.' + }, + { + id : '24a1034e-b4d6-4a86-a1ea-90516e87e810', + categoryId: 'bea49ee0-26da-46ad-97be-116cd7ab416d', + question : 'Responding to requests outside of support', + answer : 'Exercitation eu in officia lorem commodo pariatur pariatur nisi consectetur qui elit in aliquip et ullamco duis nostrud aute laborum laborum est dolor non qui amet deserunt ex et aliquip.\n\nProident consectetur eu amet minim labore anim ad non aute duis eiusmod sit ad elit magna do aliquip aliqua laborum dolor laboris ea irure duis mollit fugiat tempor eu est.' + } +]; +export const guideCategories = [ + { + id : '0ee72de7-49c0-4880-9e89-b72a4edd6a81', + slug : 'getting-started', + title: 'Getting Started' + }, + { + id : '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'projects', + title: 'Projects' + }, + { + id : 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'settings', + title: 'Settings' + }, + { + id : '7b25b38c-1ab3-4474-8569-65b3ea232add', + slug : 'payments', + title: 'Payments' + }, + { + id : '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'your-account', + title: 'Your Account' + } +]; +export const guides = [ + // Getting started + { + id : 'a008ffa3-7b3f-43be-8a8f-dbf5272ed2dd', + categoryId: '0ee72de7-49c0-4880-9e89-b72a4edd6a81', + slug : 'what-is-this-app', + title : 'What is this app?', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '7643d388-12ab-4025-a2f1-5045ac7b1c4c', + categoryId: '0ee72de7-49c0-4880-9e89-b72a4edd6a81', + slug : 'start-using-the-app', + title : 'Start using the app', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '1fecee67-c4b4-413a-b0f2-949dcab73249', + categoryId: '0ee72de7-49c0-4880-9e89-b72a4edd6a81', + slug : 'signing-in-to-the-dashboard', + title : 'Signing in to the dashboard', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'd2e2ea8f-5298-4ba2-898b-afc60c064bba', + categoryId: '0ee72de7-49c0-4880-9e89-b72a4edd6a81', + slug : 'navigating-within-the-app', + title : 'Navigating within the app', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + // Projects + { + id : 'f2592886-11b8-4b56-baab-96802c2ed93e', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'creating-a-project', + title : 'Creating a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '9ec3f4b9-a355-4f57-9e93-efa8611cc1c9', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'renaming-a-project', + title : 'Renaming a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '1bc6e7f9-b046-4f4f-9b18-741c9d5429f6', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'displaying-a-project', + title : 'Displaying a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'a005d5f1-938d-45c5-8ed4-d0cf8d02e533', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'deleting-a-project', + title : 'Deleting a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '43837279-dce2-4dc0-beac-30b5ba829f14', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'changing-the-visibility-of-a-project', + title : 'Changing the visibility of a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '4cf5a435-eaa0-463c-8d2b-efde193c7fb3', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'adding-media-to-a-project', + title : 'Adding media to a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'cd3fb87e-e138-4721-9e29-a5c751bfd949', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'removing-a-media-from-a-project', + title : 'Removing a media from a project', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'f26205c6-882e-4713-b067-c73758b45551', + categoryId: '07b8421f-20bf-45b6-90ee-169ebe3a5bcc', + slug : 'cropping-a-media', + title : 'Cropping a media', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + // Settings + { + id : '1cbdeaeb-bbf1-4d04-b43d-f37b55e6a229', + categoryId: 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'general-settings', + title : 'General settings', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '98de7d4a-2ca2-4d47-bbe6-083ed26467db', + categoryId: 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'project-settings', + title : 'Project settings', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '145f497c-1fdb-47b5-a6c1-31f856403571', + categoryId: 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'media-settings', + title : 'Media settings', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '0a007f59-a5ea-4875-991d-f22d6fd69898', + categoryId: 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'domain-settings', + title : 'Domain settings', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '4707c8eb-31f9-415c-bd07-86f226c75feb', + categoryId: 'c88a1f54-360a-4b9b-a54b-2f92b7a1f63b', + slug : 'privacy-settings', + title : 'Privacy settings', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + // Payments + { + id : 'c771bf0a-1e0c-4b6d-af7e-189e10cc6fb8', + categoryId: '7b25b38c-1ab3-4474-8569-65b3ea232add', + slug : 'subscriptions', + title : 'Subscriptions', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '3d7150d2-feb3-4f20-bd3f-8e525cef77a4', + categoryId: '7b25b38c-1ab3-4474-8569-65b3ea232add', + slug : 'discounts', + title : 'Discounts', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '79239bc4-4fb5-428b-b30d-62c5289b061d', + categoryId: '7b25b38c-1ab3-4474-8569-65b3ea232add', + slug : 'payment-methods', + title : 'Payment methods', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '8d68c5e6-5404-450c-9d5f-d9800c164041', + categoryId: '7b25b38c-1ab3-4474-8569-65b3ea232add', + slug : 'overdue-payments', + title : 'Overdue payments', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + // Your account + { + id : '60df0d4c-dda1-439c-bd44-179c57a7597d', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'changing-your-username', + title : 'Changing your username', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '0a9c3321-1db3-42bc-92b6-7e257368123e', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'changing-your-email', + title : 'Changing your email', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '80ba5106-5f9c-4ed7-b8f3-8544035e3095', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'changing-your-password', + title : 'Changing your password', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'db2e97a6-d657-4e9d-9b6c-5f213ea3301c', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'closing-your-account', + title : 'Closing your account', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : '3374c887-2fb7-4223-9f40-7f2cbbf76795', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'account-limits', + title : 'Account limits', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + }, + { + id : 'cc65f92a-7d46-4557-b15b-6f8f59a60576', + categoryId: '41fdf071-aec4-49de-9dd4-b4f746596928', + slug : 'two-factor-authentication', + title : 'Two factor authentication', + subtitle : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt' + } +]; + +// Since we only have one content for the demo, we will +// use the following mock-api on every request for every guide. +export const guideContent = ` +

Header Level 2

+ +

+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit + amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper + pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, + sagittis tempus lacus enim ac dui. Donec non enim + in turpis pulvinar facilisis. Ut felis. +

+ +

+ Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos + himenaeos. Curabitur vitae sagittis odio. Suspendisse ullamcorper nunc non pellentesque laoreet. Curabitur eu tortor id quam pretium mattis. Proin ut quam velit. +

+ +

Header Level 3

+ + +

+ Nullam sagittis nulla in diam finibus, sed pharetra velit vestibulum. Suspendisse euismod in urna eu posuere. +

+ +

Header Level 4

+ +
+

+ Blockquote. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur + massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est. +

+
+ Brian Hughes +
+
+ +
    +
  1. Ordered list
  2. +
  3. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  4. +
  5. Aliquam tincidunt mauris eu risus.
  6. +
+ +
Header Level 5
+ +
    +
  • Unordered list
  • +
  • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  • +
  • Aliquam tincidunt mauris eu risus.
  • +
+ +
#header h1 a {
+    display: block;
+    width: 300px;
+    height: 80px;
+}
+ +
Header Level 6
+ +
+
Definition list
+
+ Quisque sit amet risus enim. Aliquam sit amet interdum justo, at ultricies sapien. Suspendisse et semper urna, in gravida eros. Quisque id nibh iaculis, euismod urna sed, + egestas nisi. Donec eros metus, congue a imperdiet feugiat, sagittis nec ipsum. Quisque dapibus mollis felis non tristique. +
+ +
Definition list
+
+ Ut auctor, metus sed dapibus tempus, urna diam auctor odio, in malesuada odio risus vitae nisi. Etiam blandit ante urna, vitae placerat massa mollis in. Duis nec urna ac + purus semper dictum ut eget justo. Aenean non sagittis augue. Sed venenatis rhoncus enim eget ornare. Donec viverra sed felis at venenatis. Mauris aliquam fringilla nulla, + sit amet congue felis dignissim at. +
+
`; diff --git a/src/app/mock-api/apps/mailbox/api.ts b/src/app/mock-api/apps/mailbox/api.ts new file mode 100644 index 00000000..00186c67 --- /dev/null +++ b/src/app/mock-api/apps/mailbox/api.ts @@ -0,0 +1,385 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { filters as filtersData, folders as foldersData, labels as labelsData, mails as mailsData, settings as settingsData } from 'app/mock-api/apps/mailbox/data'; + +@Injectable({ + providedIn: 'root' +}) +export class MailboxMockApi +{ + private _filters: any[] = filtersData; + private _folders: any[] = foldersData; + private _mails: any[] = mailsData; + private _labels: any[] = labelsData; + private _settings: any = settingsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Settings - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/settings') + .reply(() => [200, cloneDeep(this._settings)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Settings - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/mailbox/settings') + .reply(({request}) => { + + // Get the settings + const settings = cloneDeep(request.body.settings); + + // Update the settings + this._settings = assign({}, this._settings, settings); + + // Return the response + return [200, cloneDeep(this._settings)]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Folders - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/folders') + .reply(() => { + + let count = 0; + + // Iterate through the folders + this._folders.forEach((folder) => { + + // Get the mails of this folder + const mails = this._mails.filter((mail) => mail.folder === folder.id); + + // If we are counting the 'sent' or the 'trash' folder... + if ( folder.slug === 'sent' || folder.slug === 'trash' ) + { + // Always set the count to 0 + count = 0; + } + // If we are counting the 'drafts' or the 'spam' folder... + else if ( folder.slug === 'drafts' || folder.slug === 'trash' || folder.slug === 'spam' ) + { + // Set the count to the count of all mails + count = mails.length; + } + // Otherwise ('inbox')... + else + { + // Go through the mails and count the unread ones + mails.forEach((mail) => { + + if ( mail.unread ) + { + count++; + } + }); + } + + // Append the count to the folder mock-api + folder.count = count; + + // Reset the count + count = 0; + }); + + // Return the response + return [200, cloneDeep(this._folders)]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Filters - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/filters') + .reply(() => [200, cloneDeep(this._filters)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Labels - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/labels') + .reply(() => [200, cloneDeep(this._labels)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Labels - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/mailbox/label') + .reply(({request}) => { + + // Get the label + const label = cloneDeep(request.body.label); + + // Generate an id + label.id = FuseMockApiUtils.guid(); + + // Generate a slug + label.slug = label.title.toLowerCase() + .replace(/ /g, '-') + .replace(/[-]+/g, '-') + .replace(/[^\w-]+/g, ''); + + // Check if the slug is being used and update it if necessary + const originalSlug = label.slug; + + let sameSlug; + let slugSuffix = 1; + + do + { + sameSlug = this._labels.filter((item) => { + return item.slug === label.slug; + }); + + if ( sameSlug.length > 0 ) + { + label.slug = originalSlug + '-' + slugSuffix; + slugSuffix++; + } + } + while ( sameSlug.length > 0 ); + + // Add the label + this._labels.push(label); + + // Return the response + return [200, label]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Labels - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/mailbox/label') + .reply(({request}) => { + + // Get the id and label + const id = request.body.id; + const label = cloneDeep(request.body.label); + + // Prepare the updated label + let updatedLabel = null; + + // Find the label and update it + this._labels.forEach((item, index, labels) => { + + if ( item.id === id ) + { + // Update the slug + label.slug = label.title.toLowerCase() + .replace(/ /g, '-') + .replace(/[-]+/g, '-') + .replace(/[^\w-]+/g, ''); + + // Update the label + labels[index] = assign({}, labels[index], label); + + // Store the updated label + updatedLabel = labels[index]; + } + }); + + // Return the response + return [200, updatedLabel]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Labels - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/mailbox/label') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the label and delete it + const index = this._labels.findIndex((item) => item.id === id); + this._labels.splice(index, 1); + + // Get all the mails that have the label + const mailsWithLabel = this._mails.filter((mail) => { + return mail.labels.indexOf(id) > -1; + }); + + // Iterate through them and remove the label + mailsWithLabel.forEach((mail) => { + mail.labels.splice(mail.labels.indexOf(id), 1); + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Mails - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/mails', 625) + .reply(({request}) => { + + // First, decide if mails are requested by folder, filter or label + const byFolder = request.params.get('folder'); + const byFilter = request.params.get('filter'); + const byLabel = request.params.get('label'); + + // Clone the mails mock-api to prevent accidental mock-api updates + let mails: any[] | null = cloneDeep(this._mails); + + // Filter the mails depending on the requested by type + mails = mails.filter((mail) => { + + if ( byFolder ) + { + return mail.folder === this._folders.find(folder => folder.slug === byFolder).id; + } + + if ( byFilter ) + { + return mail[byFilter] === true; + } + + if ( byLabel ) + { + return mail.labels.includes(this._labels.find(label => label.slug === byLabel).id); + } + }); + + // Sort by date - descending + mails.sort((a, b) => { + return new Date(b.date).getTime() - new Date(a.date).getTime(); + }); + + // Figure out the cc and bcc counts + mails.forEach((mail) => { + mail.ccCount = mail.cc ? mail.cc.length : 0; + mail.bccCount = mail.bcc ? mail.bcc.length : 0; + }); + + // Paginate - Start + const mailsLength = mails.length; + const resultsPerPage = 10; + + // Get the requested page number + const page = parseInt(request.params.get('page') ?? '1', 10); + + // Calculate pagination details + const begin = (page - 1) * resultsPerPage; + const end = Math.min((resultsPerPage * page), mailsLength); + const lastPage = Math.max(Math.ceil(mailsLength / resultsPerPage), 1); + + // Prepare the pagination object + let pagination = {}; + + // If the requested page number is bigger than + // the last possible page number, return null for + // mails but also send the last possible page so + // the app can navigate to there + if ( page > lastPage ) + { + mails = null; + pagination = { + lastPage + }; + } + else + { + // Paginate the results by 10 + mails = mails.slice(begin, end); + + // Prepare the pagination mock-api + pagination = { + totalResults : mailsLength, + resultsPerPage: resultsPerPage, + currentPage : page, + lastPage : lastPage, + startIndex : begin, + endIndex : end - 1 + }; + } + + // Return the response + return [ + 200, + { + mails, + pagination + } + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Mail - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/mailbox/mail') + .reply(({request}) => { + + // Get the id from the params + const id = request.params.get('id'); + + // Clone the mails mock-api to prevent accidental mock-api updates + const mails = cloneDeep(this._mails); + + // Find the mail + const mail = mails.find((item) => item.id === id); + + return [ + 200, + mail + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Mail - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/mailbox/mail') + .reply(({request}) => { + + // Get the id and mail + const id = request.body.id; + const mail = cloneDeep(request.body.mail); + + // Prepare the updated mail + let updatedMail = null; + + // Find the mail and update it + this._mails.forEach((item, index, mails) => { + + if ( item.id === id ) + { + // Update the mail + mails[index] = assign({}, mails[index], mail); + + // Store the updated mail + updatedMail = mails[index]; + } + }); + + // Return the response + return [200, updatedMail]; + }); + } +} diff --git a/src/app/mock-api/apps/mailbox/data.ts b/src/app/mock-api/apps/mailbox/data.ts new file mode 100644 index 00000000..280bd531 --- /dev/null +++ b/src/app/mock-api/apps/mailbox/data.ts @@ -0,0 +1,2581 @@ +import * as moment from 'moment'; + +/* tslint:disable:max-line-length */ +export const folders = [ + { + id : '7c004a19-4506-48ef-93ab-f16381302e3b', + title: 'Inbox', + slug : 'inbox', + icon : 'heroicons_outline:inbox' + }, + { + id : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + title: 'Sent', + slug : 'sent', + icon : 'heroicons_outline:paper-airplane' + }, + { + id : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + title: 'Drafts', + slug : 'drafts', + icon : 'heroicons_outline:document' + }, + { + id : '0197c436-2ef3-424d-b546-8b7f49186e15', + title: 'Spam', + slug : 'spam', + icon : 'heroicons_outline:exclamation' + }, + { + id : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + title: 'Trash', + slug : 'trash', + icon : 'heroicons_outline:trash' + } +]; +export const filters = [ + { + id : 'de1b41f6-6839-4f1b-9d2c-07e55f6f8f82', + title: 'Starred', + slug : 'starred', + icon : 'heroicons_outline:star' + }, + { + id : '71bba1ec-a90e-4a71-9932-4bab0a99aa1c', + title: 'Important', + slug : 'important', + icon : 'heroicons_outline:exclamation-circle' + } +]; +export const labels = [ + { + id : 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + title: 'Personal', + slug : 'personal', + color: 'blue' + }, + { + id : '745cf30e-ca84-47a1-a553-b70eb630d8e7', + title: 'Work', + slug : 'work', + color: 'indigo' + }, + { + id : '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + title: 'Payments', + slug : 'payments', + color: 'red' + }, + { + id : 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + title: 'Invoices', + slug : 'invoices', + color: 'teal' + }, + { + id : '184cd689-4ee4-47cf-9f8a-12233d614326', + title: 'Accounts', + slug : 'accounts', + color: 'purple' + }, + { + id : 'b67fc437-6118-4ec8-a3c7-9320b828e3fc', + title: 'Forums', + slug : 'forums', + color: 'green' + } +]; +export const settings = { + messageLayout: 'right' +}; +export const mails = [ + { + id : 'f9c4c091-3ac4-4df9-ac5d-aec7b07c8e3f', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-01.jpg', + contact: 'Myra Dudley ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + bcc : [ + 'Julie T. ' + ], + date : moment().hour(20).minute(13).toISOString(), // Today - 20:13 + subject : 'Please review and sign the attached agreement', + content : 'Hi Brian,\n\nUllamco deserunt commodo esse deserunt deserunt quis eiusmod. Laborum sint excepteur non sit eiusmod sunt voluptate ipsum nisi ullamco magna. Lorem consectetur est dolor minim exercitation deserunt quis duis fugiat ipsum incididunt non. Anim aute ipsum cupidatat nisi occaecat quis sit nisi labore labore dolore do. Pariatur veniam culpa quis veniam nisi exercitation veniam ut. Quis do sint proident fugiat ad.\n\nNon id nisi commodo veniam. Veniam veniam minim ea laborum voluptate id duis deserunt. Anim ut ut amet et ullamco nulla fugiat id incididunt adipisicing excepteur amet. Ex amet eu cillum non fugiat velit dolore. Incididunt duis est eu et ex sunt consectetur cillum nisi aute proident.\n\nIncididunt excepteur laborum quis sit. Ex quis officia incididunt proident aliqua adipisicing. Irure ad in Lorem laborum deserunt nulla consequat. Pariatur excepteur exercitation cupidatat aute.\n\nCheers!\nMyra Dudley', + attachments: [ + { + type : 'image/jpeg', + name : 'mystery-forest.jpg', + size : 15539, + preview : 'mystery-forest_preview.jpg', + downloadUrl: '' + }, + { + type : 'application/pdf', + name : 'montly-invoice.pdf', + size : 243449, + preview : 'pdf', + downloadUrl: '' + }, + { + type : 'image/jpeg', + name : 'birds-eye-sydney.jpg', + size : 14294, + preview : 'birds-eye-sydney_preview.jpg', + downloadUrl: '' + } + ], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'c531bc01-8a9e-481b-adf8-95303a6938c5', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-01.jpg', + contact: 'Shaw Murray ' + }, + to : 'me ', + date : moment().hour(18).minute(56).toISOString(), // Today - 18:56 + subject : 'Delivery address confirmation', + content : 'Dear Brian,\n\nDolore consectetur est cupidatat ipsum reprehenderit anim quis veniam anim ipsum incididunt exercitation. Velit exercitation culpa eiusmod dolore labore irure. Duis esse quis elit pariatur labore occaecat esse voluptate dolore deserunt cillum irure. Aute qui nulla est exercitation qui sunt anim aliquip. Ex ad est velit laboris exercitation ea ut pariatur. Amet reprehenderit ut est id sunt commodo anim et est voluptate et.\n\nMagna aliqua incididunt non ut voluptate nulla aliqua exercitation elit consectetur cupidatat. Proident in reprehenderit occaecat laborum non eu amet id aliqua nulla dolore. Eiusmod quis adipisicing quis cupidatat labore.\n\nReprehenderit nulla ullamco est dolore ex irure sunt nostrud reprehenderit quis dolor. Tempor nostrud elit elit aute ut ut eiusmod laboris excepteur consequat ex. Velit id ex ullamco in. Ea elit Lorem Lorem aliquip amet consequat irure nisi qui cillum incididunt. Commodo aute Lorem eiusmod veniam consectetur aute eu dolore. Ea magna incididunt laboris quis quis et tempor dolore dolore ut nisi.\n\nBest Regards,\nShaw Murray', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'ebc80fc3-6c56-4cae-a45a-771b15ced076', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-02.jpg', + contact: 'Sanders Beck ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : moment().hour(14).minute(35).toISOString(), // Today - 14:35 + subject : 'Insurance documents', + content : 'Hi Brian,\n\nAliquip ipsum sunt sit sunt velit velit pariatur. Nisi incididunt eiusmod consequat ut cillum eu exercitation. Enim proident nostrud aute in. Non irure nisi duis aliquip commodo proident veniam adipisicing id velit. Enim magna Lorem fugiat tempor.\n\nCommodo non nulla incididunt irure voluptate. Fugiat culpa cillum aute quis. Voluptate veniam adipisicing dolor sint. Proident eiusmod quis duis ipsum sit eu.\n\nDeserunt reprehenderit adipisicing reprehenderit ipsum. Laborum in veniam amet occaecat tempor esse enim dolore elit sit quis adipisicing. Aute occaecat eiusmod enim cupidatat sunt.\n\nBest Regards,\nSanders Beck', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : '981c5ffb-7c88-47a8-b60f-f16150eeae9d', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-03.jpg', + contact: 'Zimmerman Gould ' + }, + to : 'me ', + date : moment().hour(22).minute(26).subtract(1, 'day').toISOString(), // Yesterday - 08:22 + subject : 'Previous clients and their invoices', + content : 'Dear Brian,\n\nDo aute eu dolore officia laborum id anim fugiat incididunt nulla esse proident. Veniam veniam nostrud ut nisi magna ipsum ea eiusmod esse velit id aliqua nisi irure. Amet laborum fugiat deserunt est. Quis amet veniam anim nostrud irure cillum voluptate consequat qui cupidatat minim occaecat elit enim. Ut ut incididunt cillum sit sit irure culpa. Culpa exercitation minim velit eu. Ipsum exercitation excepteur et ad do sit.\n\nVeniam cupidatat officia aliqua ad excepteur cillum laboris deserunt esse laboris adipisicing reprehenderit. Reprehenderit anim consectetur pariatur labore do in irure. Ad consequat commodo non pariatur occaecat. Eiusmod cillum non anim consequat culpa nisi. Est nulla ut sint qui deserunt anim. Excepteur qui occaecat dolore nulla occaecat cupidatat aute sit laborum magna.\n\nConsequat aliqua commodo officia excepteur. Ex consectetur elit dolor exercitation ullamco amet laboris. Deserunt nulla non proident est pariatur reprehenderit reprehenderit. Ea nisi id aliqua cillum velit tempor ipsum dolor proident cillum eiusmod et ipsum anim. Elit non quis mollit enim Lorem cupidatat et labore. Laboris cillum reprehenderit aute veniam aliqua esse officia proident deserunt. Eiusmod laboris ullamco amet consectetur amet.\n\nKind Regards,\nZimmerman Gould', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'a8d0645d-ac30-4f1a-a163-06e949120289', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-02.jpg', + contact: 'Karina Alford ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : moment().hour(20).minute(5).subtract(1, 'day').toISOString(), // Yesterday - 22:05 + subject : 'Quote for a new web design project', + content : 'Hey Brian,\n\nNisi officia aliqua ex non cupidatat sint ullamco. Irure pariatur ullamco consequat ut eu anim. Ut ad elit pariatur est non sunt. Tempor dolore quis commodo dolore duis officia laboris nostrud sint. Exercitation ullamco laboris eiusmod culpa ut.\n\nAute Lorem aute occaecat dolore tempor ipsum proident fugiat deserunt non incididunt velit nulla. Dolor pariatur tempor amet qui eu exercitation. Tempor minim culpa proident nisi esse ea. Enim est fugiat aliqua aliqua aute velit laborum cupidatat irure nisi dolor deserunt aliqua.\n\nFugiat ut dolor tempor sunt aliquip dolor nostrud. Consequat incididunt ullamco cillum dolore excepteur deserunt est dolor aliquip irure do mollit officia. Consectetur cillum et non minim nisi. Esse quis sunt deserunt elit sint velit tempor et ullamco laboris officia excepteur. Veniam ad ut aliqua sunt consequat reprehenderit nostrud non in duis aute quis pariatur. Occaecat mollit anim non pariatur. Ad do ad id fugiat et culpa laborum esse cupidatat voluptate elit ut magna voluptate.\n\nBest Regards,\nKarina Alford', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'fd117ed9-1285-4aca-8c1c-5c96e732c558', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-03.jpg', + contact: 'Carla Gray ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : moment().hour(16).minute(43).subtract(1, 'day').toISOString(), // Yesterday - 16:43 + subject : 'Nulla culpa consectetur aute ex eu irure incididunt aliqua cupidatat sit cillum fugiat anim ea', + content : 'Hey Brian,\n\nDo pariatur occaecat tempor duis. Aute occaecat non consequat ut occaecat sint. Cillum reprehenderit elit nisi incididunt in labore pariatur. Labore mollit pariatur nulla officia esse anim exercitation nisi commodo culpa laborum amet nisi.\n\nSunt culpa mollit nostrud excepteur adipisicing sit do. Cillum voluptate amet do sit quis aliquip ea est qui elit. Veniam exercitation sit reprehenderit labore officia in labore excepteur eiusmod exercitation.\n\nEnim nostrud est non esse reprehenderit in ea eiusmod. Duis incididunt amet aliquip dolor esse. Nostrud qui commodo in non nostrud proident enim cupidatat. Aute sunt aliqua excepteur qui occaecat nulla incididunt commodo adipisicing ipsum.\n\nKind Regards,\nCarla Gray', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'a307d83b-d256-4af5-948a-148878a7eaad', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-04.jpg', + contact: 'Rice Cash ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : moment().hour(11).minute(28).subtract(2, 'day').toISOString(), // 2 days ago - 11:28 + subject : 'Ipsum laborum minim aute labore in', + content : 'Dear Brian,\n\nLaboris non ad et aute sint aliquip mollit voluptate velit dolore magna fugiat ex. Voluptate amet aute deserunt tempor non laboris cillum. Voluptate veniam magna sint magna proident exercitation adipisicing aute id ad tempor reprehenderit magna ullamco. Laborum Lorem anim elit aliquip ut aute minim fugiat aliquip. Eiusmod est et occaecat dolore anim laborum ullamco ipsum commodo.\n\nCommodo amet veniam nostrud mollit quis sint qui nulla elit esse excepteur ullamco esse magna. Nisi duis aute est in mollit irure enim tempor in. Mollit ipsum laboris et velit ex excepteur pariatur. Cillum veniam id ipsum magna. Laborum duis aliquip ut ipsum ad aliqua id sit pariatur consequat sit. Sit nulla nulla ullamco nulla eiusmod et in dolore sint reprehenderit cupidatat.\n\nIpsum mollit cupidatat magna occaecat labore est fugiat est fugiat fugiat nulla labore laboris. Eiusmod aute adipisicing pariatur aliquip sint enim anim in dolore enim aute culpa nulla. Minim magna enim officia ipsum elit quis do velit deserunt Lorem veniam excepteur.\n\nKind Regards,\nRice Cash', + attachments: [ + { + type : 'image/png', + name : 'lake-of-carezza.png', + size : 13071, + preview : 'lake-of-carrezza_preview.png', + downloadUrl: '' + }, + { + type : 'image/jpeg', + name : 'birds-eye-sydney.jpg', + size : 14294, + preview : 'birds-eye-sydney_preview.jpg', + downloadUrl: '' + }, + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + } + ], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : '67664fa3-3a87-4ab8-8c2c-dfd2b1de4c14', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-04.jpg', + contact: 'Elaine Ortiz ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : moment().hour(7).minute(12).subtract(2, 'day').toISOString(), // 2 days ago - 07:12 + subject : 'Ipsum fugiat ad deserunt cillum sunt fugiat', + content : 'Hello Brian,\n\nId Lorem laborum eiusmod eiusmod mollit magna dolore. Et commodo officia fugiat dolor aliqua proident mollit ut commodo ullamco. Sunt nulla eu dolor velit velit reprehenderit. Culpa esse veniam fugiat eiusmod id veniam sunt reprehenderit minim mollit. Esse qui ea irure pariatur eu ullamco pariatur ipsum reprehenderit proident mollit proident. Nisi fugiat ut est aliquip nulla in non dolore.\n\nCulpa irure cillum ex fugiat cupidatat eiusmod non. Qui irure velit consectetur minim eu excepteur eiusmod veniam irure ad culpa nisi. Nisi sit nostrud quis ullamco aliquip non consequat sunt reprehenderit velit dolor dolor laboris. Dolore in Lorem consectetur nostrud. Laborum cupidatat exercitation voluptate duis amet. Sunt sint minim do in commodo ipsum commodo ea qui velit deserunt qui anim fugiat.\n\nExercitation et qui consequat incididunt nisi incididunt cupidatat officia in. Sit eiusmod anim aliqua elit. Nisi mollit ut non pariatur enim fugiat sint labore velit nostrud eu. Eiusmod id laboris laboris duis enim aute ipsum in magna. Sit eiusmod amet duis commodo sint et anim ex sunt deserunt dolor incididunt. Eiusmod duis dolore dolor elit occaecat do adipisicing ullamco ex laboris aliqua adipisicing. Labore pariatur aute proident mollit elit commodo labore minim dolore non in cillum.\n\nCheers!\nElaine Ortiz', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'd5913a7e-25f8-4163-bbf0-81d034163ce7', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-05.jpg', + contact: 'Fleming Stone ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : moment().hour(6).minute(1).subtract(2, 'day').toISOString(), // 2 days ago - 06:01 + subject : 'Deserunt exercitation ut nulla elit Lorem', + content : 'Hi Brian,\n\nEst labore sunt sunt Lorem dolore. In excepteur esse proident ut consectetur dolor voluptate laborum veniam pariatur. Excepteur ut veniam sit culpa exercitation qui nulla nulla magna ea in dolore et consequat. Irure minim ad cupidatat amet reprehenderit excepteur incididunt nulla eu et excepteur anim et aliqua.\n\nSint sint Lorem magna est irure sint ea cupidatat fugiat. Occaecat non adipisicing magna magna culpa sit commodo aute ex consequat amet minim esse ut. In nulla eiusmod veniam deserunt in.\n\nIn aute excepteur qui pariatur fugiat. Occaecat velit voluptate proident occaecat ut laboris occaecat pariatur aute dolore do. Ut commodo ipsum est non commodo ut ea qui labore veniam. Occaecat nostrud eu dolor tempor velit excepteur sint occaecat excepteur aliqua aliquip. Magna mollit ea aliquip exercitation do elit ex reprehenderit esse aliqua elit.\n\nKind Regards,\nFleming Stone', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'b099a8e2-ffcc-4ae1-866d-8f8f6bd95ab3', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-06.jpg', + contact: 'England Wiley ' + }, + to : 'me ', + date : moment().hour(15).minute(36).subtract(5, 'day').toISOString(), // 2 days ago - 15:36 + subject : 'Minim do reprehenderit dolor ipsum officia magna laborum est anim in fugiat', + content : 'Dear Brian,\n\nAd do minim id ad ex sit reprehenderit labore do occaecat fugiat ut enim. Et sunt dolore sint non consequat ut. Esse deserunt nostrud pariatur nulla ullamco nulla sit aliquip culpa sunt ipsum. Ut ad minim qui anim amet aute cupidatat. Est ullamco duis laboris nulla labore incididunt consectetur. Cillum sunt mollit nulla laborum non tempor veniam consequat.\n\nAmet fugiat velit id deserunt pariatur velit laboris consectetur quis officia. Culpa nostrud deserunt nostrud esse labore esse consequat labore fugiat. Nostrud duis ex nulla et do.\n\nPariatur mollit ex adipisicing nostrud nostrud occaecat. Id tempor irure cupidatat duis cillum cupidatat nostrud enim anim. Esse nisi pariatur nisi elit elit sit quis ullamco dolor dolore pariatur est sint. Sint ex aliqua id sunt sunt magna amet ex sit anim. Irure aliquip fugiat ipsum tempor irure nisi Lorem anim sit ullamco. Exercitation nostrud mollit est non enim.\n\nBest Regards,\nEngland Wiley', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '7bd21940-3388-479c-b1bc-3ebceb0472d8', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-07.jpg', + contact: 'Ingram Fowler ' + }, + to : 'me ', + date : new Date('Sun Jan 07 2018 03:51:20 GMT+0000 (UTC)').toISOString(), + subject : 'Aliquip eiusmod pariatur adipisicing id consectetur sunt ad dolore consequat commodo', + content : 'Dear Brian,\n\nDolore sit occaecat est do fugiat sunt est amet nostrud. Aliqua ad veniam officia Lorem id aute fugiat laborum dolor magna dolor. Eiusmod nostrud qui sunt ut exercitation deserunt ipsum. Commodo veniam velit reprehenderit minim amet occaecat consectetur sint aliquip Lorem voluptate cupidatat. Aute aliquip do veniam nostrud nisi minim amet. Ex id ullamco non ea ullamco cillum et Lorem sunt sunt officia dolore excepteur.\n\nSit enim anim occaecat eu adipisicing velit ut excepteur consectetur sunt. Non fugiat deserunt quis fugiat eiusmod magna voluptate nisi commodo minim sunt dolore consequat labore. Pariatur ad aliqua do non labore exercitation aute minim culpa adipisicing qui. Anim et et anim dolore consequat fugiat amet aliquip nisi aliqua irure occaecat et laboris. Aute aliquip incididunt sit ipsum do. Ullamco in anim laboris incididunt tempor duis irure ipsum cillum duis ea. Magna culpa adipisicing ad ullamco id consequat qui ullamco cupidatat pariatur.\n\nMollit amet enim sint cupidatat eu aute exercitation dolor. Minim exercitation nostrud ullamco magna laboris. Pariatur proident aute proident et. Officia cillum pariatur nisi sint anim officia. Sunt minim anim ad tempor deserunt commodo magna labore incididunt ex ad nulla nulla ut. Sint ipsum aliqua dolor mollit do anim officia incididunt. Irure nulla ex elit id pariatur dolore et nostrud occaecat.\n\nCheers!\nIngram Fowler', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : '2d105bae-b4e5-4ba3-a40e-e9e2b5cc671a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-05.jpg', + contact: 'Diana Walsh ' + }, + to : 'me ', + date : new Date('Fri Jun 29 2018 07:37:52 GMT+0000 (UTC)').toISOString(), + subject : 'Non anim id laborum in et id', + content : 'Dear Brian,\n\nTempor veniam do dolor laborum consectetur in sit incididunt nulla officia consectetur fugiat. In dolor consequat consectetur deserunt sit. Voluptate reprehenderit tempor dolor dolore nulla aliquip commodo elit cillum laboris occaecat laboris. Eu dolor magna velit ea commodo dolor. Occaecat sit mollit amet voluptate eiusmod aliqua sunt irure sunt fugiat ipsum eu. Consequat ea sit consequat esse.\n\nAdipisicing adipisicing voluptate duis ullamco sint anim sunt nostrud deserunt minim velit aute nisi et. Do ea cupidatat culpa eu qui. Lorem enim laboris amet officia fugiat nisi Lorem laborum ex. Aliquip nostrud sit esse nisi labore.\n\nId amet tempor tempor Lorem fugiat culpa. Elit nulla pariatur adipisicing proident. In qui esse eiusmod ad est minim ipsum mollit aute mollit ad duis aliqua.\n\nCheers!\nDiana Walsh', + attachments: [ + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + }, + { + type : 'application/pdf', + name : 'montly-invoice.pdf', + size : 243449, + preview : 'pdf', + downloadUrl: '' + }, + { + type : 'image/jpeg', + name : 'mystery-forest.jpg', + size : 15539, + preview : 'mystery-forest_preview.jpg', + downloadUrl: '' + } + ], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '4c3bd79a-6429-466d-b962-8eb09c524969', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-08.jpg', + contact: 'Mckinney Marsh ' + }, + to : 'me ', + date : new Date('Wed Jun 20 2018 15:24:03 GMT+0000 (UTC)').toISOString(), + subject : 'Adipisicing proident laborum qui deserunt adipisicing exercitation id sint', + content : 'Hi Brian,\n\nAmet eiusmod est ipsum fugiat. Laborum dolor exercitation esse nostrud cillum. Sunt laboris culpa incididunt ullamco sint veniam dolore tempor non irure ipsum. Laborum quis dolore dolor veniam quis exercitation sint dolore tempor occaecat pariatur officia. Non labore consectetur elit laborum exercitation ut exercitation pariatur Lorem.\n\nExercitation cillum sint exercitation incididunt laboris ut veniam irure sit. Id voluptate esse dolore in fugiat sit sint labore ex ea. Lorem laborum officia occaecat ipsum adipisicing do nostrud proident. Adipisicing fugiat anim aute amet consequat labore non et enim veniam anim. Elit do pariatur pariatur nulla consectetur sit anim cillum cillum.\n\nId qui pariatur enim laborum eu qui. Fugiat sint duis nisi culpa non. Labore cupidatat magna dolor eu et. Anim nulla elit ut eiusmod et excepteur aute culpa labore aliquip.\n\nCheers!\nMckinney Marsh', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '770d24d1-1b9b-49ec-bcb4-f6feffc305ff', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-09.jpg', + contact: 'Meyer Fuller ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Wed Jan 31 2018 08:17:08 GMT+0000 (UTC)').toISOString(), + subject : 'Excepteur sunt ut ipsum ad culpa aliqua quis', + content : 'Hey Brian,\n\nCupidatat cupidatat irure culpa est dolore qui laborum adipisicing occaecat nulla officia deserunt fugiat aliqua. Dolor quis sunt aliqua officia culpa esse eiusmod eiusmod ad laboris. Sit deserunt cillum ad cillum minim officia in velit fugiat aliqua ullamco duis elit. Anim incididunt consequat ex amet duis tempor voluptate cillum officia exercitation culpa dolor enim.\n\nEa velit minim officia fugiat culpa nostrud. Ex aute amet veniam anim consequat dolor Lorem sint. Sunt culpa cillum magna est veniam adipisicing. Reprehenderit eu tempor duis veniam velit Lorem elit amet amet ut anim do dolor.\n\nOfficia minim eiusmod et reprehenderit est proident aute amet non nulla fugiat. Proident enim ea cupidatat dolore ea id ad. Qui et eu adipisicing esse mollit mollit exercitation velit in. Consequat mollit magna est quis est duis proident sunt eu officia reprehenderit. Elit esse incididunt adipisicing consequat culpa aliquip deserunt dolore ullamco velit mollit sit sit Lorem. Do quis qui quis veniam aliqua consequat excepteur.\n\nCheers!\nMeyer Fuller', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '3e2100de-ca0a-4a8e-a1c5-6c13172333dc', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-06.jpg', + contact: 'Carolina Wade ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sat Mar 24 2018 17:50:27 GMT+0000 (UTC)').toISOString(), + subject : 'In sunt pariatur sunt sint exercitation', + content : 'Hey Brian,\n\nReprehenderit proident mollit non eu mollit eu. Mollit exercitation non enim commodo sit eu eiusmod est cupidatat esse magna sint quis dolore. Esse deserunt ea sunt quis tempor est deserunt qui proident Lorem. Adipisicing dolore non laboris proident. Incididunt fugiat labore proident eu et ad magna tempor ipsum nostrud adipisicing eiusmod eu.\n\nNisi excepteur ullamco minim laboris sit labore tempor officia commodo officia sit enim qui occaecat. Quis ullamco enim minim voluptate consectetur mollit elit voluptate fugiat. Laboris sint eu magna ullamco laboris aliquip duis laboris sit enim reprehenderit occaecat labore. Mollit nulla magna et labore officia et voluptate fugiat non commodo esse et laboris exercitation.\n\nLaboris amet Lorem sint in. Quis nulla sit et non qui fugiat et culpa pariatur incididunt duis. Dolor tempor incididunt Lorem irure anim velit tempor voluptate.\n\nKind Regards,\nCarolina Wade', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'e1291d1a-fba6-4b23-b259-dd7c9074e976', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-10.jpg', + contact: 'Graves Huber ' + }, + to : 'me ', + date : new Date('Sun Mar 25 2018 02:46:44 GMT+0000 (UTC)').toISOString(), + subject : 'Elit est aute anim ea culpa labore occaecat adipisicing officia', + content : 'Dear Brian,\n\nAd ex enim mollit quis nostrud nulla quis non minim voluptate cillum sint tempor mollit. Culpa anim occaecat aliquip do. Aliquip velit minim irure nostrud commodo eiusmod consequat ipsum consectetur deserunt dolore. Pariatur dolor dolore consectetur dolor aliqua dolor dolor deserunt minim commodo.\n\nAd qui qui ex et irure eiusmod. Excepteur esse fugiat officia non ex excepteur minim sint voluptate in incididunt. Exercitation culpa laboris non consequat excepteur pariatur est consequat aliquip occaecat ullamco laborum culpa. Ut fugiat duis incididunt incididunt excepteur enim sunt in amet irure nulla. Commodo officia fugiat do nostrud adipisicing sint voluptate voluptate dolor laboris. Nisi id aliqua quis id ullamco reprehenderit enim elit in magna. Proident consectetur voluptate id mollit sint do ipsum id sint proident.\n\nLaboris mollit nulla culpa veniam est dolor fugiat id consequat nulla veniam enim enim. Ullamco sunt proident fugiat cillum labore nostrud incididunt exercitation esse. Labore aliqua est non consequat in excepteur ullamco cupidatat aute nostrud proident. Consectetur enim veniam eiusmod incididunt culpa qui ipsum ea elit non nostrud reprehenderit incididunt veniam. Sint amet Lorem ipsum et dolore pariatur anim consectetur.\n\nBest Regards,\nGraves Huber', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '7cba834c-3011-4897-be7d-ee43bbe69114', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-11.jpg', + contact: 'Tucker Santiago ' + }, + to : 'me ', + date : new Date('Mon Sep 17 2018 14:41:42 GMT+0000 (UTC)').toISOString(), + subject : 'Ullamco qui ex eu ea officia labore incididunt', + content : 'Dear Brian,\n\nNon tempor sint incididunt adipisicing cupidatat laboris elit incididunt ipsum magna. Voluptate labore cillum irure dolor eu est commodo nulla. Cupidatat aliquip reprehenderit proident duis labore aliquip ullamco dolor occaecat anim esse tempor enim dolore. Elit veniam minim cupidatat aute ea voluptate eu et labore amet eu tempor.\n\nExercitation et exercitation labore cillum reprehenderit eiusmod anim magna ex. Lorem aliqua est velit eu. Qui et ullamco adipisicing elit eiusmod aliquip exercitation laboris consequat esse. Sint velit deserunt est quis ad proident sit eiusmod commodo eiusmod Lorem. Est consequat cillum magna est. Sunt pariatur voluptate elit officia aute.\n\nConsectetur velit deserunt non enim exercitation esse irure aliqua cillum sint in officia Lorem esse. Adipisicing consequat anim magna exercitation mollit. Ipsum irure in culpa mollit cillum eiusmod sunt amet consectetur anim eiusmod ea.\n\nBest Regards,\nTucker Santiago', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : 'd0de071d-2d72-4e0f-b903-79ca6ade9dbd', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-07.jpg', + contact: 'Becky Cain ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Nov 30 2018 09:14:15 GMT+0000 (UTC)').toISOString(), + subject : 'Exercitation amet laborum officia nulla nulla adipisicing mollit culpa eiusmod irure deserunt voluptate laborum', + content : 'Dear Brian,\n\nAd tempor veniam exercitation et occaecat do quis do cillum nulla mollit mollit nulla minim. Id sint do excepteur pariatur eu pariatur do sint ipsum ea. Enim in ex irure eu incididunt aliqua eu velit ipsum magna elit eu.\n\nCupidatat fugiat proident aliqua labore nostrud Lorem veniam tempor dolor exercitation. Aliqua magna pariatur exercitation voluptate do duis ea voluptate est culpa sint id. Irure labore esse adipisicing culpa ad velit consectetur. Sint mollit voluptate tempor exercitation fugiat consectetur cillum officia non dolor.\n\nIpsum amet esse duis duis est voluptate ipsum ipsum ipsum qui labore exercitation veniam. Proident sint incididunt ut sunt ut labore sunt ex. Ea enim velit qui elit non sit excepteur dolore eiusmod.\n\nKind Regards,\nBecky Cain', + attachments: [ + { + type : 'image/jpeg', + name : 'mystery-forest.jpg', + size : 15539, + preview : 'mystery-forest_preview.jpg', + downloadUrl: '' + }, + { + type : 'image/png', + name : 'lake-of-carezza.png', + size : 13071, + preview : 'lake-of-carrezza_preview.png', + downloadUrl: '' + }, + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + } + ], + starred : false, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'd39c93b9-10d3-426f-a205-0ee5b30cd983', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-12.jpg', + contact: 'Miller Vazquez ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sun May 06 2018 19:35:14 GMT+0000 (UTC)').toISOString(), + subject : 'Ullamco eu nulla labore occaecat', + content : 'Hey Brian,\n\nIrure reprehenderit enim anim ad ex officia qui. Cillum amet reprehenderit aliquip minim adipisicing. Sint sit tempor non nostrud esse adipisicing eu.\n\nLabore dolor sint minim enim officia voluptate. Eu esse est velit ipsum ullamco amet anim aliquip culpa sit laborum velit. Eiusmod est nulla dolor duis voluptate deserunt. Labore do qui amet laborum tempor anim. Do aliqua est anim consequat proident minim. Commodo eiusmod labore elit sunt irure labore proident non ipsum in eiusmod laboris sit. Ad nostrud cupidatat ea est veniam commodo culpa laboris mollit id.\n\nLabore aute fugiat commodo sint aliquip ullamco sint esse. Deserunt aliqua amet tempor Lorem pariatur. Eiusmod proident reprehenderit pariatur cupidatat. Ad consequat laboris nisi in ipsum nisi dolor et velit duis do ad. Ipsum minim reprehenderit quis incididunt culpa. Et laborum laborum quis in elit nisi proident cillum sit ad. Nisi ullamco aliquip elit nisi sint sunt enim est commodo aute aliquip cupidatat eiusmod adipisicing.\n\nBest Regards,\nMiller Vazquez', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '4e881b4f-bf47-472f-a1fe-f787a66d37dd', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-13.jpg', + contact: 'Delgado Stevens ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Wed Jan 17 2018 09:56:25 GMT+0000 (UTC)').toISOString(), + subject : 'Ut velit occaecat nostrud ullamco non excepteur velit ipsum ut', + content : 'Hey Brian,\n\nEsse dolore exercitation id sint id eu dolor nisi. Irure consectetur aute eu ad aute velit et tempor ad eiusmod voluptate. Sit proident pariatur anim in culpa ut esse nostrud incididunt ullamco ut. Proident nostrud est voluptate sint nostrud dolore amet dolore culpa eiusmod enim voluptate in. Do qui voluptate ex aliqua ut.\n\nQui ullamco incididunt nulla adipisicing tempor aute commodo eu adipisicing. Tempor exercitation tempor adipisicing ipsum incididunt mollit commodo adipisicing. Cupidatat officia in ut duis non commodo ut.\n\nCulpa eiusmod mollit culpa nostrud ullamco irure. Est adipisicing ut irure Lorem esse. Deserunt deserunt non sit sit labore et minim fugiat irure Lorem et velit.\n\nKind Regards,\nDelgado Stevens', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '5dad8b60-8d98-4215-88b8-41158e167686', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-08.jpg', + contact: 'Concepcion Cleveland ' + }, + to : 'me ', + date : new Date('Fri Aug 17 2018 04:41:26 GMT+0000 (UTC)').toISOString(), + subject : 'Aliqua pariatur non tempor velit eu amet sit et proident Lorem', + content : 'Hey Brian,\n\nPariatur anim aute excepteur consequat esse aliqua proident culpa duis duis veniam occaecat cupidatat eu. Lorem officia occaecat duis et exercitation mollit consectetur pariatur ut sit exercitation. Velit consectetur incididunt ad non nostrud dolor consequat esse deserunt. Nisi consectetur ea ut cupidatat ipsum. Sint cillum cupidatat elit laboris incididunt consectetur veniam fugiat sit voluptate officia.\n\nCillum est dolore et aliqua elit pariatur cupidatat eiusmod officia. Nisi officia velit commodo id anim qui commodo aliquip mollit. Quis magna sunt in duis laboris fugiat veniam. Proident consequat deserunt sunt amet officia veniam.\n\nIrure irure aliqua officia deserunt. Excepteur excepteur magna Lorem minim esse in sit. Magna elit laborum sunt magna labore eu eiusmod qui aliqua laborum.\n\nCheers!\nConcepcion Cleveland', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'eeccc250-8952-47e1-adff-31847289b4dd', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-09.jpg', + contact: 'Robin Berger ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Apr 26 2018 20:55:18 GMT+0000 (UTC)').toISOString(), + subject : 'Reprehenderit ipsum aute cupidatat qui exercitation dolore voluptate labore veniam consequat quis', + content : 'Hello Brian,\n\nExercitation minim anim commodo eu deserunt voluptate consectetur. Sit enim excepteur ipsum ea esse labore fugiat nulla. Do est tempor duis in consectetur proident do consectetur. Cupidatat ex id voluptate fugiat aute Lorem elit tempor.\n\nMinim nulla occaecat mollit laboris ea et laboris velit. Velit ullamco quis esse veniam exercitation veniam quis nostrud qui officia commodo. Lorem excepteur magna officia in eu exercitation qui ad. Nisi velit qui ipsum anim veniam deserunt velit adipisicing tempor esse excepteur ipsum. Voluptate sit dolore irure deserunt dolor incididunt laboris tempor. Minim id deserunt ea duis labore incididunt est ullamco mollit pariatur sit duis commodo. Proident ipsum eiusmod ea excepteur.\n\nIrure adipisicing veniam dolor consequat sit incididunt ad cupidatat fugiat eiusmod aliqua id amet labore. Excepteur minim deserunt eiusmod sunt aliqua ipsum. Ullamco nostrud minim ullamco amet Lorem ut irure officia mollit duis enim. Laborum dolore dolor nulla consequat consequat nostrud velit eu deserunt aute deserunt est. Adipisicing laborum dolore pariatur ad tempor culpa exercitation consequat eu anim nulla magna. In est culpa tempor laborum voluptate.\n\nKind Regards,\nRobin Berger', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'e8b006ad-e140-4fea-bb32-cc346e66eb93', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-10.jpg', + contact: 'Lynnette Burton ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Fri Nov 02 2018 16:15:50 GMT+0000 (UTC)').toISOString(), + subject : 'Consectetur deserunt qui ex occaecat dolore officia cillum magna magna adipisicing elit magna velit', + content : 'Hi Brian,\n\nNulla mollit excepteur ex officia anim cillum eiusmod. Fugiat ullamco ad eu elit Lorem eiusmod veniam ut ipsum cillum culpa. Dolore commodo ea quis labore qui irure velit duis nostrud aute dolore non amet dolor. Qui ullamco elit reprehenderit anim tempor aliquip mollit id pariatur voluptate cupidatat anim voluptate. Exercitation nostrud sint adipisicing ad consectetur. Culpa officia occaecat aute pariatur duis occaecat mollit ea deserunt ipsum. Adipisicing non ipsum sint quis mollit consectetur occaecat anim sint.\n\nOfficia ea excepteur elit non. Velit aute ad consequat deserunt labore culpa consectetur ullamco occaecat ullamco qui laborum labore. Magna consequat dolore proident incididunt adipisicing exercitation sint anim et laboris occaecat quis. Tempor do anim magna ullamco reprehenderit aliqua et laboris non nostrud sunt. Elit aliquip irure officia reprehenderit voluptate nisi officia ex. Quis mollit sit qui eiusmod veniam eu non. Eiusmod ullamco velit occaecat pariatur ea.\n\nCillum velit sit duis esse dolor do velit sit Lorem. Enim occaecat voluptate excepteur irure anim officia nisi culpa. Quis fugiat cupidatat veniam deserunt pariatur. Exercitation ad irure nulla cupidatat nisi nostrud Lorem proident veniam ullamco labore dolore velit. Reprehenderit eiusmod ea cillum sit anim nostrud proident consequat nostrud duis adipisicing.\n\nKind Regards,\nLynnette Burton', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'c6fc1d86-4a1f-4071-9c75-618fe2d853aa', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-11.jpg', + contact: 'Carmella Rios ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Jul 05 2018 14:26:57 GMT+0000 (UTC)').toISOString(), + subject : 'Proident dolore minim deserunt commodo elit aute laborum ullamco laboris anim consequat', + content : 'Dear Brian,\n\nIn do ex sit amet fugiat duis eu non non duis id sit. Elit pariatur nostrud veniam Lorem aliquip tempor ipsum ut minim eiusmod ad. Sunt et veniam ad incididunt sint occaecat. Exercitation voluptate culpa ex enim. Excepteur exercitation aute consequat non culpa. Lorem ut consectetur commodo laboris esse exercitation laborum do ut duis sunt sint. Aliquip laboris fugiat officia irure consequat pariatur velit ea ut commodo.\n\nIpsum adipisicing proident cupidatat commodo nulla culpa nostrud ipsum voluptate occaecat sit. Occaecat anim cupidatat qui reprehenderit ex commodo dolore. Consectetur id magna esse amet do nulla esse aute velit id minim nostrud cupidatat. Nostrud dolore sunt labore sunt sit velit magna nulla. Sunt enim adipisicing sint deserunt enim veniam reprehenderit reprehenderit. Incididunt fugiat labore minim pariatur mollit ea veniam. Do voluptate id consequat qui ut aliqua qui dolore ex ea.\n\nDo esse duis culpa nisi in elit veniam exercitation consequat. Proident dolor laborum enim velit non nostrud. In reprehenderit proident enim sint tempor cupidatat enim fugiat. Duis laboris officia sit in sunt sunt sunt non. Quis mollit veniam cupidatat non enim Lorem aliquip et sit fugiat eiusmod cillum ad exercitation.\n\nCheers!\nCarmella Rios', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : 'c062a90f-52e9-4102-8def-1f8f9813deb4', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-14.jpg', + contact: 'Molina Pace ' + }, + to : 'me ', + date : new Date('Mon Sep 17 2018 21:45:31 GMT+0000 (UTC)').toISOString(), + subject : 'Dolor anim non labore est aliquip sunt pariatur', + content : 'Hi Brian,\n\nNon fugiat eu aute nulla deserunt Lorem id fugiat consectetur duis ut reprehenderit nostrud. Laboris culpa id nulla duis id proident. Eiusmod consequat commodo aute est deserunt aliquip esse aute qui aute et nostrud culpa.\n\nCillum minim reprehenderit sit nulla aliqua adipisicing deserunt non sit excepteur fugiat velit et. Amet excepteur non ipsum voluptate dolore irure. Laboris sit sunt id mollit et in nulla eiusmod duis ut tempor ea est. Dolor est laborum ipsum labore sint aliquip est minim ex. Aliqua cillum qui consectetur amet elit nostrud quis duis. Dolore consequat laborum laboris ullamco qui do cupidatat sunt deserunt ex elit cillum.\n\nVeniam exercitation eiusmod exercitation cupidatat sunt incididunt. Labore occaecat eiusmod sint consectetur eiusmod sunt quis ad Lorem ex. Ipsum labore ipsum nulla Lorem incididunt proident. Sit officia ut nostrud nisi ipsum adipisicing qui. Non nulla commodo nostrud aliqua Lorem consequat ea do dolore nisi veniam veniam occaecat. Tempor amet ex eiusmod irure aliquip minim. Laborum officia fugiat nisi magna.\n\nBest Regards,\nMolina Pace', + attachments: [ + { + type : 'image/jpeg', + name : 'birds-eye-sydney.jpg', + size : 14294, + preview : 'birds-eye-sydney_preview.jpg', + downloadUrl: '' + }, + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + } + ], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '545d12a6-e0f3-464d-af45-618163933a71', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-12.jpg', + contact: 'Olga Osborn ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Thu Sep 27 2018 13:45:14 GMT+0000 (UTC)').toISOString(), + subject : 'Elit tempor enim nisi cillum cillum esse do magna exercitation minim', + content : 'Dear Brian,\n\nEu voluptate dolore anim deserunt nostrud pariatur voluptate exercitation et et veniam fugiat sint consequat. Aute esse pariatur ullamco reprehenderit velit pariatur mollit sunt enim culpa qui anim sit officia. Labore minim elit commodo sunt fugiat in sint adipisicing aute incididunt adipisicing in officia esse. Sit enim eu irure ullamco ea pariatur dolore exercitation labore excepteur laborum exercitation dolore. Magna dolor Lorem fugiat eiusmod consectetur sit.\n\nExcepteur sunt officia minim in do esse. Nostrud ullamco dolore esse laborum aliquip sit consequat. Excepteur irure occaecat cupidatat cupidatat deserunt esse deserunt voluptate non labore culpa. Sit voluptate non eu sit. Velit pariatur esse et ex in laboris cillum Lorem tempor consequat. Magna consequat nostrud duis minim. In ad irure commodo deserunt incididunt duis sit quis voluptate ullamco laboris laborum commodo.\n\nIn duis eiusmod proident excepteur. Magna proident do ad est amet pariatur sint cupidatat ullamco velit cillum. Ea esse proident non culpa do in minim eiusmod.\n\nCheers!\nOlga Osborn', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '23456530-2cd4-4558-95d0-6311c2ee2ee8', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-13.jpg', + contact: 'Brooke Petersen ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sun Jul 22 2018 14:49:16 GMT+0000 (UTC)').toISOString(), + subject : 'Anim laboris aliquip excepteur consectetur eu enim sunt velit qui deserunt', + content : 'Hello Brian,\n\nConsequat velit voluptate exercitation sint anim laboris. Consectetur dolor sunt veniam incididunt ad laboris proident tempor voluptate enim excepteur. Nostrud eu id tempor cupidatat. Deserunt ullamco consequat esse et. Dolore qui cupidatat commodo ea nisi tempor velit sit aliquip amet.\n\nMagna fugiat cupidatat mollit mollit. Consectetur consequat occaecat pariatur commodo quis labore est cillum voluptate culpa tempor elit incididunt. Voluptate anim est eiusmod voluptate ipsum commodo do et elit. Aute pariatur adipisicing eu laboris proident Lorem qui enim magna adipisicing deserunt pariatur. Fugiat eiusmod occaecat dolor tempor sunt exercitation est amet mollit est. Est in duis adipisicing nostrud aute voluptate quis in fugiat veniam reprehenderit.\n\nIpsum id deserunt ex non nisi nostrud enim pariatur nulla. In labore qui esse veniam ut. Est id ut pariatur esse nulla dolore aliqua ad aliqua fugiat. Ad incididunt amet culpa labore enim proident tempor. Aliquip non dolore sunt eu deserunt tempor anim qui dolore quis. Est sunt enim ipsum aliqua.\n\nKind Regards,\nBrooke Petersen', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'affeecf6-e3c5-4377-8070-96f5ed9c6500', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-15.jpg', + contact: 'Estes Walter ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Jul 17 2018 03:52:54 GMT+0000 (UTC)').toISOString(), + subject : 'Reprehenderit ad do quis ut fugiat proident labore', + content : 'Hello Brian,\n\nFugiat labore incididunt aute sint id laboris nisi eiusmod reprehenderit. Sint sint Lorem aute cillum velit occaecat sit quis laboris ipsum laborum. Ex ipsum ea proident duis ex nostrud dolore exercitation nostrud ullamco cupidatat irure dolor. In aliqua occaecat commodo irure dolore. Nisi laborum anim cillum aute adipisicing labore fugiat velit officia cupidatat aliquip voluptate veniam. Aute incididunt consequat est id commodo elit occaecat ea Lorem deserunt est.\n\nPariatur deserunt sunt excepteur nisi ex. Enim consequat esse in deserunt ut. Cillum incididunt exercitation fugiat reprehenderit amet dolor nulla irure id quis.\n\nEnim id incididunt labore commodo voluptate. Non sint sint in eu anim dolor aliquip ullamco occaecat esse id consectetur cupidatat. Mollit aute nisi et fugiat consequat.\n\nKind Regards,\nEstes Walter', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'cb00d05c-6660-4dbb-a794-f22cff93f001', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-16.jpg', + contact: 'Holman Oconnor ' + }, + to : 'me ', + date : new Date('Sat Jan 13 2018 22:30:44 GMT+0000 (UTC)').toISOString(), + subject : 'Duis dolore eu sint anim ipsum commodo esse cillum ipsum culpa commodo', + content : 'Dear Brian,\n\nDolore amet sunt ullamco enim quis tempor enim pariatur nostrud id nulla adipisicing. Reprehenderit amet ex ullamco pariatur proident et amet consequat ipsum sit ut. Laboris fugiat nulla consequat nulla qui tempor dolore dolore minim nisi. Excepteur non est pariatur cupidatat adipisicing veniam ea cillum ex duis laborum ullamco.\n\nDo quis cupidatat adipisicing sint minim veniam velit amet nulla nisi tempor voluptate nulla adipisicing. Ex dolor adipisicing dolor ad cupidatat consectetur cillum ex. Non velit laborum fugiat est fugiat officia esse ullamco. Ut amet sit mollit dolor. Sit ipsum reprehenderit consectetur excepteur. Enim ad aliqua consequat ipsum labore laborum culpa aliqua dolor voluptate.\n\nVelit cupidatat labore sint id excepteur anim qui do do non. Esse tempor aute nisi aliqua velit ad elit nulla pariatur aliqua consectetur. Proident pariatur mollit cupidatat ullamco est velit ullamco dolore. Ipsum sunt reprehenderit consequat eu dolore nisi nostrud ipsum cillum. Quis non esse fugiat ipsum ad laboris aliquip eiusmod deserunt qui ipsum aliqua consequat duis. Ad nisi sunt sint ut officia adipisicing labore voluptate commodo ullamco exercitation.\n\nKind Regards,\nHolman Oconnor', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '7bd27a67-df7c-4a2d-8042-1fb8a690d98e', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-17.jpg', + contact: 'Oneill Irwin ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sat Nov 17 2018 08:17:34 GMT+0000 (UTC)').toISOString(), + subject : 'Eu in ut dolor amet consequat aute esse non fugiat minim cillum sunt aliquip cillum', + content : 'Dear Brian,\n\nNostrud sint ea laboris excepteur dolor nisi mollit dolor voluptate irure ex. Laboris adipisicing id ad minim minim magna nostrud nulla quis nulla tempor. Qui incididunt velit qui et proident eu in tempor in aliqua reprehenderit nostrud aute nulla. Nisi officia fugiat officia irure cillum qui adipisicing qui. Culpa duis sunt aute nostrud elit esse sit ullamco commodo ex.\n\nVeniam Lorem est minim sint ut aliqua ut est exercitation ad aliquip ullamco in culpa. Amet qui do adipisicing magna eu reprehenderit anim enim. Ipsum consequat ut eiusmod irure amet commodo aliqua sint aliquip non nulla. Irure excepteur tempor in ullamco sit culpa labore dolor enim sit. Nostrud eiusmod ex nulla exercitation est esse velit dolore aliqua eiusmod sit. Elit dolore id proident fugiat culpa anim ea Lorem eiusmod aliqua ex culpa in tempor.\n\nDeserunt officia id excepteur esse nisi elit labore irure. Et sint dolor ex incididunt ipsum dolore in mollit tempor. Qui cillum consequat laboris non culpa laborum amet cillum mollit laboris anim duis pariatur consequat. Ipsum fugiat cupidatat proident magna nisi consectetur adipisicing minim labore. Officia consequat quis labore sunt.\n\nKind Regards,\nOneill Irwin', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : 'ccfb3a90-e18c-4645-8c00-4357d9bcd321', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-14.jpg', + contact: 'Marcie Morgan ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Nov 20 2018 05:55:32 GMT+0000 (UTC)').toISOString(), + subject : 'Magna velit cillum dolor reprehenderit aliqua ut aute nisi in sunt Lorem laboris elit do', + content : 'Hi Brian,\n\nCommodo id eu mollit dolor laboris incididunt exercitation labore duis eu mollit labore labore labore. Cupidatat fugiat aute non consequat eiusmod in Lorem. Consequat officia ullamco minim aliquip aliqua.\n\nIrure elit ipsum minim ad Lorem. In amet Lorem aute minim id consequat nulla. Tempor ipsum incididunt occaecat sit ipsum adipisicing pariatur magna aliquip adipisicing quis id pariatur est. Tempor sit dolor aute do aliqua. Est cillum adipisicing ut aliquip adipisicing est nostrud tempor tempor culpa laboris occaecat. Ipsum culpa veniam sit aliqua ad culpa Lorem esse pariatur incididunt adipisicing irure ea. Sunt nostrud do quis tempor reprehenderit anim dolore mollit fugiat nisi.\n\nPariatur nostrud id occaecat dolor sunt. Ipsum dolore ex minim ex tempor sint ad elit eiusmod ipsum veniam. Aliquip occaecat nisi sunt aliquip id. Reprehenderit aliquip nisi ea culpa eu commodo Lorem consectetur.\n\nKind Regards,\nMarcie Morgan', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'a18b1961-ad32-4d00-984f-afef8ee0f4e9', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-18.jpg', + contact: 'Crane Trevino ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sat Nov 03 2018 01:52:28 GMT+0000 (UTC)').toISOString(), + subject : 'Tempor consectetur officia excepteur culpa', + content : 'Dear Brian,\n\nExercitation in non sint adipisicing reprehenderit eu est aute aute quis Lorem. Magna labore nisi amet magna do in. Eiusmod fugiat mollit mollit minim aute. Voluptate qui sunt eiusmod aliquip pariatur consectetur et culpa laborum dolore. Exercitation ad incididunt exercitation voluptate sit qui eu incididunt sit.\n\nVoluptate cillum qui proident dolore tempor excepteur aute magna esse ex est culpa in. Officia officia quis veniam sunt irure eu. Voluptate ullamco velit culpa laboris anim commodo esse sunt minim esse nostrud ea. Est eiusmod commodo occaecat anim sint exercitation. Sunt irure nisi est sit excepteur aute amet. Non labore ullamco tempor nostrud nostrud ea do nostrud Lorem veniam in. Dolor est esse duis aute.\n\nEnim fugiat sunt et ut officia fugiat reprehenderit. Id cupidatat qui occaecat proident incididunt deserunt nisi magna enim dolore. Dolor aute anim ex tempor nisi ex minim sint reprehenderit ex ullamco ullamco culpa ipsum. Voluptate occaecat esse consequat non aliqua proident. Deserunt exercitation Lorem ea nisi consequat et culpa pariatur. Incididunt commodo deserunt dolore irure ea sint ipsum ad voluptate.\n\nBest Regards,\nCrane Trevino', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '3aaa5e3f-b8b5-47fc-9967-5f65dd8c7251', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-15.jpg', + contact: 'Kristine Wiggins ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Jan 09 2018 13:55:10 GMT+0000 (UTC)').toISOString(), + subject : 'Magna aute enim magna aliqua aliquip enim elit eiusmod nulla nostrud', + content : 'Hi Brian,\n\nCulpa incididunt qui nulla velit consectetur. Exercitation ut voluptate proident commodo non deserunt. Consectetur anim aute sunt aliquip fugiat laborum tempor exercitation duis sint excepteur ullamco culpa consequat. Aliqua ex quis pariatur excepteur commodo adipisicing ut anim et. Duis ex sit ex nulla proident est consequat aliquip. Quis exercitation labore veniam anim sit irure laborum occaecat laborum labore cillum sunt nulla. Exercitation laborum sunt consequat aliqua.\n\nLabore fugiat ullamco quis incididunt quis duis consectetur aute incididunt cupidatat cupidatat deserunt. Cillum fugiat ex minim tempor consectetur duis labore reprehenderit excepteur enim anim qui. Reprehenderit pariatur aliqua mollit in amet id. Duis anim nostrud incididunt adipisicing incididunt velit minim tempor adipisicing est elit ipsum duis.\n\nFugiat nostrud ad enim officia est. Voluptate velit in pariatur cupidatat irure dolor eiusmod voluptate irure voluptate ad reprehenderit est. Esse aute aliquip aute minim amet pariatur minim tempor nostrud consectetur. Sunt reprehenderit excepteur occaecat ea reprehenderit eiusmod duis cupidatat sunt nulla fugiat et velit elit. Do ut tempor cillum nisi. Magna sint do et mollit cupidatat ad culpa voluptate.\n\nKind Regards,\nKristine Wiggins', + attachments: [ + { + type : 'application/pdf', + name : 'account-details.pdf', + size : 127844, + preview : 'pdf', + downloadUrl: '' + }, + { + type : 'image/jpeg', + name : 'mystery-forest.jpg', + size : 15539, + preview : 'mystery-forest_preview.jpg', + downloadUrl: '' + }, + { + type : 'image/jpeg', + name : 'birds-eye-sydney.jpg', + size : 14294, + preview : 'birds-eye-sydney_preview.jpg', + downloadUrl: '' + } + ], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '0f72d2d0-bea4-4c0f-ace0-0be9f14c37f1', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-16.jpg', + contact: 'Terrie Carney ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Jan 23 2018 00:03:55 GMT+0000 (UTC)').toISOString(), + subject : 'Laboris in incididunt labore labore deserunt deserunt nostrud mollit voluptate non ex', + content : 'Hello Brian,\n\nReprehenderit veniam fugiat sunt in nulla anim commodo magna ex nulla. Mollit nostrud eiusmod aute veniam. Sint do cupidatat velit sit amet.\n\nUllamco elit anim veniam culpa veniam velit. Nisi aute esse consectetur ea occaecat ea laboris eu. Velit proident quis mollit nulla mollit dolor ad commodo. Non deserunt ipsum id dolor est ad consectetur sunt commodo adipisicing in irure.\n\nCupidatat consequat officia adipisicing amet esse veniam veniam elit veniam sint nulla quis qui commodo. Ipsum nisi deserunt pariatur nostrud in. Sint duis pariatur esse do duis proident consequat ullamco excepteur mollit nulla veniam non. Reprehenderit incididunt ipsum duis dolor nulla fugiat fugiat culpa laboris velit sint.\n\nKind Regards,\nTerrie Carney', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : 'f825c5a3-2be8-4d48-9c4e-da60ff0e63f3', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-19.jpg', + contact: 'Goff Jennings ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Tue Aug 07 2018 05:20:39 GMT+0000 (UTC)').toISOString(), + subject : 'Labore sint dolor nulla nostrud commodo amet nisi mollit commodo eiusmod duis quis irure non', + content : 'Dear Brian,\n\nNisi sit ut in do aliqua nostrud consectetur incididunt. Non et pariatur nulla mollit aute aliquip amet minim irure tempor eu id ipsum. Velit sunt tempor proident voluptate ad reprehenderit. Dolor consectetur est in nulla. Reprehenderit incididunt magna deserunt mollit officia non aliqua. Elit est dolore ea Lorem velit ipsum occaecat cupidatat. Mollit magna laborum qui sit sunt mollit amet.\n\nDuis excepteur labore laboris adipisicing culpa culpa eiusmod et velit aliquip velit. Proident tempor in excepteur minim irure duis ex in non est. Labore minim sunt culpa enim tempor labore ea adipisicing nulla elit magna. Fugiat enim ex voluptate officia pariatur pariatur ipsum eu in. Veniam commodo occaecat laborum excepteur nisi Lorem.\n\nExcepteur adipisicing amet ea commodo dolor nisi labore deserunt adipisicing pariatur. Pariatur magna et esse id occaecat minim minim. Labore cupidatat tempor deserunt reprehenderit anim duis magna laborum excepteur aliquip consectetur.\n\nBest Regards,\nGoff Jennings', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'e6dc9600-a3ab-4571-b2f2-ed00ee08e163', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-20.jpg', + contact: 'Browning Sanchez ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Fri Mar 16 2018 20:31:08 GMT+0000 (UTC)').toISOString(), + subject : 'Mollit cupidatat commodo consectetur duis ea elit est sint sunt ea qui nostrud incididunt', + content : 'Hey Brian,\n\nVelit ut elit ex voluptate nisi nostrud sunt pariatur dolore est dolor deserunt sint nostrud. Aute magna ipsum cillum cillum tempor voluptate cupidatat sunt eiusmod officia sit. Aliqua adipisicing officia adipisicing dolore id nulla nulla irure non enim esse anim. Tempor occaecat excepteur duis ex aliquip eu reprehenderit labore ea. Adipisicing anim amet culpa culpa cillum elit cupidatat consequat laboris.\n\nEx dolore fugiat incididunt deserunt deserunt quis elit ipsum. Exercitation dolore dolore deserunt eu voluptate deserunt non id duis incididunt. Dolor proident quis enim cillum fugiat. Ex nisi pariatur aliqua exercitation. Incididunt laborum pariatur deserunt anim laboris sint consequat aliqua nostrud sint. Elit tempor laboris do tempor eu minim sunt proident.\n\nAmet aute esse minim qui sit pariatur aliquip laborum. Irure nulla sit laboris dolor reprehenderit veniam occaecat non commodo do qui. Eiusmod pariatur dolor consectetur qui quis occaecat. Et consectetur occaecat nulla elit officia nostrud. Est aute est nisi dolor mollit sunt et aliqua aliqua nulla labore cupidatat. Do pariatur aliquip cillum ullamco. Nostrud tempor consectetur eu nisi incididunt in voluptate est.\n\nKind Regards,\nBrowning Sanchez', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '0f22fedf-ea89-414e-91a4-0df0d9501ef2', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-01.jpg', + contact: 'Carey Lyons ' + }, + to : 'me ', + date : new Date('Tue May 01 2018 07:56:59 GMT+0000 (UTC)').toISOString(), + subject : 'Laboris esse ipsum esse eu do ipsum do incididunt', + content : 'Hello Brian,\n\nIpsum elit ut magna occaecat dolor sint reprehenderit eu incididunt sunt irure esse mollit. Sit fugiat amet laborum ullamco sit laborum Lorem irure minim ut. Labore aliqua dolore minim elit consequat sit. Labore mollit esse ad magna voluptate anim pariatur. Irure enim excepteur adipisicing cillum minim culpa elit nostrud consectetur quis laborum velit. Ea eiusmod aliqua ipsum ad tempor veniam fugiat elit.\n\nDolor mollit adipisicing ut duis cillum proident id sunt non sit cillum. Sit aliqua elit aute tempor cupidatat esse mollit do deserunt cillum velit irure cillum. Ea aliqua Lorem minim cupidatat elit Lorem.\n\nEu deserunt nostrud Lorem reprehenderit sit veniam consectetur proident. Duis elit duis excepteur sit proident est ut est cillum. Sit tempor aliqua qui laborum eu cillum laborum consequat adipisicing sit exercitation. Anim non do consequat duis pariatur. Velit excepteur magna enim tempor occaecat consequat exercitation laborum deserunt.\n\nKind Regards,\nCarey Lyons', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'd942f99b-8925-49f0-b75b-2c48b714b1cf', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-02.jpg', + contact: 'Hendrix Goodwin ' + }, + to : 'me ', + date : new Date('Mon Jan 22 2018 19:04:29 GMT+0000 (UTC)').toISOString(), + subject : 'Magna consectetur occaecat excepteur elit', + content : 'Hello Brian,\n\nSunt consequat elit aliquip sit nulla ad. Voluptate elit qui magna ipsum culpa pariatur laboris nisi sit laboris. Mollit eiusmod ut elit est aliquip nulla ea laborum. Irure ipsum officia cillum labore occaecat esse consequat ut culpa et ut.\n\nAliquip aliquip veniam aute velit aliquip culpa cillum. Eu culpa pariatur in exercitation est nostrud duis quis voluptate. Anim pariatur ipsum aliquip proident et enim veniam duis velit adipisicing id ad exercitation commodo. Sit commodo qui reprehenderit et elit officia in aliquip amet occaecat. Nulla aute officia duis cupidatat cillum. Commodo amet consequat qui ipsum nisi nulla veniam laborum. Et excepteur est irure non officia ipsum sunt fugiat exercitation eu laboris sunt.\n\nElit reprehenderit aute consectetur eiusmod sit pariatur elit fugiat irure id et. In in dolore sunt magna cillum excepteur minim aute. Lorem sint occaecat elit est sint ut ea eiusmod anim esse cillum anim enim. Officia sint velit qui minim veniam ut nisi reprehenderit occaecat laborum qui. Elit eiusmod commodo dolor sunt incididunt labore.\n\nBest Regards,\nHendrix Goodwin', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '036c24e8-d8bc-4f0e-9a72-6fa884d69bb3', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-17.jpg', + contact: 'Leticia Fulton ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sat Mar 31 2018 05:44:48 GMT+0000 (UTC)').toISOString(), + subject : 'Est nostrud labore excepteur quis consectetur proident cupidatat', + content : 'Hello Brian,\n\nOfficia incididunt sint est non aliquip eu deserunt sunt ad minim aliqua excepteur. Cillum dolor nostrud magna sunt nulla aute ut esse dolore magna eu. Dolore minim non dolor aliquip reprehenderit excepteur irure dolore anim incididunt sit. Nulla commodo pariatur consectetur sit reprehenderit amet consectetur duis.\n\nCupidatat tempor commodo aliqua sunt incididunt. Occaecat occaecat eu officia aliqua in exercitation sint commodo aute aliquip laborum consectetur enim. Voluptate do aute irure ullamco. Qui consectetur id aliqua laborum incididunt cupidatat proident ea irure mollit minim.\n\nDolore reprehenderit occaecat enim eu veniam tempor dolor. Aliquip proident tempor aute nostrud ut. Eiusmod consectetur qui mollit ut ut ullamco aliquip exercitation quis dolore irure labore. Nisi officia aliquip pariatur Lorem velit ex cupidatat cillum consequat. Elit ea sunt reprehenderit do minim cillum. Aute irure ad velit quis et adipisicing esse reprehenderit et quis voluptate. Aliquip reprehenderit duis eiusmod eiusmod aliqua mollit amet id cillum deserunt.\n\nCheers!\nLeticia Fulton', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '3dac4463-73aa-4bd4-a3d8-662ce38635cc', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-18.jpg', + contact: 'Carmen Shannon ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Jun 15 2018 23:26:09 GMT+0000 (UTC)').toISOString(), + subject : 'Aute est laboris laborum consectetur cupidatat', + content : 'Hey Brian,\n\nEsse dolore laboris enim quis. Ullamco dolor exercitation nostrud occaecat in et ad Lorem sunt nisi. Ipsum quis dolor fugiat ex eu. Consequat voluptate elit ut exercitation enim sint aliqua qui id est in eu adipisicing veniam. Deserunt est occaecat sit irure aute. Anim veniam cupidatat exercitation labore duis pariatur velit est exercitation dolore ad. Pariatur non adipisicing et nulla sit.\n\nIncididunt dolor pariatur est aute ad. Non aliqua qui excepteur cillum enim. Magna proident incididunt eu dolor non ut. Eiusmod Lorem tempor laborum amet ex.\n\nExcepteur quis duis cupidatat ea cupidatat magna irure ad exercitation eiusmod. Quis magna minim nulla ullamco. Sit dolor ipsum tempor laboris eiusmod deserunt ex. Est incididunt culpa commodo ad sunt cillum eiusmod labore nisi nulla ea sit anim incididunt. In labore id sint ipsum id nulla ad aliqua mollit minim occaecat. Velit do velit nostrud nostrud dolor esse consequat velit ullamco in cupidatat. Amet culpa fugiat Lorem nisi tempor labore magna reprehenderit aliquip elit et esse fugiat.\n\nKind Regards,\nCarmen Shannon', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '6bb27e81-ee53-4db3-acc7-bd1267cd475d', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-19.jpg', + contact: 'Hattie Snow ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Jun 08 2018 01:23:42 GMT+0000 (UTC)').toISOString(), + subject : 'Officia exercitation exercitation ad exercitation ea ut ullamco', + content : 'Hello Brian,\n\nIncididunt aute pariatur quis reprehenderit tempor occaecat laborum nostrud labore sunt minim non eiusmod incididunt. Ipsum cupidatat qui reprehenderit ex enim irure. Eiusmod sunt proident Lorem veniam non magna dolore eu laboris nostrud quis pariatur. Velit do eu commodo tempor laboris excepteur in. Laborum mollit dolor aliquip enim sunt cillum minim. Dolor elit ipsum proident adipisicing consectetur aliquip nisi proident eiusmod Lorem adipisicing aliqua velit ea.\n\nDo adipisicing incididunt proident Lorem ullamco. Cupidatat fugiat et minim elit deserunt est. Occaecat laboris cillum elit aute cupidatat reprehenderit consequat est est ea occaecat sit consequat labore. Enim proident consectetur culpa anim est culpa nulla nostrud esse proident officia ut dolore ipsum. Do qui sunt id quis Lorem officia anim fugiat occaecat ut.\n\nEsse incididunt excepteur adipisicing fugiat deserunt sint Lorem culpa excepteur tempor ullamco qui. Non aliquip ullamco Lorem do. Ex enim elit minim reprehenderit in qui aliqua qui laborum.\n\nKind Regards,\nHattie Snow', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'bfac8e5d-6487-4747-b827-67179ac5c206', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-20.jpg', + contact: 'Brandi Bradley ' + }, + to : 'me ', + date : new Date('Sat Nov 17 2018 10:51:44 GMT+0000 (UTC)').toISOString(), + subject : 'Eiusmod nulla incididunt nostrud est mollit quis velit in non irure elit consectetur commodo irure', + content : 'Hey Brian,\n\nOfficia ad enim aliqua ex labore nisi. Commodo cillum non occaecat laboris. Irure eu ut voluptate officia excepteur.\n\nNostrud ad proident qui cupidatat exercitation labore occaecat in. Aliquip culpa veniam magna eiusmod proident irure reprehenderit pariatur adipisicing velit. Aliqua non labore tempor irure do duis ut voluptate.\n\nNon sit dolore voluptate sint ullamco proident enim non do dolor deserunt nisi velit. Quis pariatur esse sunt quis voluptate ut minim proident officia exercitation ipsum ipsum cillum. Duis non nostrud ullamco excepteur occaecat. Deserunt sit sint quis et ad. Nisi enim excepteur magna laboris occaecat laborum non esse sit enim mollit. Et elit eiusmod eiusmod Lorem ex qui elit adipisicing proident aute eu.\n\nBest Regards,\nBrandi Bradley', + attachments: [ + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + }, + { + type : 'image/png', + name : 'yosemite-national-park.png', + size : 14242, + preview : 'yosemite-national-park_preview.png', + downloadUrl: '' + } + ], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : '81b49a0a-e934-422a-81a8-8506d6f24e0e', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-01.jpg', + contact: 'Patsy Potter ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue May 15 2018 15:37:38 GMT+0000 (UTC)').toISOString(), + subject : 'Ullamco fugiat fugiat non occaecat proident exercitation proident Lorem adipisicing commodo fugiat', + content : 'Hello Brian,\n\nAute in culpa nulla aliqua laboris adipisicing in sit laborum. Enim exercitation duis qui ullamco. Ullamco eiusmod deserunt cillum nisi nulla nostrud voluptate fugiat non nulla. Tempor sint consequat in nostrud cupidatat exercitation aliqua Lorem. Fugiat officia excepteur consequat id cillum amet consectetur mollit nostrud in ex aliquip. Velit ut cupidatat excepteur deserunt.\n\nSit culpa eu dolor Lorem ipsum anim dolor proident. Cupidatat qui laboris incididunt Lorem cillum anim dolore ad ipsum ullamco deserunt aliquip exercitation. Nostrud magna fugiat aliquip veniam cupidatat cupidatat fugiat voluptate consectetur irure minim officia officia. Tempor commodo tempor sint amet. Ex sint adipisicing fugiat excepteur do ad elit esse commodo duis et. Ullamco irure laborum sint duis duis irure officia culpa non Lorem est deserunt exercitation.\n\nDolor ullamco fugiat eu cupidatat consequat exercitation magna. In ad aute aliquip eu laboris adipisicing proident ad. Eu aliquip enim cillum aliqua.\n\nKind Regards,\nPatsy Potter', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : '8355b50a-f347-4177-8cef-6410c0aa46d1', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-02.jpg', + contact: 'Kathleen Cox ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sun Aug 26 2018 04:47:12 GMT+0000 (UTC)').toISOString(), + subject : 'Est fugiat reprehenderit cupidatat sunt velit aliquip reprehenderit exercitation', + content : 'Hey Brian,\n\nReprehenderit elit do qui ut occaecat veniam. Laboris culpa cupidatat irure ipsum ea cupidatat. Occaecat ea nisi cillum eiusmod. Excepteur dolore ut commodo magna consequat laboris aliquip pariatur reprehenderit laboris. Velit ullamco ipsum ut excepteur enim ipsum consequat reprehenderit eiusmod. Occaecat enim exercitation ipsum nulla dolor anim irure sint dolor do aliquip. Eu tempor sunt non pariatur ut anim eu.\n\nDeserunt cupidatat elit sit cillum qui ut velit ea dolor id sint. Laborum excepteur commodo sit duis. Sit sunt proident laborum ex deserunt cupidatat aliquip tempor id qui deserunt est deserunt et. Qui voluptate veniam nostrud deserunt ullamco nisi occaecat cillum aliquip ullamco. Duis labore sunt ad sunt cillum veniam fugiat deserunt commodo Lorem fugiat et. Eu laborum enim culpa duis esse tempor ex ex. Occaecat cupidatat est reprehenderit cupidatat fugiat amet dolor anim eiusmod.\n\nDolore est occaecat anim aute adipisicing do magna ea aute duis dolore nisi. Irure veniam dolore tempor sint. Irure ullamco aliqua id nisi elit Lorem amet do tempor. Irure aute consectetur dolore nisi nisi excepteur et labore fugiat excepteur duis adipisicing.\n\nKind Regards,\nKathleen Cox', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [] + }, + { + id : '6d2bfbce-465b-4e8f-a79e-cd13ab8571c6', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-03.jpg', + contact: 'Kristina Ramirez ' + }, + to : 'me ', + date : new Date('Tue Mar 06 2018 16:13:56 GMT+0000 (UTC)').toISOString(), + subject : 'Ea eu cupidatat voluptate magna et Lorem veniam aute ipsum consectetur nisi voluptate', + content : 'Dear Brian,\n\nVoluptate esse cillum dolor aliqua. Qui aliqua consectetur tempor irure dolor sunt excepteur eu. Aliqua incididunt velit id minim consequat.\n\nLorem cupidatat aliqua enim fugiat ex aliqua fugiat do ut sint eiusmod. Ex Lorem incididunt velit laboris exercitation aliqua commodo est velit nisi excepteur aute dolor eu. Ad culpa excepteur non laboris occaecat aute sunt ea nostrud ut exercitation fugiat laboris. Ad eiusmod in culpa cupidatat sit pariatur deserunt velit velit elit aliqua duis eiusmod enim.\n\nFugiat ut proident consectetur aliquip consequat sunt ipsum adipisicing. Nisi velit eiusmod sunt voluptate do ea voluptate esse veniam deserunt consectetur Lorem laboris labore. Consectetur aute quis id nisi cillum magna elit veniam fugiat elit aliqua. Mollit aute laborum incididunt sit voluptate consectetur magna do do in duis sunt non culpa.\n\nKind Regards,\nKristina Ramirez', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '7c004a19-4506-48ef-93ab-f16381302e3b', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'd8815854-8726-4280-a5bf-eafd40b3972a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-03.jpg', + contact: 'Mays Glass ' + }, + to : 'me ', + date : new Date('Thu Jan 04 2018 11:10:36 GMT+0000 (UTC)').toISOString(), + subject : 'Culpa ex pariatur aliqua reprehenderit do occaecat nulla ipsum culpa adipisicing', + content : 'Hello Brian,\n\nQuis qui elit eiusmod sint adipisicing in. Adipisicing ipsum reprehenderit id tempor ut. Amet reprehenderit mollit commodo proident nulla velit aliqua ut labore ullamco ea reprehenderit proident deserunt. Consequat deserunt laborum consectetur ea aliquip. Lorem est cillum esse esse consequat sunt enim in deserunt velit. Consectetur velit sunt dolore fugiat eu dolor occaecat occaecat consequat et adipisicing ex ullamco. Officia labore esse esse ipsum ex laborum irure est id veniam aliqua sunt do.\n\nVeniam aute mollit elit duis. Voluptate veniam fugiat occaecat culpa velit fugiat. Irure cillum qui ullamco cillum ut. Culpa id eu nostrud reprehenderit. Aliquip irure cillum tempor non ex. Ex cillum aute minim ut anim sunt dolore cupidatat exercitation ex. In id nostrud sunt ut ea quis aliqua fugiat nostrud fugiat qui dolore adipisicing.\n\nExercitation sint fugiat ullamco id. Consectetur anim duis dolor eiusmod consectetur enim officia dolor elit velit do in laboris id. Reprehenderit fugiat nostrud ea elit do consectetur anim quis enim esse nostrud. Ea ullamco sit anim consequat anim cillum ullamco nostrud commodo fugiat occaecat mollit sint et. Consequat et do do mollit nostrud eiusmod ut magna. Id tempor cillum duis nisi anim velit officia incididunt. Cillum aliqua pariatur laboris deserunt commodo laboris amet.\n\nBest Regards,\nMays Glass', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'bd7ac4df-77fa-45da-8eaf-31303ba794c4', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-04.jpg', + contact: 'Barber Zimmerman ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Aug 09 2018 01:33:05 GMT+0000 (UTC)').toISOString(), + subject : 'Sit elit aliquip sint ullamco tempor in duis Lorem laboris sunt laborum', + content : 'Hi Brian,\n\nAliquip nisi ullamco cupidatat dolore Lorem consectetur quis eiusmod pariatur. Deserunt quis et veniam ea dolore nisi dolor irure anim nisi reprehenderit ex. Deserunt aliqua eu sunt duis ad veniam exercitation nisi deserunt eu. Sint ad ipsum enim laboris. Ut minim proident ut amet officia sit culpa occaecat dolor consequat aliquip minim elit.\n\nElit dolore minim duis officia ullamco reprehenderit laborum incididunt enim do excepteur voluptate elit. Magna adipisicing cupidatat nisi excepteur. Ipsum ex velit pariatur ea veniam aliquip duis consectetur voluptate. Eu velit exercitation veniam nulla consectetur et reprehenderit ullamco. Laborum nisi occaecat laborum adipisicing. Ullamco culpa qui ex pariatur incididunt anim dolor consectetur fugiat et.\n\nIn sunt consequat consectetur culpa. Id aliquip culpa commodo sunt esse anim nulla quis nisi aute occaecat. Anim enim dolor anim dolore.\n\nKind Regards,\nBarber Zimmerman', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'f5fe9764-70b0-407e-a015-96b04da948a7', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-04.jpg', + contact: 'Ginger Fry ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Jan 12 2018 15:46:37 GMT+0000 (UTC)').toISOString(), + subject : 'Fugiat voluptate Lorem id sint enim irure in velit nostrud commodo incididunt', + content : 'Hey Brian,\n\nCillum sunt irure sit reprehenderit ad do mollit Lorem dolor voluptate magna Lorem ad proident. Aliqua qui incididunt nostrud proident. Occaecat voluptate tempor Lorem magna nostrud. Pariatur excepteur id esse proident enim culpa nostrud consectetur tempor exercitation proident ex voluptate tempor. Do id ullamco qui nostrud est occaecat Lorem ipsum ut consectetur culpa velit sunt. Do nisi laborum dolore dolor eu.\n\nAliquip commodo proident tempor est. Aliqua consequat non irure proident consectetur laborum id cupidatat ex enim culpa adipisicing incididunt. Nisi fugiat nisi id reprehenderit fugiat voluptate nostrud esse deserunt. Laboris commodo aliqua qui pariatur. Quis labore commodo aliquip deserunt.\n\nMinim sint tempor consequat consequat commodo velit magna fugiat dolor consectetur est cillum. Minim consequat do excepteur anim consequat. Anim culpa esse adipisicing culpa sit non ut.\n\nKind Regards,\nGinger Fry', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : '3de07c8c-e687-4138-9967-7fd1feea17ee', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-05.jpg', + contact: 'Gardner Burnett ' + }, + to : 'me ', + date : new Date('Mon Mar 19 2018 13:34:20 GMT+0000 (UTC)').toISOString(), + subject : 'Labore anim ullamco labore nisi eiusmod duis commodo', + content : 'Hello Brian,\n\nAute et mollit quis proident proident. Tempor qui sint proident nulla sit ut nulla incididunt enim. Ut cillum nulla nostrud irure sit. Excepteur culpa magna sunt velit consectetur proident labore laborum amet cillum ex elit excepteur nisi. Consectetur voluptate incididunt nulla dolore in culpa excepteur.\n\nQuis duis consequat est elit pariatur deserunt incididunt in enim excepteur deserunt. Aliquip ea exercitation eiusmod deserunt. Qui incididunt consectetur tempor sunt labore id minim deserunt pariatur adipisicing do. Officia nisi pariatur in ea eiusmod Lorem ut commodo.\n\nLaborum ipsum consectetur excepteur cupidatat labore culpa Lorem. Enim pariatur eu aliqua nisi. Tempor pariatur dolore fugiat nulla est tempor incididunt id cupidatat.\n\nCheers!\nGardner Burnett', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : 'd2bbcbbb-aa31-48ee-bbe4-2976b7043e78', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-05.jpg', + contact: 'Lula Lucas ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Mon Nov 26 2018 16:08:25 GMT+0000 (UTC)').toISOString(), + subject : 'Quis anim labore esse proident', + content : 'Hi Brian,\n\nEt enim eu esse nostrud minim labore dolor dolor proident ipsum nisi. Occaecat commodo ullamco cupidatat non deserunt eu nisi dolor. Tempor laboris ipsum occaecat consequat reprehenderit do reprehenderit proident elit mollit aliquip officia excepteur eu. Esse excepteur mollit nulla elit non sint. Consectetur sint reprehenderit pariatur pariatur laborum ullamco tempor consectetur consequat proident velit nisi fugiat anim. Lorem reprehenderit enim non excepteur non cupidatat duis aliqua do culpa occaecat velit.\n\nAliqua est ad pariatur ex velit fugiat id do et amet in aliqua. Mollit esse quis culpa mollit. Amet labore nulla qui pariatur aliquip occaecat do ipsum nostrud ipsum consectetur consequat cillum.\n\nNostrud duis cupidatat minim reprehenderit sunt duis consequat veniam enim velit dolore sint. Sint ad aliquip excepteur in tempor anim fugiat ipsum ex ullamco. Aute anim reprehenderit nulla anim pariatur elit mollit et non qui labore culpa laborum pariatur. Cupidatat consequat incididunt aute id. Cillum incididunt ipsum duis reprehenderit cillum ullamco.\n\nKind Regards,\nLula Lucas', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '1a166107-cc66-42dd-96a2-91b1a40f8c62', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-06.jpg', + contact: 'Mcguire Crosby ' + }, + to : 'me ', + date : new Date('Fri Mar 09 2018 04:54:41 GMT+0000 (UTC)').toISOString(), + subject : 'Eiusmod esse pariatur ipsum elit laborum tempor cillum amet irure labore duis ad amet aliqua', + content : 'Hey Brian,\n\nNisi laborum deserunt eiusmod veniam eiusmod aliqua dolor. Nostrud dolor deserunt occaecat ipsum sit. Sint nisi magna adipisicing duis id velit pariatur magna est tempor ad.\n\nEt ea pariatur duis voluptate irure. Dolore nisi exercitation nulla officia. Ea eiusmod amet aliqua ut ea velit veniam eu aliqua. Commodo est nisi nulla nulla in eu dolor eiusmod enim do consequat aliqua reprehenderit. Proident ad nulla reprehenderit incididunt incididunt ut. Anim deserunt officia ad dolor ex occaecat veniam mollit ex voluptate occaecat ullamco amet duis.\n\nDuis esse cillum in sit deserunt. Consequat ut tempor consequat qui. Laboris esse ex est ipsum et id est in magna tempor amet irure veniam. Occaecat veniam pariatur Lorem pariatur mollit ullamco occaecat. Labore dolor sit irure sit. Sunt sint dolore ex voluptate nisi sit cillum fugiat aliqua dolore dolore irure sunt commodo. Anim ullamco duis consequat sint in nulla voluptate velit irure.\n\nKind Regards,\nMcguire Crosby', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : '3fbf66d3-cc2d-4256-a276-ad73da93b7fd', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-07.jpg', + contact: 'Walsh Bender ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Nov 22 2018 20:26:17 GMT+0000 (UTC)').toISOString(), + subject : 'Mollit voluptate eu excepteur nisi labore dolor aliquip magna incididunt ipsum quis ex irure', + content : 'Dear Brian,\n\nOccaecat id commodo aliqua irure officia consectetur exercitation. Dolor ex aliqua velit proident excepteur enim aliqua cupidatat mollit nisi cillum anim reprehenderit. Lorem nulla amet id laborum fugiat mollit ullamco. Cillum in ea ex Lorem cupidatat eiusmod proident. Cillum nulla ullamco excepteur velit eu sint mollit aliqua sint et officia dolor. Est sit laboris non aute aliqua qui non cillum officia cupidatat. Deserunt voluptate ullamco nisi id aute laboris.\n\nNisi sint do consequat mollit fugiat in est quis. Reprehenderit laboris consectetur exercitation anim dolore occaecat sint. Dolore Lorem dolore veniam cillum ea officia.\n\nSint irure sunt sint ullamco. Nisi est dolore ex ea nostrud enim ex deserunt duis enim tempor pariatur. Minim laborum commodo officia officia do deserunt. Officia consequat elit deserunt quis tempor eiusmod irure sint Lorem magna ea culpa. Adipisicing labore sint elit ex commodo esse duis eiusmod. Id quis non fugiat amet incididunt cillum tempor voluptate.\n\nKind Regards,\nWalsh Bender', + attachments: [ + { + type : 'image/jpeg', + name : 'mystery-forest.jpg', + size : 15539, + preview : 'mystery-forest_preview.jpg', + downloadUrl: '' + }, + { + type : 'application/pdf', + name : 'montly-invoice.pdf', + size : 243449, + preview : 'pdf', + downloadUrl: '' + } + ], + starred : false, + important : false, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'b460fff2-8530-4464-8c44-744cd3de3bf8', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-08.jpg', + contact: 'Baker Guthrie ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sat Jul 21 2018 07:51:09 GMT+0000 (UTC)').toISOString(), + subject : 'In ipsum elit esse laboris qui', + content : 'Hey Brian,\n\nId magna ut laborum cillum nisi mollit reprehenderit consectetur aliquip laborum. Tempor excepteur enim esse officia ex Lorem quis exercitation irure ut nisi ex ipsum. Dolor consectetur sint incididunt reprehenderit reprehenderit magna in. Ullamco labore aute dolor do ad mollit velit aliqua. Amet consectetur adipisicing dolore tempor ea. Cupidatat magna occaecat aliquip non eiusmod dolore aliquip cillum irure.\n\nDolore laborum sunt fugiat officia voluptate consectetur sint enim qui dolor cupidatat consequat cupidatat elit. Commodo Lorem ut ut nostrud duis. Id nisi adipisicing incididunt dolor voluptate sit ad cupidatat voluptate. Labore consequat exercitation sint occaecat eu cupidatat incididunt irure ullamco et aute anim cupidatat. Quis aliqua ut eu sunt id.\n\nDeserunt veniam dolor exercitation labore do enim nisi. Veniam ipsum duis consectetur ex voluptate incididunt dolore laborum ad consequat. Fugiat Lorem pariatur duis nostrud duis aliqua ex do. Nisi sunt eiusmod minim exercitation exercitation aliquip non labore nulla proident nisi ipsum. Sunt elit esse officia cupidatat cupidatat. Ad fugiat est ex fugiat.\n\nKind Regards,\nBaker Guthrie', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '16c18231-82ea-403d-895a-2a4bc27b61ca', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-06.jpg', + contact: 'Olivia Ratliff ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Mon Feb 19 2018 13:18:23 GMT+0000 (UTC)').toISOString(), + subject : 'Mollit ex magna non Lorem id', + content : 'Hi Brian,\n\nNostrud dolore tempor amet nostrud ex aliqua duis. Aliqua enim reprehenderit magna et occaecat. Officia veniam sint fugiat dolor esse ullamco ad non nulla deserunt ullamco commodo occaecat consequat.\n\nSunt nisi reprehenderit nisi incididunt sunt do veniam sint proident duis labore nostrud. Nostrud ad voluptate nisi dolor labore Lorem ex minim nostrud ipsum do. Eiusmod officia sunt tempor duis sunt. In anim in excepteur velit id commodo non nisi aute nisi labore. Ea esse velit eiusmod nulla nisi id eiusmod ex mollit voluptate ad ut ea. Reprehenderit magna quis reprehenderit velit ea veniam magna sint ipsum nulla est officia.\n\nEst ex nostrud quis amet mollit aliquip. Et mollit amet id anim sint amet. Officia do nostrud laboris ullamco cupidatat labore quis exercitation proident aliqua. Eiusmod dolore consectetur nisi deserunt culpa occaecat eu culpa do. Voluptate officia dolore non deserunt. Dolore culpa fugiat eiusmod aliquip. Eu laborum irure fugiat duis esse mollit laborum sit et excepteur irure ipsum.\n\nKind Regards,\nOlivia Ratliff', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'dfa4d802-b833-49c1-afdc-02116d73e35a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-09.jpg', + contact: 'Schneider Kirby ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Mon Nov 12 2018 09:55:21 GMT+0000 (UTC)').toISOString(), + subject : 'Occaecat eiusmod cillum nostrud dolore et proident est esse magna mollit enim', + content : 'Hello Brian,\n\nNon in est voluptate veniam do minim. Ullamco mollit occaecat officia irure tempor deserunt tempor magna voluptate. Id commodo voluptate commodo qui aliqua excepteur aute in eiusmod occaecat quis velit veniam id. Ipsum in sunt aliqua ad eu. Consequat enim commodo ex excepteur pariatur ut.\n\nSunt officia nisi deserunt culpa mollit et duis duis id in nisi. Eiusmod mollit ea qui laborum veniam adipisicing ullamco adipisicing dolor quis enim laboris dolor. Culpa exercitation velit mollit labore incididunt. Veniam deserunt ex ea quis ullamco. Et ex laborum officia non et.\n\nAmet exercitation irure mollit nostrud. Officia dolore nostrud ad do ipsum et laborum consequat ullamco sint consequat amet. Nisi adipisicing ullamco aliqua Lorem quis sint magna veniam. Consequat mollit dolore aliqua ad occaecat. Voluptate aute ea quis sit enim aliquip. Eu dolore nulla minim eu esse minim non cupidatat voluptate laborum do non et. Ut pariatur cillum non labore nostrud amet consectetur consectetur eu cillum.\n\nKind Regards,\nSchneider Kirby', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '84c4ef35-da0d-4d1f-a966-f7f413545b04', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-10.jpg', + contact: 'Griffith Keith ' + }, + to : 'me ', + date : new Date('Tue Dec 11 2018 06:27:01 GMT+0000 (UTC)').toISOString(), + subject : 'Ex occaecat qui veniam qui consectetur aliquip ad reprehenderit laborum proident', + content : 'Hi Brian,\n\nExercitation labore cupidatat incididunt velit laboris ipsum anim commodo in do fugiat ea. Incididunt labore quis pariatur laboris sint tempor. Lorem commodo do do ipsum aliqua. Consectetur occaecat ad incididunt consectetur do excepteur ea laborum. Laboris enim proident excepteur ea exercitation deserunt. Sit dolor fugiat velit adipisicing proident ut cillum nisi adipisicing.\n\nConsectetur quis id non mollit minim. Consectetur ut cupidatat enim occaecat sint ex dolor sunt pariatur mollit exercitation. Magna Lorem aliqua nostrud aute ut enim laboris dolore eiusmod est occaecat dolor fugiat occaecat.\n\nCommodo exercitation sit laboris aute deserunt nostrud occaecat do dolore cupidatat consectetur commodo. Cupidatat laborum excepteur voluptate commodo irure. Excepteur enim labore dolore adipisicing ut aute irure. Labore sunt dolor sint magna dolor consequat. Nulla deserunt mollit cillum adipisicing enim est voluptate minim pariatur aliqua elit sint do eiusmod.\n\nCheers!\nGriffith Keith', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '0c78627f-5cbe-4d21-8491-455e98bf6f69', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-07.jpg', + contact: 'Beverly Pugh ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sun Oct 21 2018 14:36:41 GMT+0000 (UTC)').toISOString(), + subject : 'Mollit irure adipisicing in consectetur aliqua labore pariatur minim', + content : 'Hello Brian,\n\nAute in dolore irure non exercitation. Laborum enim qui nulla irure enim id labore excepteur eiusmod consectetur consequat voluptate exercitation. In laborum reprehenderit incididunt occaecat laborum sit velit.\n\nNulla aliquip labore mollit qui dolore consequat. Enim sunt est nisi reprehenderit tempor amet culpa ex. Eiusmod esse ullamco veniam sunt anim nisi dolore cupidatat id aute.\n\nLorem commodo Lorem qui aliquip eiusmod nisi cupidatat occaecat. Aliqua eiusmod nisi laboris elit commodo qui. Voluptate veniam aliquip ad et pariatur voluptate. Officia non ea laboris dolor excepteur ullamco Lorem dolor esse aute excepteur cillum magna. Cillum et anim adipisicing occaecat consectetur. Non aute culpa pariatur aute fugiat in sint exercitation cillum laborum est non.\n\nBest Regards,\nBeverly Pugh', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '3d382fb3-b5f5-43e3-b0bc-f2a6f29a5ee6', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-08.jpg', + contact: 'Ila Mclaughlin ' + }, + to : 'me ', + date : new Date('Wed Aug 01 2018 13:55:15 GMT+0000 (UTC)').toISOString(), + subject : 'Enim proident sit dolor officia sit magna ea tempor', + content : 'Hey Brian,\n\nExcepteur ut minim qui minim mollit. Tempor cupidatat Lorem sint aliquip excepteur sunt est velit nostrud ea. Velit esse ea irure veniam. Dolore tempor nisi occaecat tempor laborum et nulla enim do sint.\n\nId officia ea ad ad occaecat occaecat consequat veniam ad magna cillum incididunt quis tempor. Veniam reprehenderit qui excepteur sint sunt proident ipsum. Exercitation nostrud eiusmod incididunt consequat enim velit sit qui veniam consectetur. Est exercitation tempor ea sunt enim nulla ea proident officia pariatur. Dolor aute exercitation cillum dolore eu sunt veniam id dolore voluptate ut nostrud deserunt. Eiusmod labore anim veniam labore anim nostrud ad nulla labore consequat enim nisi.\n\nLaboris fugiat quis aute duis reprehenderit ut pariatur non incididunt excepteur ea ut. Nisi deserunt tempor Lorem commodo ad pariatur aliquip duis tempor officia irure. Eu fugiat dolore exercitation veniam cillum.\n\nBest Regards,\nIla Mclaughlin', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '7fd27d57-ccca-432d-af26-c3b609448fb7', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-09.jpg', + contact: 'Jenna Manning ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sat Dec 08 2018 20:09:08 GMT+0000 (UTC)').toISOString(), + subject : 'Quis deserunt excepteur eiusmod reprehenderit enim exercitation voluptate anim', + content : 'Hi Brian,\n\nExcepteur qui anim sint elit. Ad et nostrud non et reprehenderit duis pariatur irure deserunt commodo sit reprehenderit tempor reprehenderit. Aliquip duis mollit duis consequat aute non id do irure. Aute esse sunt labore et voluptate sunt adipisicing tempor. Occaecat tempor exercitation sit duis fugiat ea irure laborum. Consequat quis officia magna fugiat ex.\n\nAliqua non in elit ipsum enim duis dolore laboris in esse duis sunt ea anim. Et laborum sunt in anim ut consequat laborum irure. Deserunt ex veniam laborum tempor cupidatat amet mollit non labore.\n\nDuis veniam occaecat eiusmod velit Lorem ad. Commodo cillum minim id pariatur cupidatat tempor reprehenderit commodo. Dolor anim pariatur nulla qui ut magna nisi reprehenderit sit cupidatat est do. Esse enim Lorem laboris amet reprehenderit pariatur et nostrud minim pariatur. Et dolore qui quis ex consequat consectetur enim veniam veniam veniam magna.\n\nKind Regards,\nJenna Manning', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '18ba20d3-d7bc-4fc7-85dd-2db4db3196fe', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-10.jpg', + contact: 'Deann Hansen ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Jan 10 2019 12:13:47 GMT+0000 (UTC)').toISOString(), + subject : 'Duis minim quis in labore voluptate laboris do consequat eu anim sit deserunt incididunt', + content : 'Dear Brian,\n\nPariatur ipsum ipsum aute dolore ipsum ea mollit labore duis tempor aliquip et reprehenderit. Pariatur amet esse minim ad esse aute excepteur in. Quis eu laborum dolore ullamco ipsum incididunt fugiat non laborum est. Duis anim incididunt Lorem Lorem nulla fugiat qui reprehenderit pariatur. Ut est duis in quis excepteur officia. Ullamco excepteur dolor cillum non aliqua non aliqua sit cillum ipsum laboris proident sint. Nulla in dolore deserunt proident commodo enim occaecat cupidatat reprehenderit incididunt dolor laborum do aliqua.\n\nLaboris velit tempor non adipisicing pariatur culpa culpa amet sint deserunt enim. Est aute sit officia quis ex do id ex deserunt ea. Velit in dolor quis exercitation proident mollit sit ad veniam nisi. Cupidatat esse exercitation commodo velit. Commodo veniam occaecat elit deserunt. Sint adipisicing culpa aute occaecat nisi id consequat nisi.\n\nAdipisicing veniam deserunt ipsum mollit. Adipisicing laborum exercitation sint nulla veniam ex ut dolor. Fugiat do ad proident tempor. Id ipsum ex elit id quis laboris ut irure nulla minim reprehenderit minim dolor sunt. Anim nisi cupidatat sint minim fugiat sit sit cupidatat laborum excepteur duis exercitation anim commodo.\n\nBest Regards,\nDeann Hansen', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '476cb471-b3c1-4235-b5ef-3066b028483d', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-11.jpg', + contact: 'Tisha Moore ' + }, + to : 'me ', + date : new Date('Wed Mar 07 2018 05:58:09 GMT+0000 (UTC)').toISOString(), + subject : 'Qui irure ea qui labore fugiat ad voluptate esse', + content : 'Hey Brian,\n\nAnim ex voluptate in amet duis labore. Esse id ut exercitation labore velit irure amet laborum. Aliqua ex et est reprehenderit amet quis anim ut qui dolore et sit ea amet.\n\nEnim incididunt sunt deserunt voluptate tempor ut minim laborum pariatur Lorem esse ex cillum. Irure proident amet labore aliqua elit excepteur. Pariatur fugiat sit duis ut in elit.\n\nLorem proident duis occaecat eu proident reprehenderit incididunt amet magna officia et ut. Nisi do labore sit sit eiusmod nostrud consectetur proident enim. Ipsum culpa proident consequat nostrud.\n\nCheers!\nTisha Moore', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'a8aea501-17e9-4e40-b3a9-04f33b13cb8a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-12.jpg', + contact: 'Janette Elliott ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Mon May 07 2018 20:07:15 GMT+0000 (UTC)').toISOString(), + subject : 'Veniam amet voluptate Lorem qui ut id culpa mollit reprehenderit est', + content : 'Hi Brian,\n\nAute veniam laborum ad veniam adipisicing pariatur pariatur eiusmod nulla. Labore ullamco cillum cillum eiusmod id ex occaecat cupidatat ea consequat consequat Lorem amet consectetur. Ullamco irure enim officia ut nostrud. Nisi enim aliqua excepteur voluptate et amet commodo aliqua nulla. Adipisicing in eiusmod in commodo veniam id ea ad dolor sunt pariatur ea non consequat.\n\nDeserunt mollit dolor quis irure ullamco. Consectetur Lorem ipsum ex proident aute aute occaecat adipisicing mollit. Lorem mollit consectetur ad dolor enim mollit non. Laboris pariatur laborum minim magna culpa fugiat ad. Duis ea Lorem cillum adipisicing Lorem.\n\nEnim laboris laboris magna culpa. Consectetur anim occaecat commodo labore nostrud id pariatur. Dolore aliquip irure laborum pariatur mollit sit aute minim in nisi.\n\nCheers!\nJanette Elliott', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '1ee2ea29-9a1f-4c27-b4d2-5e465703b6a0', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'cb55f824-40ed-4696-afaa-f3f8d3fb8614', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-13.jpg', + contact: 'Bettie Wyatt ' + }, + to : 'me ', + date : new Date('Mon Dec 03 2018 17:07:32 GMT+0000 (UTC)').toISOString(), + subject : 'Est aliquip nisi pariatur cupidatat veniam qui cillum eu sit ullamco voluptate minim', + content : 'Dear Brian,\n\nEsse laboris commodo ullamco dolor ipsum. Aute cillum velit in aliquip ad adipisicing pariatur ex tempor cillum eu cupidatat laborum. Consectetur aute cupidatat incididunt quis minim elit cupidatat.\n\nEiusmod ea eiusmod nostrud qui amet pariatur laboris non. Proident dolor et pariatur id duis minim enim. Aute ut dolore cupidatat velit sunt.\n\nVeniam magna laborum tempor nostrud aliqua tempor. Pariatur in do id do exercitation non dolor. In elit velit ad Lorem veniam minim Lorem voluptate sint ullamco consectetur aute est. Enim sunt reprehenderit id nisi id. Eu sint incididunt nulla consequat veniam reprehenderit.\n\nBest Regards,\nBettie Wyatt', + attachments: [], + starred : true, + important : false, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : '92dddecc-4758-4c48-8ef4-a59de4ab0705', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-11.jpg', + contact: 'Hardy Dale ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Nov 16 2018 21:53:34 GMT+0000 (UTC)').toISOString(), + subject : 'Aute commodo nostrud nisi quis sunt ex', + content : 'Dear Brian,\n\nDeserunt laborum elit in dolor. Enim duis occaecat minim dolor ex. Consequat et anim mollit nisi ex exercitation culpa non esse velit veniam ad. Sit excepteur nulla laboris reprehenderit. Consequat labore cupidatat Lorem proident proident laborum adipisicing aliqua commodo voluptate esse officia.\n\nAliqua adipisicing sint Lorem id in ad qui. Reprehenderit ullamco labore consectetur commodo Lorem eiusmod culpa. Lorem voluptate ipsum anim ipsum do ullamco eiusmod ad est proident officia. Ut anim deserunt minim laborum minim ea et minim non ad ut. Non ipsum et enim pariatur.\n\nNulla voluptate consectetur id aute ad officia incididunt velit voluptate aliqua deserunt ex. Dolore commodo labore aliqua aliquip magna ipsum laboris cupidatat velit. Et elit labore eu id laborum. Ipsum est pariatur irure aute magna. Fugiat sit voluptate eiusmod consequat.\n\nKind Regards,\nHardy Dale', + attachments: [], + starred : false, + important : true, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '3f3f6154-a8ff-40d6-8b57-4c0f73d2cd8b', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-14.jpg', + contact: 'Eileen Bush ' + }, + to : 'me ', + date : new Date('Sat Feb 24 2018 12:22:13 GMT+0000 (UTC)').toISOString(), + subject : 'Lorem deserunt dolor sunt sit sit mollit', + content : 'Hey Brian,\n\nEu Lorem laborum qui elit id consequat ipsum ex. Minim aute proident aliquip non esse quis voluptate nisi enim. Velit Lorem ea exercitation adipisicing amet deserunt pariatur Lorem amet anim dolore ipsum. Tempor magna voluptate laboris fugiat. Elit ea fugiat cillum Lorem fugiat ipsum officia tempor sit excepteur pariatur minim sint proident.\n\nDeserunt adipisicing dolor do fugiat commodo dolor sit ut culpa ea officia Lorem officia. Nulla elit tempor nostrud nulla. Amet tempor deserunt labore irure est ut officia ullamco velit. Officia tempor anim ex dolor consequat dolore anim do velit qui laboris nisi ipsum. Aute ipsum aliqua ut ullamco laborum pariatur minim mollit consectetur ipsum.\n\nNisi commodo labore nostrud veniam ut aute dolore veniam in. Consectetur commodo proident incididunt aliqua reprehenderit ex nostrud est magna elit reprehenderit. Proident veniam sint occaecat ullamco labore aliquip eiusmod duis sint. Ea ex id eiusmod eu elit ullamco aliqua. Dolore consectetur magna eu voluptate ea aliquip eu et veniam ullamco deserunt magna.\n\nKind Regards,\nEileen Bush', + attachments: [], + starred : true, + important : false, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '2c80bcbe-c9cd-4eec-83fa-b9994713a784', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-15.jpg', + contact: 'Melody Mcintosh ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Fri Jul 27 2018 07:20:48 GMT+0000 (UTC)').toISOString(), + subject : 'Reprehenderit consequat aliquip duis incididunt excepteur aliquip excepteur velit labore laboris', + content : 'Hey Brian,\n\nEnim ea ad veniam qui magna aliqua ipsum id anim adipisicing voluptate id velit. Elit pariatur magna quis ea adipisicing deserunt officia consectetur in magna culpa sint. Culpa cupidatat anim amet ea elit adipisicing sunt. Incididunt nulla est non cupidatat sit excepteur consectetur culpa labore in sit. Aliqua cupidatat aute qui esse labore aliquip sit exercitation aliqua est magna sint nisi quis.\n\nTempor laboris ullamco culpa dolor ipsum ad aliqua consequat anim reprehenderit aliqua. Proident elit mollit commodo ut Lorem incididunt cillum Lorem eu adipisicing fugiat. Sint velit eiusmod magna occaecat tempor nulla ex ea.\n\nDolore est proident ea deserunt dolore non elit Lorem ipsum sint. Quis ut pariatur cupidatat deserunt. Aliqua sunt labore dolore officia ullamco exercitation id excepteur est et eu consequat esse consectetur. Veniam eu culpa reprehenderit id fugiat aliqua anim id esse commodo velit labore adipisicing. In anim Lorem reprehenderit occaecat do laboris veniam cillum incididunt aute dolor id duis. Est pariatur Lorem consectetur proident est culpa ullamco ea elit incididunt veniam enim elit ipsum.\n\nCheers!\nMelody Mcintosh', + attachments: [], + starred : false, + important : true, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '2a44e5b7-e01c-43db-b586-540390f46f95', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-12.jpg', + contact: 'Dale Talley ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Tue Jan 02 2018 07:20:01 GMT+0000 (UTC)').toISOString(), + subject : 'Aute occaecat est amet adipisicing aute voluptate incididunt adipisicing pariatur esse anim ipsum labore', + content : 'Hello Brian,\n\nNostrud deserunt do anim pariatur adipisicing cillum enim. Reprehenderit ex ut ullamco deserunt non voluptate laboris eu deserunt sint incididunt anim. Minim non amet quis officia ullamco non do id. Aute deserunt enim laborum elit magna veniam do. Id Lorem mollit eu id ex eiusmod fugiat ad sint quis sunt ipsum eu exercitation. Eiusmod occaecat sit esse cupidatat occaecat quis commodo magna qui. Non consectetur non ad cillum minim eiusmod magna ad nulla.\n\nAd esse anim nostrud do. Officia eiusmod eu reprehenderit do ipsum velit enim. In ullamco ex commodo laboris ut adipisicing elit sit occaecat fugiat officia. Commodo duis aliqua minim nisi.\n\nDuis proident mollit ea do Lorem excepteur. Commodo ex duis minim aute Lorem. Est in quis aliquip in qui minim excepteur aliqua dolor adipisicing. Laborum do tempor voluptate anim elit nisi minim sunt cupidatat.\n\nKind Regards,\nDale Talley', + attachments: [], + starred : true, + important : true, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'be1e969d-d52f-4824-83e5-c184b042b601', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-13.jpg', + contact: 'Britt Massey ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Oct 09 2018 00:12:17 GMT+0000 (UTC)').toISOString(), + subject : 'Cillum tempor cillum ex esse eu Lorem', + content : 'Hey Brian,\n\nVelit laboris excepteur nulla aliquip excepteur. Culpa incididunt magna minim non aute incididunt officia cillum quis labore pariatur tempor amet. Eiusmod nulla consectetur mollit anim anim aute quis reprehenderit sint eu. Voluptate deserunt voluptate est adipisicing adipisicing qui ullamco ex officia eiusmod. Velit nostrud Lorem enim aute sint anim cupidatat excepteur ea aliqua et. Minim et do irure ut commodo. Cillum quis nulla commodo ipsum tempor.\n\nCulpa duis laboris anim nostrud ipsum laboris exercitation exercitation ut. Dolore duis laborum do sunt non. Eiusmod irure consectetur sint do. Officia adipisicing est id reprehenderit labore.\n\nConsequat eiusmod est labore commodo Lorem ullamco cupidatat id Lorem eiusmod amet do enim qui. Consequat ad ipsum elit non esse labore. Cupidatat eu reprehenderit ad est cillum esse. Nulla eiusmod eiusmod mollit culpa quis sint sit elit aliquip. Incididunt quis consequat amet ipsum amet. Ut officia eu consectetur incididunt adipisicing tempor aute. Reprehenderit labore consequat excepteur esse adipisicing.\n\nBest Regards,\nBritt Massey', + attachments: [], + starred : true, + important : false, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : '8c7c9bff-6ca6-47ba-9242-cd9b1715eac7', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-16.jpg', + contact: 'Madelyn Haynes ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sat Mar 03 2018 18:08:05 GMT+0000 (UTC)').toISOString(), + subject : 'Irure enim minim dolore et', + content : 'Dear Brian,\n\nSit incididunt Lorem ad cupidatat eiusmod dolore velit. Aliquip dolore quis qui irure consequat velit. Dolor incididunt est magna sit.\n\nConsequat officia nulla culpa officia eiusmod sint. Proident elit irure pariatur eiusmod enim mollit mollit qui. Amet ullamco aliquip sunt fugiat proident est nulla ex ex est ipsum officia. Exercitation qui veniam duis ut veniam aliqua excepteur.\n\nDeserunt ipsum eiusmod labore do minim enim anim. Aliquip mollit magna do eu. Qui duis consectetur exercitation veniam qui. Ea duis nisi aute aute occaecat deserunt magna.\n\nBest Regards,\nMadelyn Haynes', + attachments: [], + starred : false, + important : false, + unread : false, + folder : 'fbdc8e79-a0c4-4a27-bc98-9c81ee7a86e5', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'afd52898-82e9-4fd4-8d6a-2391ec817e2a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-14.jpg', + contact: 'Rowland Sweet ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Jun 22 2018 14:39:18 GMT+0000 (UTC)').toISOString(), + subject : 'Sunt et proident ullamco qui id irure occaecat anim aute elit amet', + content : 'Hey Brian,\n\nLaborum sunt labore esse occaecat duis magna aliquip dolor. Cupidatat irure aute enim minim nisi reprehenderit voluptate occaecat exercitation anim est quis. Magna esse ipsum tempor consectetur non excepteur nostrud. Est consectetur tempor deserunt magna anim culpa sint id elit. Et ullamco non non aute id cupidatat proident aute dolor exercitation excepteur.\n\nEx officia quis irure enim eu in qui sit non. Aliqua fugiat ut sint deserunt veniam quis qui cillum dolor commodo ea exercitation. Deserunt id velit deserunt Lorem elit elit non. Voluptate fugiat est adipisicing non eiusmod voluptate. Reprehenderit tempor id quis cillum nulla sint sit ipsum veniam aliqua.\n\nPariatur dolore ipsum proident irure elit dolore pariatur occaecat qui adipisicing occaecat et aliquip. Ex quis mollit ad Lorem laboris dolor incididunt. Ex consectetur nulla nulla labore dolor. Cillum aliqua duis nulla quis sit laborum magna et exercitation anim deserunt incididunt elit.\n\nBest Regards,\nRowland Sweet', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : 'e43d83f0-51ea-4da9-b18f-0de380b5156a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-17.jpg', + contact: 'Fern Shaw ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Wed Feb 21 2018 06:23:12 GMT+0000 (UTC)').toISOString(), + subject : 'Nisi esse incididunt nisi aliqua aliqua laborum occaecat quis duis minim', + content : 'Dear Brian,\n\nCommodo magna officia qui labore ullamco nostrud. Labore nostrud consequat quis laborum esse velit dolore eu. Esse officia duis nisi dolore culpa elit velit excepteur irure in excepteur officia. Ad anim magna excepteur deserunt aute dolore nulla dolore aute tempor laboris adipisicing. Sit culpa culpa occaecat nostrud magna labore sunt pariatur exercitation qui. Esse ea mollit non sint cupidatat aliqua mollit qui ex tempor exercitation labore minim. Veniam aliquip exercitation ad ex.\n\nOfficia nulla exercitation ullamco proident eu amet occaecat Lorem est est non nulla tempor. Exercitation occaecat ipsum sunt tempor et enim nisi reprehenderit Lorem. Culpa elit ea aliqua est. Et exercitation aliquip aliqua et magna et magna exercitation aliqua exercitation pariatur occaecat.\n\nUllamco ea esse consequat nisi et officia veniam. Duis esse ullamco cupidatat do eiusmod aliquip velit irure sit ad irure officia. Irure veniam sunt aliqua elit ex Lorem qui ullamco qui enim dolore aliquip consectetur quis.\n\nBest Regards,\nFern Shaw', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : '4e1d4820-e907-405a-990a-4a5772f482ad', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-18.jpg', + contact: 'Lorraine Ballard ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sun Jun 24 2018 13:46:02 GMT+0000 (UTC)').toISOString(), + subject : 'Velit nisi ut laboris id et do aliquip', + content : 'Hey Brian,\n\nOccaecat fugiat minim dolor excepteur. Ullamco quis cillum consectetur mollit id. Duis eiusmod occaecat consectetur duis laborum aliqua occaecat cillum laboris proident cillum. Amet in elit dolore quis amet cupidatat id laboris Lorem do velit occaecat nostrud ad. Eu est pariatur nulla est proident Lorem quis velit fugiat nisi quis. Dolor mollit occaecat duis veniam amet Lorem tempor eiusmod. Consequat ullamco deserunt nulla occaecat officia est qui pariatur velit.\n\nConsequat culpa do ullamco est et veniam incididunt. Exercitation laborum eu proident ex nostrud minim eu proident ad Lorem aute est non ea. Ut quis mollit anim sunt et labore deserunt tempor magna exercitation irure dolor incididunt elit. Mollit amet ad Lorem eiusmod cupidatat adipisicing nostrud. Non dolor ad occaecat officia in dolor. Irure sint quis aliqua deserunt dolore qui sunt cupidatat quis aliqua eu Lorem. Elit sint incididunt do ea amet laborum.\n\nReprehenderit reprehenderit veniam sit exercitation. Tempor ea adipisicing consequat nostrud sint irure nostrud. Dolor est officia adipisicing dolor et pariatur proident quis sint pariatur exercitation commodo. Esse id quis qui aliquip quis.\n\nKind Regards,\nLorraine Ballard', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'f0f2d069-50a0-484f-a4a2-3a272fcb433b', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-15.jpg', + contact: 'Jennings Franklin ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Thu Apr 26 2018 06:34:54 GMT+0000 (UTC)').toISOString(), + subject : 'Enim esse aliqua elit incididunt aliqua mollit amet quis occaecat veniam occaecat proident', + content : 'Hey Brian,\n\nConsectetur laboris voluptate cillum tempor aliqua ullamco sunt do est ea non mollit cupidatat cillum. Aute aliqua eiusmod proident officia enim duis est elit. Fugiat occaecat culpa aliqua in velit elit duis reprehenderit enim dolor eiusmod sit incididunt. Commodo velit ipsum elit amet qui laboris culpa aliquip ad dolor sit. Commodo laboris laborum eiusmod qui in esse excepteur laboris in ad proident deserunt adipisicing. Esse aliqua sit ad veniam sint et culpa minim labore.\n\nUt officia sint nulla enim consectetur eiusmod. Minim nulla cillum aliquip elit ad pariatur ea nulla. Anim occaecat nulla irure ea nisi dolor cupidatat et consectetur id tempor aliqua magna esse. Laborum culpa incididunt cillum excepteur. Nulla laborum dolore qui sit laboris et mollit labore ea magna occaecat. Dolore cillum fugiat eiusmod Lorem ea veniam.\n\nEt cillum enim nulla anim ipsum labore quis amet exercitation occaecat. Et sint eiusmod sint minim do. In esse id ea ut excepteur amet minim Lorem id consectetur cupidatat est. Dolor pariatur commodo eu est. Consequat aliquip est qui mollit excepteur ex do adipisicing.\n\nKind Regards,\nJennings Franklin', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : '7c93dbde-8b56-43a3-ade1-b132906679c4', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-19.jpg', + contact: 'Colette Cole ' + }, + to : 'me ', + date : new Date('Fri Sep 21 2018 08:37:21 GMT+0000 (UTC)').toISOString(), + subject : 'Sit non consequat et fugiat id laboris', + content : 'Hello Brian,\n\nIpsum non nisi ut do occaecat pariatur et duis eiusmod sint. Consequat do eu adipisicing fugiat incididunt dolor proident cupidatat reprehenderit dolor proident. Duis non eiusmod sit enim esse fugiat sit amet tempor ea ad adipisicing quis aliquip. Labore in cillum ipsum officia est irure incididunt fugiat id in eu Lorem. Occaecat eu veniam voluptate fugiat fugiat laborum veniam voluptate. Do exercitation mollit fugiat duis deserunt. Mollit aute non quis ex officia non amet amet dolor ullamco sint sunt.\n\nDolore incididunt ad ad anim minim. Sunt reprehenderit duis occaecat labore dolore irure elit. Excepteur laboris et proident nulla magna duis et. Eiusmod veniam ea culpa cillum incididunt ad officia. Labore in non voluptate ullamco velit ex aliqua aliqua amet nisi incididunt exercitation. Labore qui est adipisicing labore anim officia ullamco aliquip anim commodo ipsum mollit.\n\nQuis cillum non consequat ea esse laboris duis mollit et id consectetur nisi eu pariatur. In fugiat culpa aliqua eu culpa ea nisi incididunt. Pariatur excepteur laborum nulla ea ex reprehenderit ea deserunt.\n\nKind Regards,\nColette Cole', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '7335d11d-04b1-4250-817a-6fdf3e099239', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-20.jpg', + contact: 'Kim Carlson ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Wed Nov 28 2018 07:57:15 GMT+0000 (UTC)').toISOString(), + subject : 'Ullamco ad consectetur ut esse', + content : 'Dear Brian,\n\nReprehenderit aliqua nulla tempor nostrud. Excepteur nostrud nostrud velit magna pariatur nisi anim excepteur consectetur proident irure cillum dolore et. Nostrud esse deserunt veniam exercitation et dolore fugiat tempor. Sit duis adipisicing sint aliqua. Ipsum anim sit velit ipsum ipsum occaecat sit ea Lorem ex pariatur. Anim laboris exercitation tempor officia in enim.\n\nEsse sunt aliquip nulla ipsum laborum irure minim Lorem eiusmod ut et occaecat. Ipsum deserunt nulla duis nisi dolore. Aliquip ea exercitation magna esse laboris consectetur culpa labore reprehenderit ipsum dolor veniam sunt. In consequat cillum irure elit sunt ea Lorem mollit sint tempor reprehenderit laborum velit consequat. Proident aute deserunt Lorem tempor labore incididunt eu adipisicing proident nulla anim exercitation. Laborum adipisicing id id aliquip. Velit proident consectetur consequat nisi dolor aliquip mollit ad officia proident ea nostrud ea.\n\nProident sunt velit adipisicing voluptate amet est dolor reprehenderit deserunt laboris ullamco velit. Veniam nulla esse cupidatat magna ut consequat in et ipsum mollit ad non Lorem. Sit duis qui eiusmod exercitation commodo voluptate laborum. Exercitation consequat mollit nisi mollit deserunt sunt. Fugiat incididunt magna ad nostrud non amet incididunt veniam et veniam nulla ipsum fugiat.\n\nBest Regards,\nKim Carlson', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'e9dd17ec-4fc3-424e-89e5-c58d9d235764', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-01.jpg', + contact: 'Rena Park ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sat Oct 13 2018 12:57:58 GMT+0000 (UTC)').toISOString(), + subject : 'Nulla qui anim ullamco officia elit', + content : 'Hi Brian,\n\nDuis qui qui ad aliqua ad incididunt non exercitation do qui aliqua quis. Eiusmod amet irure minim fugiat ex et sint. Occaecat laboris minim eu exercitation nostrud commodo qui deserunt. Sunt voluptate eiusmod minim commodo. Est excepteur est irure laborum mollit qui excepteur culpa consequat.\n\nEx consectetur minim elit excepteur ad ad ea anim in elit. Velit dolor qui incididunt pariatur aliquip reprehenderit laboris fugiat. Veniam laboris elit ipsum eiusmod dolore labore excepteur enim pariatur.\n\nDolore sit aliquip velit voluptate ipsum in dolor laboris nisi occaecat minim. Ad sunt reprehenderit sit proident occaecat amet aute esse enim. Elit aute adipisicing mollit reprehenderit tempor ex elit proident. Aute exercitation commodo esse exercitation.\n\nBest Regards,\nRena Park', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : '5fb8f4b5-fad4-4a82-8519-a732e68a48be', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-16.jpg', + contact: 'Haney Gibson ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Tue Oct 23 2018 00:16:47 GMT+0000 (UTC)').toISOString(), + subject : 'Veniam consequat ipsum occaecat ipsum', + content : 'Hey Brian,\n\nMinim adipisicing sint do irure. Reprehenderit reprehenderit dolor tempor anim exercitation qui aliqua. Laboris consectetur labore quis deserunt culpa amet eiusmod minim cillum. Id consequat dolore aliqua sit sunt cillum incididunt aliqua sint dolore quis eiusmod elit aliquip. Nisi aute mollit ipsum dolore eiusmod incididunt. Tempor officia culpa consequat laboris culpa. Lorem pariatur irure minim dolore elit enim elit esse nostrud.\n\nAmet ipsum officia sunt aliqua laborum mollit Lorem et. Est consectetur eu nostrud minim minim irure occaecat sint ea. Ut magna aliqua labore exercitation. Minim sint excepteur cupidatat esse quis do duis ad. Est magna in velit ut cupidatat mollit non do id ea ut non.\n\nDolor dolor elit fugiat aliqua aliquip in officia. Elit et cupidatat commodo laboris nostrud fugiat non cupidatat velit pariatur. Labore anim velit proident nisi ullamco. Reprehenderit adipisicing nisi laboris ut.\n\nBest Regards,\nHaney Gibson', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : 'e766ddd9-e9ea-499c-bb10-72fa57a03059', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-02.jpg', + contact: 'Freda Frank ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Wed Nov 21 2018 01:26:11 GMT+0000 (UTC)').toISOString(), + subject : 'Magna sint dolor sit laborum enim', + content : 'Hello Brian,\n\nExcepteur occaecat dolor ex Lorem sunt velit enim eiusmod et fugiat mollit fugiat labore proident. Lorem mollit exercitation labore dolor ullamco proident non irure aliquip. Cillum laboris sit incididunt nulla dolor. Irure mollit mollit irure incididunt eiusmod consequat. Mollit in nisi enim veniam culpa mollit id dolor.\n\nSunt cillum esse est ut exercitation voluptate Lorem. Duis labore ut ullamco non ea do minim in cupidatat magna officia. Ullamco qui occaecat esse magna Lorem occaecat veniam in. Deserunt voluptate do voluptate nulla fugiat laborum officia Lorem mollit quis. Eiusmod sit pariatur qui sint ea irure cillum officia deserunt. Eiusmod irure in enim ullamco Lorem aliqua ad.\n\nDuis deserunt in nisi aute excepteur exercitation minim. Tempor pariatur qui irure laborum in incididunt. Dolor eu aliqua enim cupidatat ad aliquip culpa ipsum consequat consequat. Lorem nostrud deserunt officia commodo. Dolore officia ipsum cupidatat tempor ex occaecat pariatur anim ea consectetur incididunt. Veniam ad pariatur pariatur dolor enim tempor sint aliqua quis minim aliquip magna mollit eiusmod.\n\nKind Regards,\nFreda Frank', + attachments: [], + starred : false, + important : false, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '03693a62-d6bd-47c8-8f8e-112f21042722', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-17.jpg', + contact: 'Burns White ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Mon May 14 2018 20:06:57 GMT+0000 (UTC)').toISOString(), + subject : 'Veniam cillum ad proident incididunt nisi exercitation est', + content : 'Hi Brian,\n\nEsse reprehenderit duis labore aliqua magna mollit ut aliquip. Fugiat aliquip ipsum aliqua laborum ipsum sint nisi proident laborum consectetur dolor veniam commodo. Ea veniam eu laborum nulla non voluptate incididunt nostrud nulla fugiat velit. Nulla aliqua sit eu amet mollit. Aute laboris excepteur ut quis elit non anim aliqua ut et ea cillum consequat ex. Pariatur tempor esse excepteur ea nostrud incididunt culpa elit aliquip proident tempor non id consectetur. Duis eiusmod sint deserunt tempor mollit sint do ad labore adipisicing.\n\nElit enim ipsum mollit pariatur in officia non qui est ipsum dolore Lorem nostrud nulla. Adipisicing aliquip enim ullamco minim in sint aliqua magna enim adipisicing. Reprehenderit ea nulla velit nostrud veniam qui est elit dolore. Et dolor labore commodo veniam aliquip laborum consequat voluptate fugiat et eu. Veniam minim sunt ex laborum. Aliquip nostrud minim pariatur nostrud eiusmod mollit minim irure aliqua. Minim id Lorem magna nostrud consequat irure.\n\nDuis id deserunt eiusmod adipisicing fugiat in irure sit aliqua ipsum velit. Aute aliquip Lorem pariatur cillum fugiat labore et. Ipsum commodo sunt enim eiusmod adipisicing exercitation elit adipisicing culpa laborum cupidatat laboris duis. Mollit officia consectetur voluptate nisi mollit. Magna ipsum sint sint est culpa in magna ad eu quis officia.\n\nBest Regards,\nBurns White', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : 'c59f5ea4-4f5d-4b9e-9c3c-a996b18fd98c', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-18.jpg', + contact: 'Fischer Cervantes ' + }, + to : 'me ', + date : new Date('Thu Dec 13 2018 03:52:15 GMT+0000 (UTC)').toISOString(), + subject : 'Amet aute tempor sit tempor minim nulla dolor commodo aute eu', + content : 'Hi Brian,\n\nCulpa nulla est deserunt ut. Culpa eu velit occaecat ut sint voluptate. Nostrud sint officia pariatur eiusmod commodo laborum. Proident consequat nostrud anim qui velit quis.\n\nVoluptate occaecat pariatur minim eu culpa ex sit nostrud. Amet id proident consequat commodo ullamco deserunt eu occaecat anim do exercitation sit quis non. Voluptate eiusmod aute cillum culpa sit. Dolore cillum ea ex reprehenderit occaecat ullamco. Est nulla minim est do adipisicing id in et nostrud voluptate. Proident eiusmod enim cupidatat minim. Amet minim sunt incididunt pariatur amet cupidatat eu exercitation officia laborum.\n\nId elit minim exercitation occaecat exercitation. Cupidatat officia duis duis id nisi nostrud quis dolor officia. Dolore occaecat aliqua eiusmod mollit commodo officia sunt sit laboris nisi excepteur irure duis fugiat.\n\nKind Regards,\nFischer Cervantes', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : '9ed5d4c1-819a-4719-88d7-cd7b08b2228d', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-19.jpg', + contact: 'Cervantes Reyes ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Tue Oct 16 2018 11:06:27 GMT+0000 (UTC)').toISOString(), + subject : 'Et eu adipisicing aliqua nisi minim commodo anim aliqua aliquip', + content : 'Hi Brian,\n\nDo irure id voluptate occaecat quis eiusmod. Nulla non incididunt do ut excepteur proident nulla aliqua minim ex. Enim et elit eiusmod ex dolor aliqua et cupidatat consectetur nulla consectetur et fugiat cillum. Amet ea laboris non duis voluptate id fugiat voluptate et sit magna fugiat quis non.\n\nAmet tempor tempor ut eu proident deserunt. Velit exercitation irure sunt mollit veniam exercitation eiusmod nisi do velit labore sit. In exercitation et Lorem pariatur dolor aliquip aliquip occaecat. Consectetur aliqua ea voluptate aliquip consectetur do tempor sunt sint elit. Exercitation ipsum cupidatat qui exercitation cillum non cupidatat occaecat. Cupidatat consequat ut quis ad incididunt proident culpa qui minim.\n\nEu adipisicing voluptate amet occaecat amet est qui eu nisi aliqua. Quis labore in minim esse deserunt labore nulla qui dolor nulla id veniam nulla. Nulla aliquip pariatur id sunt fugiat laboris incididunt sunt ipsum. Sint dolor non nulla aliqua ea dolor officia veniam officia deserunt duis deserunt. Veniam esse consectetur deserunt excepteur laborum aliquip qui labore. Reprehenderit labore ex do nostrud esse.\n\nBest Regards,\nCervantes Reyes', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'a769720b-0c64-483c-925c-5d747c61bff4', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-20.jpg', + contact: 'Cooke Whitney ' + }, + to : 'me ', + date : new Date('Sat Jul 28 2018 14:16:37 GMT+0000 (UTC)').toISOString(), + subject : 'Est veniam aliquip culpa deserunt commodo ad laboris ad ullamco', + content : 'Hi Brian,\n\nVoluptate consequat ullamco eiusmod deserunt eu laborum ullamco Lorem minim eiusmod est eu elit esse. Enim ipsum irure occaecat magna. Esse labore irure incididunt mollit dolor veniam ut magna aliquip. In ex consequat culpa nisi in exercitation. Sunt tempor quis deserunt laborum nulla ad.\n\nVoluptate mollit nostrud consectetur amet enim dolor. Consequat deserunt eiusmod incididunt cupidatat ex anim aliquip minim mollit incididunt tempor. Quis quis deserunt et tempor sunt laboris quis non enim veniam nisi nulla. Ea adipisicing incididunt laboris incididunt exercitation voluptate exercitation ipsum velit duis aute cupidatat labore. Nulla ea non est deserunt proident deserunt qui irure quis enim occaecat cupidatat. Sint veniam consequat Lorem dolore commodo aliqua et. Ad commodo qui ad ea consectetur non dolore dolor.\n\nAnim exercitation id do laborum quis laborum elit officia cupidatat sunt consectetur officia ex excepteur. Cillum cupidatat et consectetur ex aliquip anim Lorem eiusmod nostrud reprehenderit. Magna ullamco qui incididunt dolore anim ad laborum. Laborum occaecat laboris consequat et esse nostrud elit anim amet incididunt aliquip mollit ad proident. Voluptate pariatur ex adipisicing dolore dolor adipisicing cupidatat tempor amet duis dolore sunt consequat qui. Mollit do ullamco enim nulla dolore proident in. Ipsum irure cillum irure aute culpa duis eu est dolore est laborum.\n\nKind Regards,\nCooke Whitney', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '0197c436-2ef3-424d-b546-8b7f49186e15', + labels : [] + }, + { + id : 'e6b83f13-c25e-4355-913f-54d93d8393f6', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-03.jpg', + contact: 'Lee Lloyd ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Thu Oct 18 2018 02:56:36 GMT+0000 (UTC)').toISOString(), + subject : 'Culpa incididunt amet sunt ipsum ad nostrud exercitation ea', + content : 'Hi Brian,\n\nDolore voluptate ea id aliquip qui cillum. Adipisicing velit esse et sunt culpa quis velit mollit culpa mollit nostrud. Nulla ad elit cupidatat ex id velit proident aliquip sit irure aliquip exercitation exercitation. Occaecat proident reprehenderit consectetur tempor velit amet cupidatat.\n\nAd est sunt commodo occaecat cillum fugiat minim reprehenderit minim nulla id velit. Ullamco enim ullamco qui eu ut est qui dolore reprehenderit non tempor excepteur. Fugiat irure in pariatur qui incididunt minim cillum. Aliquip incididunt reprehenderit cillum laborum eiusmod sint aute sint. Deserunt pariatur deserunt elit ut velit cupidatat. Ad deserunt ea laborum reprehenderit laboris ut pariatur labore.\n\nLabore ullamco irure mollit aliqua irure officia est excepteur ut. Dolore amet ut id fugiat deserunt reprehenderit pariatur anim. Dolor est amet ipsum labore fugiat culpa minim anim aliqua. Officia ad duis est irure in consequat nostrud duis. Irure sit quis ad nisi qui adipisicing labore consectetur consequat duis eiusmod nisi. Non dolore tempor exercitation nulla nisi Lorem eu adipisicing aliqua dolore qui non. Enim non exercitation occaecat reprehenderit adipisicing dolore laboris eiusmod.\n\nCheers!\nLee Lloyd', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : '5c5c4ba7-542b-46b0-b0ce-976f5189d72c', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-01.jpg', + contact: 'Benson Shields ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sun Apr 01 2018 20:39:05 GMT+0000 (UTC)').toISOString(), + subject : 'Sit incididunt ad tempor veniam duis', + content : 'Dear Brian,\n\nAnim dolor exercitation magna qui incididunt ullamco enim. Voluptate qui laborum tempor ex minim eu dolore officia Lorem do pariatur laborum. Esse et ullamco reprehenderit nisi anim nostrud est deserunt.\n\nQuis qui commodo exercitation minim ea nisi. Aliqua culpa ad aliqua velit eiusmod do duis ex commodo eiusmod. Laborum nostrud nulla qui non reprehenderit voluptate cillum mollit exercitation anim ipsum cillum.\n\nEiusmod nisi ullamco ex ut velit. Ipsum sint dolor minim aute minim mollit ullamco voluptate magna nulla sint. Pariatur Lorem pariatur velit laboris tempor excepteur tempor reprehenderit culpa Lorem.\n\nKind Regards,\nBenson Shields', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [] + }, + { + id : '36abfef2-f86a-4c9e-99de-1869f0b3e71b', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-02.jpg', + contact: 'Emerson Whitehead ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sun Jun 24 2018 11:19:49 GMT+0000 (UTC)').toISOString(), + subject : 'Esse ea ut est excepteur', + content : 'Hey Brian,\n\nEst consequat aute laborum voluptate do aliqua cillum non excepteur nostrud culpa enim veniam nulla. Proident et nisi consequat nisi labore incididunt eiusmod fugiat. Nisi sint ut sint proident culpa pariatur ipsum quis dolor voluptate. Elit proident laboris eu elit. Id nisi dolor quis nostrud cillum quis ut ad quis velit eiusmod.\n\nMinim reprehenderit ullamco culpa cupidatat voluptate ut sunt. Exercitation sit dolore ullamco commodo exercitation cupidatat nulla officia Lorem exercitation officia minim. Reprehenderit ex incididunt magna id culpa incididunt ex reprehenderit ea veniam culpa id occaecat.\n\nDo esse ut non laborum aute. Aute laborum tempor eiusmod id amet anim. Quis exercitation id fugiat deserunt in do irure duis. Id ad ea eiusmod magna excepteur nulla.\n\nCheers!\nEmerson Whitehead', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'b1a0ab26-6c86-4888-b2f1-69928b3ca718', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-04.jpg', + contact: 'Annabelle Greene ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Aug 30 2018 03:24:13 GMT+0000 (UTC)').toISOString(), + subject : 'Commodo reprehenderit laborum nostrud culpa et aliquip', + content : 'Hey Brian,\n\nConsequat amet proident esse laboris nisi excepteur mollit enim ad ipsum. Eiusmod culpa anim magna laboris amet veniam qui. Mollit minim elit tempor in nostrud incididunt pariatur. Ea dolor laboris cupidatat in aliquip elit proident ipsum ad. Ad do pariatur do magna eu voluptate eu qui commodo consectetur exercitation pariatur eu.\n\nSit est nisi tempor eiusmod esse laboris reprehenderit laborum quis incididunt duis amet esse. Lorem do do nulla est. Deserunt magna laborum do pariatur excepteur amet laboris anim sunt nulla. Veniam aliqua non adipisicing id cillum laborum aliqua. Reprehenderit deserunt amet nulla proident. Voluptate aliqua occaecat ex ut deserunt amet voluptate quis id pariatur excepteur incididunt. Magna ex nulla minim magna id cillum nisi id quis culpa consequat ea exercitation.\n\nIncididunt et aliqua officia sit nulla anim commodo est. Irure commodo veniam quis qui ad sit labore mollit in officia non incididunt in tempor. Tempor nulla velit excepteur esse. Duis enim sunt irure consectetur excepteur fugiat duis pariatur exercitation cupidatat commodo. Do cupidatat et labore magna dolor aliquip aute tempor aute. Et sit fugiat commodo eiusmod qui ex minim dolor eu do minim qui veniam.\n\nBest Regards,\nAnnabelle Greene', + attachments: [], + starred : false, + important : true, + unread : false, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '87cf5188-34dc-4947-b780-48c7fb6b6b23', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-03.jpg', + contact: 'Dawson Lewis ' + }, + to : 'me ', + date : new Date('Fri Aug 03 2018 03:03:12 GMT+0000 (UTC)').toISOString(), + subject : 'Ipsum duis sint incididunt nulla in labore nulla', + content : 'Hello Brian,\n\nAdipisicing quis deserunt consectetur proident eiusmod velit irure minim dolore sunt aliqua aliqua. Dolore excepteur ea commodo consectetur. Qui veniam est do cillum non excepteur adipisicing excepteur quis sit. Do cupidatat consectetur pariatur nulla exercitation dolor exercitation mollit. Elit culpa ea mollit laboris anim nisi id velit. Elit esse ad commodo dolor culpa nostrud consequat Lorem laboris pariatur et esse. Nisi elit esse ad cupidatat commodo eiusmod irure aliquip sit deserunt id anim tempor.\n\nIrure deserunt dolore nisi magna ipsum ut qui amet elit consectetur ex pariatur. Aliquip anim nostrud enim exercitation commodo eiusmod mollit qui id nulla. Lorem aute exercitation commodo enim veniam ea aute laborum consequat sunt proident eu. Quis deserunt incididunt mollit adipisicing nostrud laboris. Laborum elit velit proident aliquip ex aliqua dolore magna cillum adipisicing nisi cillum sunt esse.\n\nCillum eu id cillum eu incididunt adipisicing pariatur est sint minim voluptate Lorem Lorem excepteur. Aliqua ipsum non occaecat aute eiusmod deserunt aliquip. Sit incididunt cupidatat pariatur exercitation laborum id qui ut pariatur deserunt fugiat occaecat occaecat incididunt. Amet ad do esse et aliquip magna ullamco commodo deserunt exercitation irure. Consequat dolor magna mollit laboris pariatur laboris.\n\nBest Regards,\nDawson Lewis', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '8749e3bc-24b3-43f3-997b-ee0b5bd7a442', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-04.jpg', + contact: 'Cole Dotson ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Tue Sep 04 2018 09:09:08 GMT+0000 (UTC)').toISOString(), + subject : 'Sint quis veniam tempor sint', + content : 'Hi Brian,\n\nReprehenderit magna Lorem voluptate mollit irure nulla duis est adipisicing. Velit labore ullamco sit dolore. Officia magna est sunt esse veniam eiusmod nostrud laboris eiusmod ullamco nostrud cupidatat veniam.\n\nAliqua veniam magna laborum laboris officia. Excepteur occaecat nisi culpa anim amet dolore culpa culpa laborum veniam deserunt esse sunt. Nostrud tempor adipisicing sit eiusmod dolore.\n\nUt adipisicing labore officia ipsum qui officia aute. Qui in et quis ut qui labore irure. Minim voluptate qui occaecat est. Laborum aliquip enim elit incididunt eiusmod ea sit id in. Qui nostrud ad nostrud deserunt incididunt aute in aliquip.\n\nBest Regards,\nCole Dotson', + attachments: [], + starred : false, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '108ca3fa-a4dd-4988-a7ea-659ab4446050', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-05.jpg', + contact: 'Bernard Cunningham ' + }, + to : 'me ', + date : new Date('Tue Aug 21 2018 08:51:03 GMT+0000 (UTC)').toISOString(), + subject : 'Consequat Lorem fugiat et veniam ad veniam proident excepteur laborum', + content : 'Dear Brian,\n\nEu voluptate exercitation nulla aliqua id laboris ipsum voluptate nulla ea laboris. Magna exercitation reprehenderit mollit velit irure minim elit officia eiusmod reprehenderit non quis. Esse sunt non nisi id irure commodo incididunt amet.\n\nAdipisicing quis mollit velit ullamco enim ad laborum ex dolor ut culpa exercitation sit commodo. Amet eu et ullamco ut elit anim nulla fugiat sint. Laborum tempor incididunt laboris id pariatur velit excepteur officia nostrud mollit occaecat sit. Nulla do fugiat tempor quis reprehenderit fugiat aute. Dolor laboris amet do anim occaecat sunt in duis reprehenderit cupidatat mollit consequat nisi.\n\nUllamco ad minim dolore excepteur amet ullamco quis esse officia voluptate. Ipsum ex dolore labore enim. Cupidatat cillum exercitation cupidatat id eu esse aute tempor ut qui sit.\n\nCheers!\nBernard Cunningham', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : '63a362be-4ea7-4cc1-985f-5202db9c1370', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-06.jpg', + contact: 'Edwards Mcconnell ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Fri Jul 20 2018 05:22:32 GMT+0000 (UTC)').toISOString(), + subject : 'Amet ipsum voluptate voluptate dolore proident voluptate officia cillum adipisicing tempor tempor ad anim', + content : 'Hey Brian,\n\nAliqua Lorem fugiat in fugiat commodo laborum sit mollit Lorem elit. Nulla incididunt sint nostrud magna labore elit quis ex. Ex dolore labore tempor cillum magna tempor est exercitation in proident. Dolor est esse consectetur veniam sint proident enim mollit.\n\nQui eiusmod laborum veniam officia quis nisi cillum dolor cupidatat magna. Quis exercitation excepteur incididunt duis laboris ex Lorem laborum excepteur adipisicing. Fugiat exercitation reprehenderit veniam minim occaecat. Excepteur fugiat irure magna aliquip ut amet quis fugiat consectetur ea. Commodo est fugiat ea et labore dolore ullamco nulla excepteur officia ea. Lorem sunt officia pariatur ullamco sunt commodo fugiat enim. Consectetur amet duis et deserunt elit pariatur eiusmod amet excepteur fugiat dolore aliqua eu.\n\nLabore velit ea non elit esse commodo fugiat. Culpa eiusmod consequat sint laboris. Irure proident non laboris duis nisi.\n\nBest Regards,\nEdwards Mcconnell', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : 'ce206b7e-bbd0-4cd1-b69a-a8d4ef5b10bf', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-05.jpg', + contact: 'Lizzie Sanders ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Fri Sep 07 2018 01:29:31 GMT+0000 (UTC)').toISOString(), + subject : 'Sint enim elit Lorem laboris', + content : 'Dear Brian,\n\nNostrud Lorem sit dolore eiusmod culpa ut deserunt do. Esse nulla nostrud cupidatat aliquip ut veniam velit cillum amet cillum ea culpa culpa in. Pariatur eu duis adipisicing sint velit eu duis ex officia enim nulla. Sunt fugiat incididunt et id nulla ut ea in.\n\nCillum id ea nisi consectetur nostrud adipisicing magna incididunt ipsum reprehenderit. Exercitation labore nisi magna fugiat officia culpa id commodo eu. Ad ullamco amet pariatur deserunt elit et dolore quis cillum laboris Lorem dolore labore laboris.\n\nEst mollit aliquip labore ad duis quis mollit sunt cillum cupidatat excepteur. Ad dolor cupidatat incididunt deserunt. Ullamco id sunt et ad nisi Lorem irure. Aliquip enim occaecat velit laboris et ullamco sint dolore anim. Proident nisi nulla labore enim dolor. Ipsum eu qui nisi minim aliqua ullamco exercitation. In sint id pariatur id aliqua velit reprehenderit consequat aliquip.\n\nCheers!\nLizzie Sanders', + attachments: [], + starred : false, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + }, + { + id : 'f7c2e821-b2e2-4103-bb20-ddcd3a42dc7c', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-06.jpg', + contact: 'Elise Hicks ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ', + 'Julie T. ' + ], + date : new Date('Sun Mar 04 2018 15:45:07 GMT+0000 (UTC)').toISOString(), + subject : 'Cillum proident non officia mollit nulla dolor eiusmod et aliquip laboris ut adipisicing dolor deserunt', + content : 'Hi Brian,\n\nVelit proident et qui quis enim. Aute cillum ad ipsum esse nulla. Enim elit quis laborum id excepteur non consectetur ut incididunt enim adipisicing minim est. Dolor pariatur pariatur est cillum consectetur eu do deserunt labore duis incididunt et. Magna laboris labore velit velit ad aliquip magna.\n\nLaboris occaecat duis aliqua culpa culpa culpa quis eu et dolore. Quis irure mollit irure sint fugiat. Ea elit adipisicing incididunt cillum proident esse esse tempor nulla laborum incididunt reprehenderit. Sit minim laborum dolor magna sunt pariatur. Voluptate ullamco exercitation deserunt ea consequat aliqua Lorem non velit irure et adipisicing labore.\n\nVoluptate id exercitation eiusmod mollit et commodo sit consequat minim id. Consectetur eiusmod reprehenderit veniam elit dolor qui quis occaecat nisi ut commodo excepteur. Minim do ad veniam ullamco ea magna occaecat velit. Non do ea officia cupidatat ex proident veniam nostrud. Non occaecat laboris ad est quis ad. Commodo non aliquip nisi ullamco ullamco consequat eiusmod aliqua est sunt incididunt commodo et nostrud.\n\nCheers!\nElise Hicks', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : 'd8ca28a0-7fb7-4cd4-9058-3a867f841f76', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-07.jpg', + contact: 'Sherri Roth ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Thu Dec 20 2018 09:37:24 GMT+0000 (UTC)').toISOString(), + subject : 'Ex laboris et sunt ex aute aute nisi', + content : 'Hey Brian,\n\nLaboris eu incididunt reprehenderit eiusmod. Non ad tempor fugiat aliquip aliquip ullamco deserunt deserunt occaecat Lorem. Esse ut velit labore magna nostrud do eu fugiat do adipisicing fugiat fugiat id in. Reprehenderit magna aute sunt proident anim nostrud ex Lorem.\n\nDolor proident et quis ea anim sit deserunt ea non nisi. Ullamco fugiat proident consectetur qui reprehenderit incididunt anim fugiat pariatur eiusmod quis quis. Amet anim veniam labore aliquip est occaecat do magna consectetur mollit fugiat. Ut fugiat eu deserunt mollit mollit cupidatat.\n\nNisi culpa et magna est officia duis laboris adipisicing ullamco pariatur sunt nulla aute proident. Ex incididunt veniam fugiat do proident ullamco tempor qui eu qui consequat anim. Commodo minim consectetur excepteur amet in sint adipisicing cillum tempor sint et nulla. Cupidatat ut commodo esse labore anim.\n\nCheers!\nSherri Roth', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3' + ] + }, + { + id : 'b48be636-410c-485a-9442-7de7ce807dc2', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-07.jpg', + contact: 'Skinner Hawkins ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sun Jun 10 2018 07:50:01 GMT+0000 (UTC)').toISOString(), + subject : 'Eu cillum amet dolore labore voluptate qui mollit ad anim ipsum laborum eiusmod aliquip', + content : 'Hi Brian,\n\nFugiat nisi eu aliquip do elit irure enim consectetur officia consequat. Quis eiusmod minim sint veniam quis dolor sit excepteur officia reprehenderit. Aute ex ea eu eiusmod. Consectetur velit dolore laboris proident ex. Enim sint dolore adipisicing occaecat et magna quis. Enim nostrud nisi sunt deserunt.\n\nOccaecat laborum voluptate quis culpa duis cillum excepteur velit ullamco duis nisi. Nulla cillum ea Lorem reprehenderit. Ea proident deserunt mollit esse pariatur est duis aute Lorem. Id deserunt nulla elit velit veniam ut consectetur Lorem exercitation do laborum nisi Lorem.\n\nVelit sint exercitation et ullamco ipsum deserunt irure. Consectetur mollit aliqua duis commodo laboris sit consequat laborum mollit aliquip anim. Occaecat enim quis in ullamco voluptate dolore enim culpa Lorem est consectetur deserunt tempor labore. Do non ex irure dolor elit ea Lorem duis esse sit eu fugiat eiusmod.\n\nCheers!\nSkinner Hawkins', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : 'efe990eb-6559-48a6-a909-320c465de739', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-08.jpg', + contact: 'Velma Ellison ' + }, + to : 'me ', + date : new Date('Thu Nov 01 2018 10:59:46 GMT+0000 (UTC)').toISOString(), + subject : 'Ex duis cupidatat qui velit', + content : 'Hey Brian,\n\nSint labore adipisicing consequat ipsum. Proident aute et reprehenderit sint laborum nulla dolor. Dolor commodo consectetur nulla id reprehenderit veniam enim culpa ad irure esse Lorem amet. Tempor laboris aute ea sint. Elit laboris eu aliquip tempor eu Lorem eu ex.\n\nMagna dolore officia in excepteur. Reprehenderit in ipsum ea ex voluptate reprehenderit et aliquip commodo deserunt excepteur nisi reprehenderit quis. Consectetur do mollit non nisi exercitation elit anim laboris elit cillum excepteur. Veniam qui deserunt culpa enim esse eu Lorem. Est in consequat cupidatat elit in nisi deserunt.\n\nProident consequat ea nisi eiusmod esse incididunt exercitation. Consequat labore veniam non elit duis aute eiusmod labore est irure. Aliquip velit minim nisi qui est. Consequat ea dolor nostrud incididunt. Nulla commodo consectetur occaecat eu nisi ullamco cillum culpa ea magna. Eiusmod quis in ex veniam duis esse do. Laboris quis mollit mollit ex nulla officia irure pariatur qui aute consectetur ad esse.\n\nCheers!\nVelma Ellison', + attachments: [], + starred : true, + important : false, + unread : false, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7' + ] + }, + { + id : 'd2bc3670-63f7-47c3-9d3d-4998c716f04a', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-09.jpg', + contact: 'Tamara Fitzgerald ' + }, + to : 'me ', + date : new Date('Sat Feb 24 2018 15:37:16 GMT+0000 (UTC)').toISOString(), + subject : 'Et esse sit eiusmod dolore eiusmod ad sit ipsum adipisicing ut esse', + content : 'Dear Brian,\n\nIn exercitation pariatur id occaecat reprehenderit exercitation ullamco nostrud consequat nostrud anim labore reprehenderit. Pariatur ea amet eiusmod consequat aliquip culpa aute. Officia elit non nulla ullamco aliquip est nulla quis nostrud consequat irure.\n\nFugiat nisi labore excepteur non mollit duis. Irure voluptate fugiat duis ullamco exercitation cupidatat est ullamco culpa. Quis nisi nostrud nisi non commodo veniam Lorem officia proident fugiat elit exercitation consectetur. Cupidatat cupidatat mollit amet nisi voluptate et ea sint sint. Excepteur ad aute reprehenderit nisi dolore sint eu fugiat consequat nulla proident ipsum ad voluptate. Ea officia aute incididunt commodo consectetur aliquip sint. Irure veniam ipsum anim incididunt aliquip est enim consequat anim cillum veniam laborum enim laborum.\n\nAnim non eiusmod elit id cillum minim minim qui amet sint. Incididunt ullamco exercitation consequat ipsum sit eiusmod minim dolore sint laborum labore. Velit incididunt nulla consectetur duis duis. Sit labore duis nostrud tempor. Elit excepteur nostrud adipisicing eu quis ex. Aute aliquip esse laborum irure in officia qui voluptate laboris magna reprehenderit.\n\nKind Regards,\nTamara Fitzgerald', + attachments: [], + starred : true, + important : true, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e' + ] + }, + { + id : '07b4d696-7657-4535-9838-3efb42355cbb', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-08.jpg', + contact: 'Duncan Gilmore ' + }, + to : 'me ', + date : new Date('Mon Dec 31 2018 08:15:40 GMT+0000 (UTC)').toISOString(), + subject : 'Ipsum non ad commodo dolor enim labore ullamco', + content : 'Hey Brian,\n\nDuis commodo commodo exercitation ex incididunt fugiat incididunt duis ex. Proident tempor nulla culpa consequat non est incididunt amet ipsum anim. Non ipsum irure consectetur nisi exercitation. Nostrud occaecat ullamco ad et tempor magna sint ea minim duis consectetur aute velit incididunt. Ad amet exercitation consectetur mollit proident minim anim excepteur nostrud.\n\nEt in nulla laboris minim ex excepteur culpa exercitation officia labore nostrud quis. Est officia velit ullamco aute consectetur Lorem consectetur voluptate qui eu. Elit non nulla laboris enim in esse quis. Pariatur ullamco cupidatat cupidatat non et anim in dolor magna quis Lorem dolore et. Sit ullamco cillum reprehenderit eu. Ut id ipsum duis occaecat occaecat.\n\nFugiat excepteur et aute magna fugiat ut consequat adipisicing quis deserunt id sint occaecat. Ut cupidatat est nisi fugiat enim laborum. Nostrud est nisi occaecat ut Lorem.\n\nKind Regards,\nDuncan Gilmore', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [] + }, + { + id : 'b8424db5-c607-4b9a-b88f-78c54343a342', + type : 'mail', + from : { + avatar : 'assets/images/avatars/female-10.jpg', + contact: 'Betty Dean ' + }, + to : 'me ', + date : new Date('Thu Aug 16 2018 06:17:15 GMT+0000 (UTC)').toISOString(), + subject : 'Laborum magna cupidatat qui sint proident aliquip ut commodo aute sint', + content : 'Dear Brian,\n\nConsequat aliquip ut laboris non velit dolor fugiat. Nisi ut laborum amet occaecat proident deserunt excepteur sunt occaecat pariatur sint ullamco fugiat aliquip. Ea excepteur commodo magna ut deserunt. Reprehenderit eu quis nisi esse eiusmod ut ullamco. Esse est pariatur id labore anim cillum dolore nulla esse dolor eiusmod do magna est.\n\nDo fugiat dolore duis ex consequat amet sunt reprehenderit enim non dolore incididunt pariatur. Excepteur ipsum labore est cupidatat laborum do consectetur tempor ipsum eiusmod. Voluptate eiusmod nostrud occaecat nisi laboris et velit non nostrud. Nulla id commodo laboris culpa id cillum nostrud deserunt fugiat excepteur nisi irure laborum. Irure in aute ea non magna Lorem aute consequat excepteur duis occaecat cupidatat ea. Tempor Lorem ullamco ullamco occaecat ipsum duis aliqua velit labore dolore veniam. Mollit ex commodo qui esse.\n\nLabore et nostrud do dolor. Sit duis proident nulla mollit officia. Deserunt voluptate ad anim in id consectetur excepteur Lorem quis. Consectetur officia esse cillum Lorem aliqua ex sit proident qui occaecat. Deserunt magna in consectetur velit proident sint cupidatat commodo veniam sint cillum amet aliqua. Aute cillum officia culpa Lorem mollit amet culpa incididunt dolore voluptate minim. Aliqua fugiat aliquip nulla dolore elit aliqua quis veniam ullamco in adipisicing deserunt.\n\nCheers!\nBetty Dean', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754' + ] + }, + { + id : 'edf1399f-e829-4bde-ae5b-e03d18ad2f76', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-09.jpg', + contact: 'Pate Gardner ' + }, + to : 'me ', + date : new Date('Sat May 26 2018 10:36:30 GMT+0000 (UTC)').toISOString(), + subject : 'Non labore sit dolor quis in qui esse velit ad sit', + content : 'Hi Brian,\n\nMinim ea eiusmod eu cillum enim amet minim commodo reprehenderit ullamco pariatur sunt adipisicing excepteur. Laboris aute velit cillum aute laborum exercitation. Aute esse qui aliquip et proident excepteur nulla ullamco id quis culpa consectetur ea in. Aute ad dolor culpa voluptate deserunt consectetur Lorem ex est. Id consequat laborum qui elit velit. Nostrud incididunt ullamco ad aute officia adipisicing proident consectetur qui in fugiat elit. Qui sit officia amet ex occaecat irure.\n\nIncididunt sit est quis mollit ex nostrud dolore ullamco officia laboris. Reprehenderit labore anim ea tempor officia officia et duis cupidatat adipisicing dolore. Dolore exercitation minim culpa ut est magna aute adipisicing quis. Eiusmod nulla mollit nulla dolor elit aute incididunt aute officia tempor enim do. Fugiat tempor non dolore quis nisi do laborum qui.\n\nEst et cupidatat nulla laboris amet ut laboris. Lorem in esse culpa sunt laborum. Commodo est nisi ullamco esse veniam.\n\nKind Regards,\nPate Gardner', + attachments: [], + starred : true, + important : false, + unread : true, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [] + }, + { + id : 'bcc422a2-8a39-416e-8205-a5ce354ea622', + type : 'mail', + from : { + avatar : 'assets/images/avatars/male-10.jpg', + contact: 'Lawson Kidd ' + }, + to : 'me ', + cc : [ + 'Graham Belltower ' + ], + date : new Date('Sun Mar 18 2018 02:18:44 GMT+0000 (UTC)').toISOString(), + subject : 'Proident non proident dolore non dolor reprehenderit', + content : 'Hello Brian,\n\nDeserunt cillum in non et. Occaecat consequat cupidatat occaecat dolor laboris id nostrud laborum. Incididunt commodo eiusmod id irure ex amet. Aute officia ut voluptate id ex ut ex minim velit. Ullamco est pariatur et quis. Sint eiusmod labore qui minim laboris esse aliquip culpa in incididunt reprehenderit.\n\nNon aliqua anim occaecat cupidatat qui adipisicing elit et aliquip adipisicing cillum in in eu. Velit esse exercitation eiusmod ad id sunt duis voluptate sint veniam proident. Ullamco sit ut laboris minim voluptate ut velit excepteur ad. Ad aute et consequat pariatur aute in ipsum enim ea nostrud excepteur consequat est. Et magna excepteur irure do adipisicing. Id fugiat quis et deserunt sit nostrud fugiat eu do eu ullamco.\n\nVelit aliqua ea id ipsum irure exercitation. Et duis aliquip exercitation amet in minim aliqua proident nisi velit irure excepteur non eu. Eiusmod irure tempor mollit velit culpa excepteur in minim eiusmod. Duis et commodo qui elit quis anim consectetur elit reprehenderit. Labore aliqua cupidatat Lorem eu officia exercitation labore aliqua mollit magna ullamco cupidatat. Nostrud ea commodo ad ad eiusmod velit eiusmod. Laborum aliquip exercitation mollit et irure occaecat.\n\nKind Regards,\nLawson Kidd', + attachments: [], + starred : true, + important : true, + unread : false, + folder : '2fa74637-d362-4fd2-9a88-f7195a88bdde', + labels : [ + 'b167d3c4-f6ed-4ea6-9579-a12f95a9d76e', + '745cf30e-ca84-47a1-a553-b70eb630d8e7', + '8b035cb5-65c0-4ab1-bb4c-43b0e442d1f3', + 'b2d1e4e7-7cfd-4b51-ae59-217a093df754', + '184cd689-4ee4-47cf-9f8a-12233d614326' + ] + } +]; diff --git a/src/app/mock-api/apps/tasks/api.ts b/src/app/mock-api/apps/tasks/api.ts new file mode 100644 index 00000000..b1ef8342 --- /dev/null +++ b/src/app/mock-api/apps/tasks/api.ts @@ -0,0 +1,329 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiUtils } from '@fuse/lib/mock-api/mock-api.utils'; +import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service'; +import { tags as tagsData, tasks as tasksData } from 'app/mock-api/apps/tasks/data'; + +@Injectable({ + providedIn: 'root' +}) +export class TasksMockApi +{ + private _tags: any[] = tagsData; + private _tasks: any[] = tasksData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Tags - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/tasks/tags') + .reply(() => { + + return [ + 200, + cloneDeep(this._tags) + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/tasks/tag') + .reply(({request}) => { + + // Get the tag + const newTag = cloneDeep(request.body.tag); + + // Generate a new GUID + newTag.id = FuseMockApiUtils.guid(); + + // Unshift the new tag + this._tags.unshift(newTag); + + return [ + 200, + newTag + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tags - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/tasks/tag') + .reply(({request}) => { + + // Get the id and tag + const id = request.body.id; + const tag = cloneDeep(request.body.tag); + + // Prepare the updated tag + let updatedTag = null; + + // Find the tag and update it + this._tags.forEach((item, index, tags) => { + + if ( item.id === id ) + { + // Update the tag + tags[index] = assign({}, tags[index], tag); + + // Store the updated tag + updatedTag = tags[index]; + } + }); + + return [ + 200, + updatedTag + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tag - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/tasks/tag') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the tag and delete it + const index = this._tags.findIndex((item) => item.id === id); + this._tags.splice(index, 1); + + // Get the tasks that have the tag + const tasksWithTag = this._tasks.filter(task => task.tags.indexOf(id) > -1); + + // Iterate through them and remove the tag + tasksWithTag.forEach((task) => { + task.tags.splice(task.tags.indexOf(id), 1); + }); + + return [ + 200, + true + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tasks - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/tasks/all') + .reply(() => { + + // Clone the tasks + const tasks = cloneDeep(this._tasks); + + // Sort the tasks by order + tasks.sort((a, b) => a.order - b.order); + + return [ + 200, + tasks + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tasks Search - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/tasks/search') + .reply(({request}) => { + + // Get the search query + const query = request.params.get('query'); + + // Prepare the search results + let results; + + // If the query exists... + if ( query ) + { + // Clone the tasks + let tasks = cloneDeep(this._tasks); + + // Filter the tasks + tasks = tasks.filter((task) => { + return task.title && task.title.toLowerCase().includes(query.toLowerCase()) || task.notes && task.notes.toLowerCase().includes(query.toLowerCase()); + }); + + // Mark the found chars + tasks.forEach((task) => { + const re = new RegExp('(' + query.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')', 'ig'); + task.title = task.title.replace(re, '$1'); + }); + + // Set them as the search result + results = tasks; + } + // Otherwise, set the results to null + else + { + results = null; + } + + return [ + 200, + results + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Tasks Orders - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/tasks/order') + .reply(({request}) => { + + // Get the tasks + const tasks = request.body.tasks; + + // Go through the tasks + this._tasks.forEach((task) => { + + // Find this task's index within the tasks array that comes with the request + // and assign that index as the new order number for the task + task.order = tasks.findIndex((item: any) => item.id === task.id); + }); + + // Clone the tasks + const updatedTasks = cloneDeep(this._tasks); + + return [ + 200, + updatedTasks + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Task - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/apps/tasks/task') + .reply(({request}) => { + + // Get the id from the params + const id = request.params.get('id'); + + // Clone the tasks + const tasks = cloneDeep(this._tasks); + + // Find the task + const task = tasks.find((item) => item.id === id); + + return [ + 200, + task + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Task - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/apps/tasks/task') + .reply(({request}) => { + + // Generate a new task + const newTask = { + id : FuseMockApiUtils.guid(), + type : request.body.type, + title : '', + notes : null, + completed: false, + dueDate : null, + priority : 1, + tags : [], + order : 0 + }; + + // Unshift the new task + this._tasks.unshift(newTask); + + // Go through the tasks and update their order numbers + this._tasks.forEach((task, index) => { + task.order = index; + }); + + return [ + 200, + newTask + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Task - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/apps/tasks/task') + .reply(({request}) => { + + // Get the id and task + const id = request.body.id; + const task = cloneDeep(request.body.task); + + // Prepare the updated task + let updatedTask = null; + + // Find the task and update it + this._tasks.forEach((item, index, tasks) => { + + if ( item.id === id ) + { + // Update the task + tasks[index] = assign({}, tasks[index], task); + + // Store the updated task + updatedTask = tasks[index]; + } + }); + + return [ + 200, + updatedTask + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Task - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/apps/tasks/task') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Find the task and delete it + const index = this._tasks.findIndex((item) => item.id === id); + this._tasks.splice(index, 1); + + return [ + 200, + true + ]; + }); + } +} diff --git a/src/app/mock-api/apps/tasks/data.ts b/src/app/mock-api/apps/tasks/data.ts new file mode 100644 index 00000000..2f56bae3 --- /dev/null +++ b/src/app/mock-api/apps/tasks/data.ts @@ -0,0 +1,953 @@ +/* tslint:disable:max-line-length */ +export const tags = [ + { + id : 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270', + title: 'Api' + }, + { + id : 'c6058d0d-a4b0-4453-986a-9d249ec230b1', + title: 'Frontend' + }, + { + id : 'd3ef4226-ef2c-43b0-a986-3e3e07f32799', + title: 'Bug' + }, + { + id : '51483dd3-cb98-4400-9128-4bd66b455807', + title: 'Backend' + }, + { + id : '91658b8a-f382-4b0c-a53f-e9390351c2c5', + title: 'Urgent' + }, + { + id : '2b884143-419a-45ca-a7f6-48f99f4e7798', + title: 'Discuss' + } +]; +export const members = [ + { + id : '65f1c421-83c5-4cdf-99da-d97794328679', + name : 'Angeline Vinson', + avatar: 'assets/images/avatars/female-01.jpg' + }, + { + id : '88a2a76c-0e6f-49da-b617-46d7c3b6e64d', + name : 'Roseann Greer', + avatar: 'assets/images/avatars/female-02.jpg' + }, + { + id : '6ab7751e-6579-40af-9171-231c0fd6a993', + name : 'Lorraine Barnett', + avatar: 'assets/images/avatars/female-03.jpg' + }, + { + id : '3e353312-6a9b-46af-adda-5061b06e806b', + name : 'Middleton Bradford', + avatar: 'assets/images/avatars/male-01.jpg' + }, + { + id : '3a23baf7-2db8-4ef5-8d49-86d3e708dff5', + name : 'Sue Hays', + avatar: 'assets/images/avatars/female-04.jpg' + }, + { + id : 'e62ab50e-90d3-4ed7-a911-093bb44d0c50', + name : 'Keith Neal', + avatar: 'assets/images/avatars/male-02.jpg' + }, + { + id : '368aab1e-ebce-43ba-8925-4cf13937867b', + name : 'Wilkins Gilmore', + avatar: 'assets/images/avatars/male-03.jpg' + }, + { + id : 'ef44b39b-3272-45f5-a15e-264c3b2d118e', + name : 'Baldwin Stein', + avatar: 'assets/images/avatars/male-04.jpg' + }, + { + id : '7f5db993-ec36-412f-9db3-16d076a98807', + name : 'Bobbie Cohen', + avatar: 'assets/images/avatars/female-05.jpg' + }, + { + id : 'e2c81627-a8a1-4bbc-9adc-ac4281e040d4', + name : 'Melody Peters', + avatar: 'assets/images/avatars/female-06.jpg' + }, + { + id : 'a21ec32e-54ba-480b-afdc-d1cbe18a96fd', + name : 'Marquez Ryan', + avatar: 'assets/images/avatars/male-05.jpg' + }, + { + id : '45e09584-1a54-40e6-8210-1de4d1c05593', + name : 'Roberta Briggs', + avatar: 'assets/images/avatars/female-07.jpg' + }, + { + id : '6617b0a3-0ccd-44ea-af78-c6633115d683', + name : 'Robbie Buckley', + avatar: 'assets/images/avatars/female-08.jpg' + }, + { + id : '271e6a06-0d37-433d-bc8d-607b12bcbed9', + name : 'Garcia Whitney', + avatar: 'assets/images/avatars/male-06.jpg' + }, + { + id : '65e15136-5168-4655-8bbc-e3ad8a94bf67', + name : 'Spencer Pate', + avatar: 'assets/images/avatars/male-07.jpg' + }, + { + id : '28dcda24-812d-4086-9638-b28bd85beecc', + name : 'Monica Mcdaniel', + avatar: 'assets/images/avatars/female-09.jpg' + }, + { + id : '56a3e7ce-01da-43fc-ab9f-a8a39fa980de', + name : 'Mcmillan Durham', + avatar: 'assets/images/avatars/male-08.jpg' + }, + { + id : '4d24cf48-a322-4d53-89cb-9140dfd5c6ba', + name : 'Jfuseine Hebert', + avatar: 'assets/images/avatars/female-10.jpg' + }, + { + id : 'b2e97a96-2f15-4e3d-aff5-4ddf2af924d4', + name : 'Susanna Kline', + avatar: 'assets/images/avatars/female-11.jpg' + }, + { + id : '4678ad07-e057-48a9-a5d1-3cf98e722eeb', + name : 'Suzette Singleton', + avatar: 'assets/images/avatars/female-12.jpg' + } +]; +export const tasks = [ + { + id : 'f65d517a-6f69-4c88-81f5-416f47405ce1', + type : 'section', + title : 'Company internal application v2.0.0', + notes : 'Magna consectetur culpa duis ad est tempor pariatur velit ullamco aute exercitation magna sunt commodo minim enim aliquip eiusmod ipsum adipisicing magna ipsum reprehenderit lorem magna voluptate magna aliqua culpa.\n\nSit nisi adipisicing pariatur enim enim sunt officia ad labore voluptate magna proident velit excepteur pariatur cillum sit excepteur elit veniam excepteur minim nisi cupidatat proident dolore irure veniam mollit.', + completed : false, + dueDate : '2017-10-18T13:03:37.943Z', + priority : 1, + tags : [ + '91658b8a-f382-4b0c-a53f-e9390351c2c5', + '51483dd3-cb98-4400-9128-4bd66b455807' + ], + assignedTo: null, + subTasks : [ + { + id : '2768a969-a316-449b-bf82-93cff4252cbf', + title : 'Minim irure fugiat ullamco irure', + completed: false + }, + { + id : '6cc5ac8f-3a02-47e6-ad4b-0bd0222e2717', + title : 'Sint velit ex in adipisicing fugiat', + completed: false + } + ], + order : 0 + }, + { + id : '0fcece82-1691-4b98-a9b9-b63218f9deef', + type : 'task', + title : 'Create the landing/marketing page and host it on the beta channel', + notes : 'Et in lorem qui ipsum deserunt duis exercitation lorem elit qui qui ipsum tempor nulla velit aliquip enim consequat incididunt pariatur duis excepteur elit irure nulla ipsum dolor dolore est.\n\nAute deserunt nostrud id non ipsum do adipisicing laboris in minim officia magna elit minim mollit elit velit veniam lorem pariatur veniam sit excepteur irure commodo excepteur duis quis in.', + completed : false, + dueDate : null, + priority : 0, + tags : [], + assignedTo: 'e2c81627-a8a1-4bbc-9adc-ac4281e040d4', + subTasks : [], + order : 1 + }, + { + id : '2e6971cd-49d5-49f1-8cbd-fba5c71e6062', + type : 'task', + title : 'Move dependency system to Yarn for easier package management', + notes : 'Id fugiat et cupidatat magna nulla nulla eu cillum officia nostrud dolore in veniam ullamco nulla ex duis est enim nisi aute ipsum velit et laboris est pariatur est culpa.\n\nCulpa sunt ipsum esse quis excepteur enim culpa est voluptate reprehenderit consequat duis officia irure voluptate veniam dolore fugiat dolor est amet nostrud non velit irure do voluptate id sit.', + completed : false, + dueDate : '2019-05-24T03:55:38.969Z', + priority : 0, + tags : [ + 'c6058d0d-a4b0-4453-986a-9d249ec230b1', + '2b884143-419a-45ca-a7f6-48f99f4e7798', + '91658b8a-f382-4b0c-a53f-e9390351c2c5' + ], + assignedTo: '88a2a76c-0e6f-49da-b617-46d7c3b6e64d', + subTasks : [ + { + id : 'b9566b52-82cd-4d2a-b9b6-240c6b44e52b', + title : 'Nulla officia elit adipisicing', + completed: false + }, + { + id : '76f4dc8d-4803-4d98-b461-367a1d3746a8', + title : 'Magna nisi ut aliquip aliquip amet deserunt', + completed: false + } + ], + order : 2 + }, + { + id : '974f93b8-336f-4eec-b011-9ddb412ee828', + type : 'task', + title : 'Fix permission issues that the 0.0.7-alpha.2 has introduced', + notes : 'Excepteur deserunt tempor do lorem elit id magna pariatur irure ullamco elit dolor consectetur ad officia fugiat incididunt do elit aute esse eu voluptate adipisicing incididunt ea dolor aliqua dolor.\n\nConsequat est quis deserunt voluptate ipsum incididunt laboris occaecat irure laborum voluptate non sit labore voluptate sunt id sint ut laboris aute cupidatat occaecat eiusmod non magna aliquip deserunt nisi.', + completed : true, + dueDate : null, + priority : 2, + tags : [ + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: null, + subTasks : [ + { + id : '8e9644dc-0815-4258-8a08-4ce8d9912ec0', + title : 'Adipisicing aliquip voluptate veniam', + completed: false + }, + { + id : 'fc0f2283-3802-4ebe-b164-774bc2b84549', + title : 'Magna amet adipisicing velit nisi est', + completed: false + }, + { + id : '8a74b56f-14c0-4700-b737-8ccfa912f4b6', + title : 'Eiusmod dolore voluptate excepteur ipsum nostrud', + completed: false + }, + { + id : '439ed5b7-156d-414a-ba20-ce779e3ec037', + title : 'Laborum adipisicing quis culpa amet', + completed: true + } + ], + order : 3 + }, + { + id : '5d877fc7-b881-4527-a6aa-d39d642feb23', + type : 'task', + title : 'Start Twitter promotions using the company Twitter account', + notes : 'Labore mollit in aliqua exercitation aliquip elit nisi nisi voluptate reprehenderit et dolor incididunt cupidatat ullamco nulla consequat voluptate adipisicing dolor qui magna sint aute do excepteur in aliqua consectetur.\n\nElit laborum non duis irure ad ullamco aliqua enim exercitation quis fugiat aute esse esse magna et ad cupidatat voluptate sint nulla nulla lorem et enim deserunt proident deserunt consectetur.', + completed : true, + dueDate : null, + priority : 1, + tags : [ + '51483dd3-cb98-4400-9128-4bd66b455807' + ], + assignedTo: '4678ad07-e057-48a9-a5d1-3cf98e722eeb', + subTasks : [ + { + id : 'b076c673-7d76-43b5-aaca-d0c496f397e5', + title : 'Esse dolore nostrud lorem consectetur', + completed: false + }, + { + id : 'a01522ff-07fa-4fbd-a168-47802446b705', + title : 'Lorem velit voluptate laborum ad', + completed: false + } + ], + order : 4 + }, + { + id : '3d1c26c5-1e5e-4eb6-8006-ed6037ed9aca', + type : 'task', + title : 'Add more error pages - 401, 301, 303, 500 etc.', + notes : 'Sunt mollit irure dolor aliquip sit veniam amet ut sunt dolore cillum sint pariatur qui irure proident velit non excepteur quis ut et quis velit aliqua ea sunt cillum sit.\n\nReprehenderit est culpa ut incididunt sit dolore mollit in occaecat velit culpa consequat reprehenderit ex lorem cupidatat proident reprehenderit ad eu sunt sit ut sit culpa ea reprehenderit aliquip est.', + completed : false, + dueDate : '2018-09-29T19:30:45.325Z', + priority : 1, + tags : [ + 'c6058d0d-a4b0-4453-986a-9d249ec230b1' + ], + assignedTo: '6617b0a3-0ccd-44ea-af78-c6633115d683', + subTasks : [], + order : 5 + }, + { + id : '11bd2b9a-85b4-41c9-832c-bd600dfa3a52', + type : 'task', + title : 'Clear the caches before the production build', + notes : 'Sint mollit consectetur voluptate fugiat sunt ipsum adipisicing labore exercitation eiusmod enim excepteur enim proident velit sint magna commodo dolor ex ipsum sit nisi deserunt labore eu irure amet ea.\n\nOccaecat ut velit et sint pariatur laboris voluptate duis aliqua aliqua exercitation et duis duis eu laboris excepteur occaecat quis esse enim ex dolore commodo fugiat excepteur adipisicing in fugiat.', + completed : true, + dueDate : '2017-10-12T12:03:55.559Z', + priority : 2, + tags : [], + assignedTo: '271e6a06-0d37-433d-bc8d-607b12bcbed9', + subTasks : [ + { + id : '9cd8eba8-7c41-4230-9d80-f71f7ed1cfe9', + title : 'Eu exercitation proident dolore velit', + completed: true + } + ], + order : 6 + }, + { + id : 'f55c023a-785e-4f0f-b5b7-47da75224deb', + type : 'task', + title : 'Examine the package loss rates that the 0.0.7-alpha.1 has introduced', + notes : 'In exercitation sunt ad anim commodo sunt do in sunt est officia amet ex ullamco do nisi consectetur lorem proident lorem adipisicing incididunt consequat fugiat voluptate sint est anim officia.\n\nVelit sint aliquip elit culpa amet eu mollit veniam esse deserunt ex occaecat quis lorem minim occaecat culpa esse veniam enim duis excepteur ipsum esse ut ut velit cillum adipisicing.', + completed : false, + dueDate : '2022-06-05T19:41:12.501Z', + priority : 2, + tags : [], + assignedTo: '7f5db993-ec36-412f-9db3-16d076a98807', + subTasks : [ + { + id : 'cdb08aa2-980d-48c6-b15c-7970775b7b5a', + title : 'Veniam magna minim duis', + completed: true + }, + { + id : 'dc19e213-687e-4391-8b61-9aabed2fb288', + title : 'Eu dolore et adipisicing commodo adipisicing consequat', + completed: false + }, + { + id : '7e365400-59b9-4ec9-b397-8bf40de56ec4', + title : 'Do culpa quis consequat cupidatat', + completed: true + }, + { + id : '1a0f98b0-dfc4-4ac9-b8f5-ce322da2a849', + title : 'Est duis do sunt esse magna ex', + completed: true + } + ], + order : 7 + }, + { + id : 'c577a67d-357a-4b88-96e8-a0ee1fe9162e', + type : 'task', + title : 'Start Google ads using the company coupons', + notes : 'Ad adipisicing duis consequat magna sunt consequat aliqua eiusmod qui et nostrud voluptate sit enim reprehenderit anim exercitation ipsum ipsum anim ipsum laboris aliqua ex lorem aute officia voluptate culpa.\n\nNostrud anim ex pariatur ipsum et nostrud esse veniam ipsum ipsum irure velit ad quis irure tempor nulla amet aute id esse reprehenderit ea consequat consequat ea minim magna magna.', + completed : false, + dueDate : '2020-04-06T02:57:58.506Z', + priority : 1, + tags : [ + 'c6058d0d-a4b0-4453-986a-9d249ec230b1', + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: 'a21ec32e-54ba-480b-afdc-d1cbe18a96fd', + subTasks : [ + { + id : 'b1849778-a69c-46ad-8373-99aa6a655965', + title : 'Ipsum ipsum occaecat nulla', + completed: true + }, + { + id : '8325f17a-2af0-4f64-b043-8ffdaaa62408', + title : 'Quis proident amet id non nulla', + completed: true + } + ], + order : 8 + }, + { + id : '1a680c29-7ece-4a80-9709-277ad4da8b4b', + type : 'section', + title : 'Developer API for the payment system', + notes : 'Magna laborum et amet magna fugiat officia deserunt in exercitation aliquip nulla magna velit ea labore quis deserunt ipsum occaecat id id consequat non eiusmod mollit est voluptate ea ex.\n\nReprehenderit mollit ut excepteur minim veniam fugiat enim id pariatur amet elit nostrud occaecat pariatur et esse aliquip irure quis officia reprehenderit voluptate voluptate est et voluptate sint esse dolor.', + completed : false, + dueDate : '2020-02-08T22:42:35.937Z', + priority : 2, + tags : [ + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270', + '2b884143-419a-45ca-a7f6-48f99f4e7798' + ], + assignedTo: '3e353312-6a9b-46af-adda-5061b06e806b', + subTasks : [], + order : 9 + }, + { + id : 'c49c2216-8bdb-4df0-be25-d5ea1dbb5688', + type : 'task', + title : 'Re-think the current API restrictions to loosen them a bit', + notes : 'Adipisicing laboris ipsum fugiat et cupidatat aute esse ad labore et est cillum ipsum sunt duis do veniam minim officia deserunt in eiusmod eu duis dolore excepteur consectetur id elit.\n\nAnim excepteur occaecat laborum sunt in elit quis sit duis adipisicing laboris anim laborum et pariatur elit qui consectetur laborum reprehenderit occaecat nostrud pariatur aliqua elit nisi commodo eu excepteur.', + completed : false, + dueDate : '2019-08-10T06:18:17.785Z', + priority : 1, + tags : [ + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: '368aab1e-ebce-43ba-8925-4cf13937867b', + subTasks : [ + { + id : '756ceee7-a9b2-45b6-9f22-5be974da7cf5', + title : 'Irure incididunt adipisicing consectetur enim', + completed: false + } + ], + order : 10 + }, + { + id : '3ef176fa-6cba-4536-9f43-540c686a4faa', + type : 'task', + title : 'Pre-flight checks causes random crashes on logging service', + notes : 'Culpa duis nostrud qui velit sint magna officia fugiat ipsum eiusmod enim laborum pariatur anim culpa elit ipsum lorem pariatur exercitation laborum do labore cillum exercitation nisi reprehenderit exercitation quis.\n\nMollit aute dolor non elit et incididunt eiusmod non in commodo occaecat id in excepteur aliqua ea anim pariatur sint elit voluptate dolor eu non laborum laboris voluptate qui duis.', + completed : false, + dueDate : '2024-08-23T14:33:06.227Z', + priority : 2, + tags : [ + '91658b8a-f382-4b0c-a53f-e9390351c2c5' + ], + assignedTo: '271e6a06-0d37-433d-bc8d-607b12bcbed9', + subTasks : [ + { + id : '35b06803-2019-4025-b642-841e44de7571', + title : 'Reprehenderit et eiusmod do consectetur ipsum', + completed: false + }, + { + id : '7ec47bbc-e644-45ae-84e3-de36ee35a22b', + title : 'Officia lorem tempor occaecat fugiat elit elit', + completed: false + }, + { + id : 'b4560302-7bed-412c-8e43-a5ce0bce5eed', + title : 'Incididunt commodo amet fugiat nulla et', + completed: false + }, + { + id : '494bfcac-44ee-46db-add2-0e5dbc3952c4', + title : 'Enim ipsum fugiat ipsum aute quis', + completed: true + }, + { + id : 'ffa45bc0-4466-4584-891a-0f75e39766c1', + title : 'Esse excepteur commodo ullamco', + completed: true + } + ], + order : 11 + }, + { + id : '7bc6b7b4-7ad8-4cbe-af36-7301642d35fb', + type : 'task', + title : 'Increase the timeout amount to allow more retries on client side', + notes : 'Ea proident dolor tempor dolore incididunt velit incididunt ullamco quis proident consectetur magna excepteur cillum officia ex do aliqua reprehenderit est esse officia labore dolore aute laboris eu commodo aute.\n\nOfficia quis id ipsum adipisicing ipsum eu exercitation cillum ex elit pariatur adipisicing ullamco ullamco nulla dolore magna aliqua reprehenderit eu laborum voluptate reprehenderit non eiusmod deserunt velit magna do.', + completed : true, + dueDate : '2017-08-16T12:56:48.039Z', + priority : 1, + tags : [ + '51483dd3-cb98-4400-9128-4bd66b455807', + 'd3ef4226-ef2c-43b0-a986-3e3e07f32799', + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: '4d24cf48-a322-4d53-89cb-9140dfd5c6ba', + subTasks : [ + { + id : 'a72f756b-e1db-4492-96b9-93785400e8bb', + title : 'Amet eiusmod consequat non culpa', + completed: false + }, + { + id : '07fb282a-141a-4014-96d2-030894a6e211', + title : 'Nulla laboris veniam qui et nostrud enim', + completed: false + }, + { + id : '40629855-8ba8-4590-9ebe-2e2ff3f20820', + title : 'Est est nulla cillum aliquip duis ipsum', + completed: true + }, + { + id : '96e283b2-cd3e-4ab9-9770-07247691304b', + title : 'Non elit tempor commodo enim laboris', + completed: true + }, + { + id : '95c6a48a-4e42-4909-8c25-0fafd62aeefa', + title : 'Proident est anim do laborum nostrud', + completed: false + } + ], + order : 12 + }, + { + id : '56c9ed66-a1d2-4803-a160-fba29b826cb4', + type : 'task', + title : 'Create the landing/marketing page and host it on the beta channel', + notes : 'Elit cillum incididunt enim cupidatat ex elit cillum aute dolor consectetur proident non minim eu est deserunt proident mollit ullamco laborum anim ea labore anim ex enim ullamco consectetur enim.\n\nEx magna consectetur esse enim consequat non aliqua nulla labore mollit sit quis ex fugiat commodo eu cupidatat irure incididunt consequat enim ut deserunt consequat elit consequat sint adipisicing sunt.', + completed : true, + dueDate : '2023-09-15T15:12:36.910Z', + priority : 0, + tags : [ + '2b884143-419a-45ca-a7f6-48f99f4e7798' + ], + assignedTo: '3a23baf7-2db8-4ef5-8d49-86d3e708dff5', + subTasks : [ + { + id : 'f1890ef6-89ed-47ca-a124-8305d7fe71fd', + title : 'Sit eu aliqua et et', + completed: true + }, + { + id : '647f63b9-27b8-4d65-8e09-874ef5a48573', + title : 'Voluptate esse cillum commodo', + completed: true + }, + { + id : '2934f015-1fd1-41c0-8b5a-d7adb5c50553', + title : 'Qui commodo fugiat eiusmod sint anim', + completed: true + }, + { + id : 'f964fc8d-662c-4586-a39f-dab6674f2760', + title : 'Consequat nulla anim velit reprehenderit', + completed: false + }, + { + id : 'ab3dd1a9-a9fb-4864-8630-da270cf71ee5', + title : 'Adipisicing officia ex laboris', + completed: true + } + ], + order : 13 + }, + { + id : '21c1b662-33c8-44d7-9530-91896afeeac7', + type : 'task', + title : 'Move dependency system to Yarn for easier package management', + notes : 'Duis culpa ut veniam voluptate consequat proident magna eiusmod id est magna culpa nulla enim culpa mollit velit lorem mollit ut minim dolore in tempor reprehenderit cillum occaecat proident ea.\n\nVeniam fugiat ea duis qui et eu eiusmod voluptate id cillum eiusmod eu reprehenderit minim reprehenderit nisi cillum nostrud duis eu magna minim sunt voluptate eu pariatur nulla ullamco elit.', + completed : true, + dueDate : '2020-08-08T16:32:24.768Z', + priority : 1, + tags : [], + assignedTo: null, + subTasks : [ + { + id : 'e5fece14-cc26-40df-9319-23568cf89662', + title : 'Tempor qui eiusmod et', + completed: false + }, + { + id : '30e6117d-e2a2-4f97-a674-19a554a94829', + title : 'Tempor magna eu dolore aliquip', + completed: false + }, + { + id : 'a5dd7270-1bc7-4b2b-abf0-9366eaca972d', + title : 'Lorem duis esse commodo', + completed: false + }, + { + id : '40ffd839-046f-4272-9232-5391d62477f7', + title : 'Minim aute eu ut id', + completed: false + } + ], + order : 14 + }, + { + id : '5fa52c90-82be-41ae-96ec-5fc67cf054a4', + type : 'task', + title : 'Fix permission issues that the 0.0.7-alpha.2 has introduced', + notes : 'Mollit nostrud ea irure ex ipsum in cupidatat irure sit officia reprehenderit adipisicing et occaecat cupidatat exercitation mollit esse in excepteur qui elit exercitation velit fugiat exercitation est officia excepteur.\n\nQuis esse voluptate laborum non veniam duis est fugiat tempor culpa minim velit minim ut duis qui officia consectetur ex nostrud ut elit elit nulla in consectetur voluptate aliqua aliqua.', + completed : false, + dueDate : '2019-10-13T08:25:17.064Z', + priority : 0, + tags : [ + '2b884143-419a-45ca-a7f6-48f99f4e7798' + ], + assignedTo: 'b2e97a96-2f15-4e3d-aff5-4ddf2af924d4', + subTasks : [ + { + id : '2ef107fb-3c21-4801-861f-abaf4fd6def0', + title : 'Voluptate qui excepteur id in', + completed: true + }, + { + id : '0afb4ebf-fcc7-47dc-8351-a88cb47c39ee', + title : 'Laborum ipsum aute nisi anim', + completed: false + }, + { + id : '2f22bff2-72be-4ff5-b037-c3bf0f1d5637', + title : 'Amet duis velit sunt non', + completed: false + } + ], + order : 15 + }, + { + id : 'b6d8909f-f36d-4885-8848-46b8230d4476', + type : 'task', + title : 'Start Twitter promotions using the company Twitter account', + notes : 'Laboris ea nisi commodo nulla cillum consequat consectetur nisi velit adipisicing minim nulla culpa amet quis sit duis id id aliqua aute exercitation non reprehenderit aliquip enim eiusmod eu irure.\n\nNon irure consectetur sunt cillum do adipisicing excepteur labore proident ut officia dolor fugiat velit sint consectetur cillum qui amet enim anim mollit laboris consectetur non do laboris lorem aliqua.', + completed : true, + dueDate : '2020-02-03T05:39:30.880Z', + priority : 1, + tags : [ + '2b884143-419a-45ca-a7f6-48f99f4e7798' + ], + assignedTo: '65e15136-5168-4655-8bbc-e3ad8a94bf67', + subTasks : [], + order : 16 + }, + { + id : '9496235d-4d0c-430b-817e-1cba96404f95', + type : 'task', + title : 'Add more error pages - 401, 301, 303, 500 etc.', + notes : 'Ullamco eiusmod do pariatur pariatur consectetur commodo proident ex voluptate ullamco culpa commodo deserunt pariatur incididunt nisi magna dolor est minim eu ex voluptate deserunt labore id magna excepteur et.\n\nReprehenderit dolore pariatur exercitation ad non fugiat quis proident fugiat incididunt ea magna pariatur et exercitation tempor cillum eu consequat adipisicing est laborum sit cillum ea fugiat mollit cupidatat est.', + completed : true, + dueDate : '2020-03-09T19:42:06.383Z', + priority : 1, + tags : [], + assignedTo: '7f5db993-ec36-412f-9db3-16d076a98807', + subTasks : [ + { + id : '9e710568-306f-47f9-b397-5634dc7a1a52', + title : 'Lorem excepteur non anim non exercitation fugiat', + completed: true + }, + { + id : 'bd10d3d5-22d1-467d-aa6b-431d23203f51', + title : 'Nulla non in occaecat nulla', + completed: false + }, + { + id : '0a768b47-7248-4000-a201-e51f86401317', + title : 'Dolor qui deserunt duis enim do veniam', + completed: true + } + ], + order : 17 + }, + { + id : '7fde17e6-4ac1-47dd-a363-2f4f14dcf76a', + type : 'task', + title : 'Clear the caches before the production build', + notes : 'Qui quis nulla excepteur voluptate elit culpa occaecat id ex do adipisicing est mollit id anim nisi irure amet officia ut sint aliquip dolore labore cupidatat magna laborum esse ea.\n\nEnim magna duis sit incididunt amet anim et nostrud laborum eiusmod et ea fugiat aliquip velit sit fugiat consectetur ipsum anim do enim excepteur cupidatat consequat sunt irure tempor ut.', + completed : true, + dueDate : '2022-08-24T03:03:09.899Z', + priority : 1, + tags : [ + '2b884143-419a-45ca-a7f6-48f99f4e7798', + '91658b8a-f382-4b0c-a53f-e9390351c2c5', + 'c6058d0d-a4b0-4453-986a-9d249ec230b1', + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: '88a2a76c-0e6f-49da-b617-46d7c3b6e64d', + subTasks : [ + { + id : 'f82708c3-2b58-4ac0-b58c-164c0804c631', + title : 'Mollit laborum tempor lorem cupidatat dolore nostrud', + completed: true + }, + { + id : '0017121e-79fc-403c-bb1c-84dc28f79e06', + title : 'Nisi sint sint et et ad', + completed: true + }, + { + id : '9073242a-5be6-487a-9e50-ea298700af79', + title : 'Duis nulla ad magna', + completed: false + } + ], + order : 18 + }, + { + id : '90a3ed58-e13b-40cf-9219-f933bf9c9b8f', + type : 'task', + title : 'Examine the package loss rates that the 0.0.7-alpha.1 has introduced', + notes : 'Consequat consectetur commodo deserunt sunt aliquip deserunt ex tempor esse nostrud sit dolore anim nostrud nulla dolore veniam minim laboris non dolor veniam lorem veniam deserunt laborum aute amet irure.\n\nEiusmod officia veniam reprehenderit ea aliquip velit anim aute minim aute nisi tempor qui sunt deserunt voluptate velit elit ut adipisicing ipsum et excepteur ipsum eu ullamco nisi esse dolor.', + completed : false, + dueDate : '2023-10-04T15:48:16.507Z', + priority : 1, + tags : [ + 'd3ef4226-ef2c-43b0-a986-3e3e07f32799' + ], + assignedTo: null, + subTasks : [ + { + id : 'eaab24ed-cf9e-4ee7-b7ff-acd8f62f617a', + title : 'Eiusmod nulla enim laborum deserunt in', + completed: false + }, + { + id : '700d067c-c5be-4532-95e3-ba575effae7c', + title : 'Sunt sint ea est commodo id', + completed: false + } + ], + order : 19 + }, + { + id : '81ac908c-35a2-4705-8d75-539863c35c09', + type : 'task', + title : 'Start Google ads using the company coupons', + notes : 'Sit occaecat sint nulla in esse dolor occaecat in ea sit irure magna magna veniam fugiat consequat exercitation ipsum ex officia velit consectetur consequat voluptate lorem eu proident lorem incididunt.\n\nExcepteur exercitation et qui labore nisi eu voluptate ipsum deserunt deserunt eu est minim dolor ad proident nulla reprehenderit culpa minim voluptate dolor nostrud dolor anim labore aliqua officia nostrud.', + completed : true, + dueDate : '2024-02-01T10:02:52.745Z', + priority : 1, + tags : [ + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: '368aab1e-ebce-43ba-8925-4cf13937867b', + subTasks : [ + { + id : '651a87c6-4376-42c4-9dfd-fad7525e7eb3', + title : 'Aliqua est excepteur excepteur deserunt id', + completed: true + } + ], + order : 20 + }, + { + id : '153376ed-691f-4dfd-ae99-e204a49edc44', + type : 'task', + title : 'Re-think the current API restrictions to loosen them a bit', + notes : 'Duis sint velit incididunt exercitation eiusmod nisi sunt ex est fugiat ad cupidatat sunt nisi elit do duis amet voluptate ipsum aliquip lorem aliqua sint esse in magna irure officia.\n\nNon eu ex elit ut est voluptate tempor amet ut officia in duis deserunt cillum labore do culpa id dolore magna anim consectetur qui consectetur fugiat labore mollit magna irure.', + completed : true, + dueDate : '2021-02-22T17:42:00.257Z', + priority : 2, + tags : [], + assignedTo: '65f1c421-83c5-4cdf-99da-d97794328679', + subTasks : [], + order : 21 + }, + { + id : '1ebde495-1bcd-4e8f-b6f6-cf63b521ad06', + type : 'section', + title : 'Marketing and promotions for the mobile app', + notes : 'Aute commodo reprehenderit cupidatat duis nulla mollit sint cupidatat elit adipisicing fugiat sunt cupidatat amet proident fugiat aute adipisicing et non minim occaecat ea esse consectetur aute culpa exercitation incididunt.\n\nEnim et lorem anim dolor excepteur qui tempor cupidatat do proident adipisicing esse incididunt mollit quis irure amet ad officia culpa minim cillum veniam voluptate lorem exercitation sunt cillum dolor.', + completed : false, + dueDate : '2018-08-04T19:32:53.652Z', + priority : 1, + tags : [], + assignedTo: 'e62ab50e-90d3-4ed7-a911-093bb44d0c50', + subTasks : [ + { + id : 'c5a8b915-0b0f-4dd3-a1a3-e538fa191747', + title : 'Adipisicing do minim voluptate', + completed: true + }, + { + id : '52b50615-0d80-42b6-97cb-1b71eaec1632', + title : 'Et eiusmod est adipisicing officia', + completed: true + } + ], + order : 22 + }, + { + id : '4e7ce72f-863a-451f-9160-cbd4fbbc4c3d', + type : 'task', + title : 'Pre-flight checks causes random crashes on logging service', + notes : 'Exercitation sit eiusmod enim officia exercitation eiusmod sunt eiusmod excepteur ad commodo eiusmod qui proident quis aliquip excepteur sit cillum occaecat non dolore sit in labore ut duis esse duis.\n\nConsequat sunt voluptate consectetur dolor laborum enim nostrud deserunt incididunt sint veniam laboris sunt amet velit anim duis aliqua sunt aliqua aute qui nisi mollit qui irure ullamco aliquip laborum.', + completed : true, + dueDate : '2020-09-29T02:25:14.111Z', + priority : 1, + tags : [], + assignedTo: 'ef44b39b-3272-45f5-a15e-264c3b2d118e', + subTasks : [ + { + id : '654c9b65-6f94-4ae7-bf11-27f979cc670e', + title : 'Esse exercitation cillum ex', + completed: false + }, + { + id : '3c49aba9-1e83-471f-b8b8-21cc7d20292e', + title : 'Duis sunt commodo fugiat irure minim', + completed: false + }, + { + id : '4fcb2e0b-677c-4915-978d-70e82b16745a', + title : 'Anim in qui ut', + completed: false + }, + { + id : 'dd864dea-61d2-4fb0-b433-286993b6ad08', + title : 'Reprehenderit irure exercitation occaecat', + completed: true + } + ], + order : 23 + }, + { + id : '0795a74f-7a84-4edf-8d66-296cdef70003', + type : 'task', + title : 'Increase the timeout amount to allow more retries on client side', + notes : 'Minim commodo cillum do id qui irure aliqua laboris excepteur laboris magna enim est lorem consectetur tempor laboris proident proident eu irure dolor eiusmod in officia lorem quis laborum ullamco.\n\nQui excepteur ex sit esse dolore deserunt ullamco occaecat laboris fugiat cupidatat excepteur laboris amet dolore enim velit ipsum velit sint cupidatat consectetur cupidatat deserunt sit eu do ullamco quis.', + completed : true, + dueDate : '2019-03-09T02:34:29.592Z', + priority : 2, + tags : [ + 'c6058d0d-a4b0-4453-986a-9d249ec230b1', + 'd3ef4226-ef2c-43b0-a986-3e3e07f32799' + ], + assignedTo: '6617b0a3-0ccd-44ea-af78-c6633115d683', + subTasks : [ + { + id : '56f3dccb-a72b-485c-94e7-fe68477023e2', + title : 'Velit velit voluptate in occaecat nostrud', + completed: true + }, + { + id : '70cb77a9-82fa-407b-a63e-55aedc241495', + title : 'Minim anim velit eiusmod qui', + completed: true + }, + { + id : '08a31dbc-6be4-469b-9ff4-0ed5342082bd', + title : 'Laboris commodo laborum irure', + completed: false + }, + { + id : '34d6c603-6f5a-4bc4-9f94-12bfd940c3c7', + title : 'Mollit mollit nostrud mollit id velit ullamco', + completed: true + } + ], + order : 24 + }, + { + id : '05532574-c102-4228-89a8-55fff32ec6fc', + type : 'task', + title : 'Create the landing/marketing page and host it on the beta channel', + notes : 'Reprehenderit anim consectetur anim dolor magna consequat excepteur tempor enim duis magna proident ullamco aute voluptate elit laborum mollit labore id ex lorem est mollit do qui ex labore nulla.\n\nUt proident elit proident adipisicing elit fugiat ex ullamco dolore excepteur excepteur labore laborum sunt ipsum proident magna ex voluptate laborum voluptate sint proident eu reprehenderit non excepteur quis eiusmod.', + completed : true, + dueDate : '2023-12-08T23:20:50.910Z', + priority : 2, + tags : [ + 'a0bf42ca-c3a5-47be-8341-b9c0bb8ef270' + ], + assignedTo: null, + subTasks : [], + order : 25 + }, + { + id : 'b3917466-aa51-4293-9d5b-120b0ce6635c', + type : 'task', + title : 'Move dependency system to Yarn for easier package management', + notes : 'Ipsum officia mollit qui laboris sunt amet aliquip cupidatat minim non elit commodo eiusmod labore mollit pariatur aute reprehenderit ullamco occaecat enim pariatur aute amet occaecat incididunt irure ad ut.\n\nIncididunt cupidatat pariatur magna sint sit culpa ad cupidatat cillum exercitation consequat minim pariatur consectetur aliqua non adipisicing magna ad nulla ea do est nostrud eu aute id occaecat ut.', + completed : false, + dueDate : '2018-01-14T09:58:38.444Z', + priority : 1, + tags : [], + assignedTo: '56a3e7ce-01da-43fc-ab9f-a8a39fa980de', + subTasks : [ + { + id : '3a4c4013-27f1-4164-8a64-e7bb4f1a63a9', + title : 'Adipisicing excepteur mollit non sunt amet laboris', + completed: false + }, + { + id : '103bf29e-06a1-4d30-89b9-b67aa442d605', + title : 'Consectetur voluptate anim labore aliqua elit', + completed: false + }, + { + id : 'b77729f1-9ed1-4d9e-95d0-347f4cd0943c', + title : 'Laboris occaecat aliquip esse magna nulla', + completed: true + }, + { + id : '695aace7-8679-4b35-96c7-cf23737cd9f1', + title : 'Exercitation eu aliquip cillum ipsum', + completed: false + }, + { + id : 'ffd45f31-7f0a-4c6a-b62c-18148f6841db', + title : 'Minim aute ad et esse officia nostrud', + completed: true + } + ], + order : 26 + }, + { + id : '2f2fb472-24d4-4a00-aa80-d513fa6c059c', + type : 'task', + title : 'Fix permission issues that the 0.0.7-alpha.2 has introduced', + notes : 'Dolor cupidatat do qui in tempor dolor magna magna ut dolor est aute veniam consectetur enim sunt sunt duis magna magna aliquip id reprehenderit dolor in veniam ullamco incididunt occaecat.\n\nId duis pariatur anim cillum est sint non veniam voluptate deserunt anim nostrud duis voluptate occaecat elit ut veniam voluptate do qui est ad velit irure sint lorem ullamco aliqua.', + completed : true, + dueDate : '2020-06-08T00:23:24.051Z', + priority : 1, + tags : [ + '91658b8a-f382-4b0c-a53f-e9390351c2c5' + ], + assignedTo: '65f1c421-83c5-4cdf-99da-d97794328679', + subTasks : [ + { + id : '4028671b-ef75-4b76-a03f-9f2bddadc618', + title : 'Commodo excepteur proident ipsum reprehenderit', + completed: true + }, + { + id : 'b122168f-8327-408f-8b9c-498dd6ba6c81', + title : 'Mollit ullamco eiusmod exercitation deserunt', + completed: false + }, + { + id : 'f233d812-be56-4d8a-ab14-a083f7d7cd70', + title : 'Mollit nostrud ea deserunt mollit aliquip', + completed: false + }, + { + id : '0833be70-82b2-46cb-ad84-f11120ea634a', + title : 'Labore occaecat proident ullamco', + completed: false + } + ], + order : 27 + }, + { + id : '2fffd148-7644-466d-8737-7dde88c54154', + type : 'task', + title : 'Start Twitter promotions using the company Twitter account', + notes : 'Velit commodo pariatur ullamco elit sunt dolor quis irure amet tempor laboris labore tempor nisi consectetur ea proident dolore culpa nostrud esse amet commodo do esse laboris laboris in magna.\n\nAute officia labore minim laborum irure cupidatat occaecat laborum ex labore ipsum aliqua cillum do exercitation esse et veniam excepteur mollit incididunt ut qui irure culpa qui deserunt nostrud tempor.', + completed : false, + dueDate : '2024-01-27T11:17:52.198Z', + priority : 1, + tags : [ + 'd3ef4226-ef2c-43b0-a986-3e3e07f32799' + ], + assignedTo: 'b2e97a96-2f15-4e3d-aff5-4ddf2af924d4', + subTasks : [ + { + id : 'd2ffe439-2f80-4dce-84a7-d4ac5e17bbf3', + title : 'Occaecat anim sunt dolor proident', + completed: false + } + ], + order : 28 + }, + { + id : '24a1034e-b4d6-4a86-a1ea-90516e87e810', + type : 'task', + title : 'Add more error pages - 401, 301, 303, 500 etc.', + notes : 'Exercitation eu in officia lorem commodo pariatur pariatur nisi consectetur qui elit in aliquip et ullamco duis nostrud aute laborum laborum est dolor non qui amet deserunt ex et aliquip.\n\nProident consectetur eu amet minim labore anim ad non aute duis eiusmod sit ad elit magna do aliquip aliqua laborum dolor laboris ea irure duis mollit fugiat tempor eu est.', + completed : false, + dueDate : '2024-06-24T04:38:28.087Z', + priority : 1, + tags : [ + '51483dd3-cb98-4400-9128-4bd66b455807' + ], + assignedTo: '7f5db993-ec36-412f-9db3-16d076a98807', + subTasks : [ + { + id : '75f55d75-c835-4a6c-a2ae-7a42ae3a7c9d', + title : 'Et laboris quis lorem est laboris', + completed: true + }, + { + id : 'c7c91a52-b060-45af-b1b1-a4cff26bf11e', + title : 'Reprehenderit elit dolore exercitation pariatur', + completed: true + } + ], + order : 29 + } +]; diff --git a/src/app/mock-api/common/auth/api.ts b/src/app/mock-api/common/auth/api.ts new file mode 100644 index 00000000..d284164e --- /dev/null +++ b/src/app/mock-api/common/auth/api.ts @@ -0,0 +1,258 @@ +import { Injectable } from '@angular/core'; +import Base64 from 'crypto-js/enc-base64'; +import HmacSHA256 from 'crypto-js/hmac-sha256'; +import Utf8 from 'crypto-js/enc-utf8'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { user as userData } from 'app/mock-api/common/user/data'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthMockApi +{ + private readonly _secret: any; + private _user: any = userData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Set the mock-api + this._secret = 'YOUR_VERY_CONFIDENTIAL_SECRET_FOR_SIGNING_JWT_TOKENS!!!'; + + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Forgot password - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/forgot-password', 1000) + .reply(() => { + + // Simply return true + return [ + 200, + true + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Reset password - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/reset-password', 1000) + .reply(() => { + + // Simply return true + return [ + 200, + true + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Sign in - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/sign-in', 1500) + .reply(({request}) => { + + // Sign in successful + if ( request.body.email === 'hughes.brian@company.com' && request.body.password === 'admin' ) + { + return [ + 200, + { + user : cloneDeep(this._user), + access_token: this._generateJWTToken(), + token_type : 'bearer' + } + ]; + } + + // Invalid credentials + return [ + 404, + false + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Verify and refresh the access token - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/refresh-access-token') + .reply(({request}) => { + + // Get the access token + const accessToken = request.body.access_token; + + // Verify the token + if ( this._verifyJWTToken(accessToken) ) + { + return [ + 200, + { + user : cloneDeep(this._user), + access_token: this._generateJWTToken(), + token_type : 'bearer' + } + ]; + } + + // Invalid token + return [ + 401, + { + error: 'Invalid token' + } + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Sign up - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/sign-up', 1500) + .reply(() => { + + // Simply return true + return [ + 200, + true + ]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Unlock session - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/auth/unlock-session', 1500) + .reply(({request}) => { + + // Sign in successful + if ( request.body.email === 'hughes.brian@company.com' && request.body.password === 'admin' ) + { + return [ + 200, + { + user : cloneDeep(this._user), + access_token: this._generateJWTToken(), + token_type : 'bearer' + } + ]; + } + + // Invalid credentials + return [ + 404, + false + ]; + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Return base64 encoded version of the given string + * + * @param source + * @private + */ + private _base64url(source: any): string + { + // Encode in classical base64 + let encodedSource = Base64.stringify(source); + + // Remove padding equal characters + encodedSource = encodedSource.replace(/=+$/, ''); + + // Replace characters according to base64url specifications + encodedSource = encodedSource.replace(/\+/g, '-'); + encodedSource = encodedSource.replace(/\//g, '_'); + + // Return the base64 encoded string + return encodedSource; + } + + /** + * Generates a JWT token using CryptoJS library. + * + * This generator is for mocking purposes only and it is NOT + * safe to use it in production frontend applications! + * + * @private + */ + private _generateJWTToken(): string + { + // Define token header + const header = { + alg: 'HS256', + typ: 'JWT' + }; + + // Calculate the issued at and expiration dates + const date = new Date(); + const iat = Math.floor(date.getTime() / 1000); + const exp = Math.floor((date.setDate(date.getDate() + 7)) / 1000); + + // Define token payload + const payload = { + iat: iat, + iss: 'Fuse', + exp: exp + }; + + // Stringify and encode the header + const stringifiedHeader = Utf8.parse(JSON.stringify(header)); + const encodedHeader = this._base64url(stringifiedHeader); + + // Stringify and encode the payload + const stringifiedPayload = Utf8.parse(JSON.stringify(payload)); + const encodedPayload = this._base64url(stringifiedPayload); + + // Sign the encoded header and mock-api + let signature: any = encodedHeader + '.' + encodedPayload; + signature = HmacSHA256(signature, this._secret); + signature = this._base64url(signature); + + // Build and return the token + return encodedHeader + '.' + encodedPayload + '.' + signature; + } + + /** + * Verify the given token + * + * @param token + * @private + */ + private _verifyJWTToken(token: string): boolean + { + // Split the token into parts + const parts = token.split('.'); + const header = parts[0]; + const payload = parts[1]; + const signature = parts[2]; + + // Re-sign and encode the header and payload using the secret + const signatureCheck = this._base64url(HmacSHA256(header + '.' + payload, this._secret)); + + // Verify that the resulting signature is valid + return (signature === signatureCheck); + } +} diff --git a/src/app/mock-api/common/messages/api.ts b/src/app/mock-api/common/messages/api.ts new file mode 100644 index 00000000..9dbb573d --- /dev/null +++ b/src/app/mock-api/common/messages/api.ts @@ -0,0 +1,164 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { messages as messagesData } from 'app/mock-api/common/messages/data'; + +@Injectable({ + providedIn: 'root' +}) +export class MessagesMockApi +{ + private _messages: any = messagesData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Messages - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/messages') + .reply(() => [200, cloneDeep(this._messages)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Messages - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/messages') + .reply(({request}) => { + + // Get the message + const newMessage = cloneDeep(request.body.message); + + // Generate a new GUID + newMessage.id = FuseMockApiUtils.guid(); + + // Unshift the new message + this._messages.unshift(newMessage); + + // Return the response + return [200, newMessage]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Messages - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/common/messages') + .reply(({request}) => { + + // Get the id and message + const id = request.body.id; + const message = cloneDeep(request.body.message); + + // Prepare the updated message + let updatedMessage = null; + + // Find the message and update it + this._messages.forEach((item: any, index: number, messages: any[]) => { + + if ( item.id === id ) + { + // Update the message + messages[index] = assign({}, messages[index], message); + + // Store the updated message + updatedMessage = messages[index]; + } + }); + + // Return the response + return [200, updatedMessage]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Messages - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/common/messages') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Prepare the deleted message + let deletedMessage = null; + + // Find the message + const index = this._messages.findIndex((item: any) => item.id === id); + + // Store the deleted message + deletedMessage = cloneDeep(this._messages[index]); + + // Delete the message + this._messages.splice(index, 1); + + // Return the response + return [200, deletedMessage]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Mark all as read - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/messages/mark-all-as-read') + .reply(() => { + + // Go through all messages + this._messages.forEach((item: any, index: number, messages: any[]) => { + + // Mark it as read + messages[index].read = true; + messages[index].seen = true; + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Toggle read status - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/messages/toggle-read-status') + .reply(({request}) => { + + // Get the message + const message = cloneDeep(request.body.message); + + // Prepare the updated message + let updatedMessage = null; + + // Find the message and update it + this._messages.forEach((item: any, index: number, messages: any[]) => { + + if ( item.id === message.id ) + { + // Update the message + messages[index].read = message.read; + + // Store the updated message + updatedMessage = messages[index]; + } + }); + + // Return the response + return [200, updatedMessage]; + }); + } +} diff --git a/src/app/mock-api/common/messages/data.ts b/src/app/mock-api/common/messages/data.ts new file mode 100644 index 00000000..e6a07a7d --- /dev/null +++ b/src/app/mock-api/common/messages/data.ts @@ -0,0 +1,92 @@ +import * as moment from 'moment'; +import { Message } from 'app/layout/common/messages/messages.types'; + +/* tslint:disable:max-line-length */ +export const messages: Message[] = [ + { + id : '832276cc-c5e9-4fcc-8e23-d38e2e267bc9', + image : 'assets/images/avatars/male-01.jpg', + title : 'Gary Peters', + description: 'We should talk about that at lunch!', + time : moment().subtract(25, 'minutes').toISOString(), // 25 minutes ago + read : false + }, + { + id : '608b4479-a3ac-4e26-8675-3609c52aca58', + image : 'assets/images/avatars/male-04.jpg', + title : 'Leo Gill (Client #8817)', + description: 'You can download the latest invoices now. Please check and let me know.', + time : moment().subtract(50, 'minutes').toISOString(), // 50 minutes ago + read : false + }, + { + id : '22148c0c-d788-4d49-9467-447677d11b76', + image : 'assets/images/avatars/female-01.jpg', + title : 'Sarah', + description: 'Don\'t forget to pickup Jeremy after school!', + time : moment().subtract(3, 'hours').toISOString(), // 3 hours ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : '492e2917-760c-4921-aa5a-3201a857cd48', + image : 'assets/images/avatars/female-12.jpg', + title : 'Nancy Salazar • Joy Publishing', + description: 'I\'ll proof read your bio on next Monday.', + time : moment().subtract(5, 'hours').toISOString(), // 5 hours ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : '214a46e5-cae7-4b18-9869-eabde7c7ea52', + image : 'assets/images/avatars/male-06.jpg', + title : 'Matthew Wood', + description: 'Dude, I heard that they are going to promote you! Congrats man, tonight the drinks are on me!', + time : moment().subtract(7, 'hours').toISOString(), // 7 hours ago + read : false, + link : '/dashboards/project', + useRouter : true + }, + { + id : '95930319-61cc-4c7e-9324-f1091865330c', + image : 'assets/images/avatars/female-04.jpg', + title : 'Elizabeth (New assistant)', + description: 'Boss, I\'ve sent all client invoices but Geoffrey refusing to pay.', + time : moment().subtract(9, 'hours').toISOString(), // 9 hours ago + read : false, + link : '/dashboards/project', + useRouter : true + }, + { + id : '802935e9-9577-48bc-98d1-308a4872afd7', + image : 'assets/images/avatars/male-06.jpg', + title : 'William Bell', + description: 'Did you see this game? We should hang out and give it a shot sometime.', + time : moment().subtract(1, 'day').toISOString(), // 1 day ago + read : true, + link : 'https://www.google.com', + useRouter : false + }, + { + id : '059f3738-633b-48ea-ad83-19016ce24c62', + image : 'assets/images/avatars/female-09.jpg', + title : 'Cheryl Obrien - HR', + description: 'Why did\'t you still look at the kitten pictures I\'ve sent to you!', + time : moment().subtract(3, 'days').toISOString(), // 3 days ago + read : false, + link : '/dashboards/project', + useRouter : true + }, + { + id : '5c2bb44d-5ca7-42ff-ad7e-46ced9f49a24', + image : 'assets/images/avatars/female-15.jpg', + title : 'Joan Jones - Tech', + description: 'Dude, Cheryl keeps bugging me with kitten pictures all the time :( What are we gonna do about it?', + time : moment().subtract(4, 'day').toISOString(), // 4 days ago + read : true, + link : '/dashboards/project', + useRouter : true + } +]; diff --git a/src/app/mock-api/common/navigation/api.ts b/src/app/mock-api/common/navigation/api.ts new file mode 100644 index 00000000..e82ebe9c --- /dev/null +++ b/src/app/mock-api/common/navigation/api.ts @@ -0,0 +1,84 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseNavigationItem } from '@fuse/components/navigation'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { compactNavigation, defaultNavigation, futuristicNavigation, horizontalNavigation } from 'app/mock-api/common/navigation/data'; + +@Injectable({ + providedIn: 'root' +}) +export class NavigationMockApi +{ + private readonly _compactNavigation: FuseNavigationItem[] = compactNavigation; + private readonly _defaultNavigation: FuseNavigationItem[] = defaultNavigation; + private readonly _futuristicNavigation: FuseNavigationItem[] = futuristicNavigation; + private readonly _horizontalNavigation: FuseNavigationItem[] = horizontalNavigation; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Navigation - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/navigation') + .reply(() => { + + // Fill compact navigation children using the default navigation + this._compactNavigation.forEach((compactNavItem) => { + this._defaultNavigation.forEach((defaultNavItem) => { + if ( defaultNavItem.id === compactNavItem.id ) + { + compactNavItem.children = cloneDeep(defaultNavItem.children); + } + }); + }); + + // Fill futuristic navigation children using the default navigation + this._futuristicNavigation.forEach((futuristicNavItem) => { + this._defaultNavigation.forEach((defaultNavItem) => { + if ( defaultNavItem.id === futuristicNavItem.id ) + { + futuristicNavItem.children = cloneDeep(defaultNavItem.children); + } + }); + }); + + // Fill horizontal navigation children using the default navigation + this._horizontalNavigation.forEach((horizontalNavItem) => { + this._defaultNavigation.forEach((defaultNavItem) => { + if ( defaultNavItem.id === horizontalNavItem.id ) + { + horizontalNavItem.children = cloneDeep(defaultNavItem.children); + } + }); + }); + + // Return the response + return [ + 200, + { + compact : cloneDeep(this._compactNavigation), + default : cloneDeep(this._defaultNavigation), + futuristic: cloneDeep(this._futuristicNavigation), + horizontal: cloneDeep(this._horizontalNavigation) + } + ]; + }); + } +} diff --git a/src/app/mock-api/common/navigation/data.ts b/src/app/mock-api/common/navigation/data.ts new file mode 100644 index 00000000..d1274e38 --- /dev/null +++ b/src/app/mock-api/common/navigation/data.ts @@ -0,0 +1,1284 @@ + +/* tslint:disable:max-line-length */ +import { FuseNavigationItem } from '@fuse/components/navigation'; + +export const defaultNavigation: FuseNavigationItem[] = [ + { + id : 'dashboards', + title : 'Dashboards', + subtitle: 'Unique dashboard designs', + type : 'group', + icon : 'heroicons_outline:home', + children: [ + { + id : 'dashboards.project', + title: 'Project', + type : 'basic', + icon : 'heroicons_outline:clipboard-check', + link : '/dashboards/project' + }, + { + id : 'dashboards.analytics', + title: 'Analytics', + type : 'basic', + icon : 'heroicons_outline:chart-pie', + link : '/dashboards/analytics' + } + ] + }, + { + id : 'apps', + title : 'Applications', + subtitle: 'Custom made application designs', + type : 'group', + icon : 'heroicons_outline:home', + children: [ + { + id : 'apps.calendar', + title : 'Calendar', + subtitle: '3 upcoming events', + type : 'basic', + icon : 'heroicons_outline:calendar', + link : '/apps/calendar' + }, + { + id : 'apps.contacts', + title: 'Contacts', + type : 'basic', + icon : 'heroicons_outline:user-group', + link : '/apps/contacts' + }, + { + id : 'apps.ecommerce', + title : 'ECommerce', + type : 'collapsable', + icon : 'heroicons_outline:shopping-cart', + children: [ + { + id : 'apps.ecommerce.inventory', + title: 'Inventory', + type : 'basic', + link : '/apps/ecommerce/inventory' + } + ] + }, + { + id : 'apps.file-manager', + title: 'File manager', + type : 'basic', + icon : 'heroicons_outline:cloud', + link : '/apps/file-manager' + }, + { + id : 'apps.help-center', + title : 'Help center', + type : 'collapsable', + icon : 'heroicons_outline:support', + link : '/apps/help-center', + children: [ + { + id : 'apps.help-center.home', + title : 'Home', + type : 'basic', + link : '/apps/help-center', + exactMatch: true + }, + { + id : 'apps.help-center.faqs', + title: 'FAQs', + type : 'basic', + link : '/apps/help-center/faqs' + }, + { + id : 'apps.help-center.guides', + title: 'Guides', + type : 'basic', + link : '/apps/help-center/guides' + }, + { + id : 'apps.help-center.support', + title: 'Support', + type : 'basic', + link : '/apps/help-center/support' + } + ] + }, + { + id : 'apps.mailbox', + title: 'Mailbox', + type : 'basic', + icon : 'heroicons_outline:mail', + link : '/apps/mailbox', + badge: { + title : '27', + classes: 'px-2 bg-pink-600 text-white rounded-full' + } + }, + { + id : 'apps.tasks', + title: 'Tasks', + type : 'basic', + icon : 'heroicons_outline:check-circle', + link : '/apps/tasks' + } + + ] + }, + { + id : 'pages', + title : 'Pages', + subtitle: 'Custom made page designs', + type : 'group', + icon : 'heroicons_outline:document', + children: [ + { + id : 'pages.authentication', + title : 'Authentication', + type : 'collapsable', + icon : 'heroicons_outline:lock-closed', + children: [ + { + id : 'pages.authentication.sign-in', + title : 'Sign in', + type : 'collapsable', + children: [ + { + id : 'pages.authentication.sign-in.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/sign-in/classic' + }, + { + id : 'pages.authentication.sign-in.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/sign-in/modern' + }, + { + id : 'pages.authentication.sign-in.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/sign-in/modern-reversed' + }, + { + id : 'pages.authentication.sign-in.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/sign-in/split-screen' + }, + { + id : 'pages.authentication.sign-in.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/sign-in/split-screen-reversed' + }, + { + id : 'pages.authentication.sign-in.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/sign-in/fullscreen' + }, + { + id : 'pages.authentication.sign-in.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/sign-in/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.sign-up', + title : 'Sign up', + type : 'collapsable', + link : '/pages/authentication/sign-up', + children: [ + { + id : 'pages.authentication.sign-up.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/sign-up/classic' + }, + { + id : 'pages.authentication.sign-up.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/sign-up/modern' + }, + { + id : 'pages.authentication.sign-up.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/sign-up/modern-reversed' + }, + { + id : 'pages.authentication.sign-up.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/sign-up/split-screen' + }, + { + id : 'pages.authentication.sign-up.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/sign-up/split-screen-reversed' + }, + { + id : 'pages.authentication.sign-up.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/sign-up/fullscreen' + }, + { + id : 'pages.authentication.sign-up.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/sign-up/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.sign-out', + title : 'Sign out', + type : 'collapsable', + link : '/pages/authentication/sign-out', + children: [ + { + id : 'pages.authentication.sign-out.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/sign-out/classic' + }, + { + id : 'pages.authentication.sign-out.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/sign-out/modern' + }, + { + id : 'pages.authentication.sign-out.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/sign-out/modern-reversed' + }, + { + id : 'pages.authentication.sign-out.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/sign-out/split-screen' + }, + { + id : 'pages.authentication.sign-out.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/sign-out/split-screen-reversed' + }, + { + id : 'pages.authentication.sign-out.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/sign-out/fullscreen' + }, + { + id : 'pages.authentication.sign-out.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/sign-out/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.forgot-password', + title : 'Forgot password', + type : 'collapsable', + link : '/pages/authentication/forgot-password', + children: [ + { + id : 'pages.authentication.forgot-password.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/forgot-password/classic' + }, + { + id : 'pages.authentication.forgot-password.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/forgot-password/modern' + }, + { + id : 'pages.authentication.forgot-password.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/forgot-password/modern-reversed' + }, + { + id : 'pages.authentication.forgot-password.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/forgot-password/split-screen' + }, + { + id : 'pages.authentication.forgot-password.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/forgot-password/split-screen-reversed' + }, + { + id : 'pages.authentication.forgot-password.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/forgot-password/fullscreen' + }, + { + id : 'pages.authentication.forgot-password.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/forgot-password/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.reset-password', + title : 'Reset password', + type : 'collapsable', + link : '/pages/authentication/reset-password', + children: [ + { + id : 'pages.authentication.reset-password.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/reset-password/classic' + }, + { + id : 'pages.authentication.reset-password.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/reset-password/modern' + }, + { + id : 'pages.authentication.reset-password.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/reset-password/modern-reversed' + }, + { + id : 'pages.authentication.reset-password.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/reset-password/split-screen' + }, + { + id : 'pages.authentication.reset-password.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/reset-password/split-screen-reversed' + }, + { + id : 'pages.authentication.reset-password.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/reset-password/fullscreen' + }, + { + id : 'pages.authentication.reset-password.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/reset-password/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.unlock-session', + title : 'Unlock session', + type : 'collapsable', + link : '/pages/authentication/unlock-session', + children: [ + { + id : 'pages.authentication.unlock-session.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/unlock-session/classic' + }, + { + id : 'pages.authentication.unlock-session.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/unlock-session/modern' + }, + { + id : 'pages.authentication.unlock-session.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/unlock-session/modern-reversed' + }, + { + id : 'pages.authentication.unlock-session.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/unlock-session/split-screen' + }, + { + id : 'pages.authentication.unlock-session.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/unlock-session/split-screen-reversed' + }, + { + id : 'pages.authentication.unlock-session.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/unlock-session/fullscreen' + }, + { + id : 'pages.authentication.unlock-session.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/unlock-session/fullscreen-reversed' + } + ] + }, + { + id : 'pages.authentication.confirmation-required', + title : 'Confirmation required', + type : 'collapsable', + link : '/pages/authentication/confirmation-required', + children: [ + { + id : 'pages.authentication.confirmation-required.classic', + title: 'Classic', + type : 'basic', + link : '/pages/authentication/confirmation-required/classic' + }, + { + id : 'pages.authentication.confirmation-required.modern', + title: 'Modern', + type : 'basic', + link : '/pages/authentication/confirmation-required/modern' + }, + { + id : 'pages.authentication.confirmation-required.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/authentication/confirmation-required/modern-reversed' + }, + { + id : 'pages.authentication.confirmation-required.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/authentication/confirmation-required/split-screen' + }, + { + id : 'pages.authentication.confirmation-required.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/authentication/confirmation-required/split-screen-reversed' + }, + { + id : 'pages.authentication.confirmation-required.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/authentication/confirmation-required/fullscreen' + }, + { + id : 'pages.authentication.confirmation-required.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/authentication/confirmation-required/fullscreen-reversed' + } + ] + } + ] + }, + { + id : 'pages.coming-soon', + title : 'Coming soon', + type : 'collapsable', + icon : 'heroicons_outline:clock', + link : '/pages/coming-soon', + children: [ + { + id : 'pages.coming-soon.classic', + title: 'Classic', + type : 'basic', + link : '/pages/coming-soon/classic' + }, + { + id : 'pages.coming-soon.modern', + title: 'Modern', + type : 'basic', + link : '/pages/coming-soon/modern' + }, + { + id : 'pages.coming-soon.modern-reversed', + title: 'Modern Reversed', + type : 'basic', + link : '/pages/coming-soon/modern-reversed' + }, + { + id : 'pages.coming-soon.split-screen', + title: 'Split Screen', + type : 'basic', + link : '/pages/coming-soon/split-screen' + }, + { + id : 'pages.coming-soon.split-screen-reversed', + title: 'Split Screen Reversed', + type : 'basic', + link : '/pages/coming-soon/split-screen-reversed' + }, + { + id : 'pages.coming-soon.fullscreen', + title: 'Fullscreen', + type : 'basic', + link : '/pages/coming-soon/fullscreen' + }, + { + id : 'pages.coming-soon.fullscreen-reversed', + title: 'Fullscreen Reversed', + type : 'basic', + link : '/pages/coming-soon/fullscreen-reversed' + } + ] + }, + { + id : 'pages.error', + title : 'Error', + type : 'collapsable', + icon : 'heroicons_outline:exclamation-circle', + children: [ + { + id : 'pages.error.404', + title: '404', + type : 'basic', + link : '/pages/error/404' + }, + { + id : 'pages.error.500', + title: '500', + type : 'basic', + link : '/pages/error/500' + } + ] + }, + { + id : 'pages.invoice', + title : 'Invoice', + type : 'collapsable', + icon : 'heroicons_outline:exclamation-circle', + children: [ + { + id : 'pages.invoice.printable', + title : 'Printable', + type : 'collapsable', + children: [ + { + id : 'pages.invoice.printable.compact', + title: 'Compact', + type : 'basic', + link : '/pages/invoice/printable/compact' + }, + { + id : 'pages.invoice.printable.modern', + title: 'Modern', + type : 'basic', + link : '/pages/invoice/printable/modern' + } + ] + } + ] + }, + { + id : 'pages.maintenance', + title: 'Maintenance', + type : 'basic', + icon : 'heroicons_outline:exclamation', + link : '/pages/maintenance' + }, + { + id : 'pages.pricing', + title : 'Pricing', + type : 'collapsable', + icon : 'heroicons_outline:cash', + children: [ + { + id : 'pages.pricing.modern', + title: 'Modern', + type : 'basic', + link : '/pages/pricing/modern' + }, + { + id : 'pages.pricing.simple', + title: 'Simple', + type : 'basic', + link : '/pages/pricing/simple' + }, + { + id : 'pages.pricing.single', + title: 'Single', + type : 'basic', + link : '/pages/pricing/single' + }, + { + id : 'pages.pricing.table', + title: 'Table', + type : 'basic', + link : '/pages/pricing/table' + } + ] + }, + { + id : 'pages.profile', + title: 'Profile', + type : 'basic', + icon : 'heroicons_outline:user-circle', + link : '/pages/profile' + } + ] + }, + { + id : 'user-interface', + title : 'User Interface', + subtitle: 'Building blocks of the UI & UX', + type : 'group', + icon : 'heroicons_outline:collection', + children: [ + { + id : 'user-interface.angular-material', + title: 'Angular Material', + type : 'basic', + icon : 'heroicons_outline:shield-check', + link : '/ui/angular-material' + }, + { + id : 'user-interface.tailwindcss', + title: 'TailwindCSS', + type : 'basic', + icon : 'heroicons_outline:sparkles', + link : '/ui/tailwindcss' + }, + { + id : 'user-interface.animations', + title: 'Animations', + type : 'basic', + icon : 'heroicons_outline:play', + link : '/ui/animations' + }, + { + id : 'user-interface.cards', + title: 'Cards', + type : 'basic', + icon : 'heroicons_outline:duplicate', + link : '/ui/cards' + }, + { + id : 'user-interface.colors', + title: 'Colors', + type : 'basic', + icon : 'heroicons_outline:color-swatch', + link : '/ui/colors' + }, + { + id : 'user-interface.datatable', + title: 'Datatable', + type : 'basic', + icon : 'heroicons_outline:view-list', + link : '/ui/datatable' + }, + { + id : 'user-interface.forms', + title : 'Forms', + type : 'collapsable', + icon : 'heroicons_outline:pencil-alt', + children: [ + { + id : 'user-interface.forms.fields', + title: 'Fields', + type : 'basic', + link : '/ui/forms/fields' + }, + { + id : 'user-interface.forms.layouts', + title: 'Layouts', + type : 'basic', + link : '/ui/forms/layouts' + }, + { + id : 'user-interface.forms.wizards', + title: 'Wizards', + type : 'basic', + link : '/ui/forms/wizards' + } + ] + }, + { + id : 'user-interface.icons', + title : 'Icons', + type : 'collapsable', + icon : 'heroicons_outline:lightning-bolt', + children: [ + { + id : 'user-interface.icons.heroicons-outline', + title: 'Heroicons Outline', + type : 'basic', + link : '/ui/icons/heroicons-outline' + }, + { + id : 'user-interface.icons.heroicons-solid', + title: 'Heroicons Solid', + type : 'basic', + link : '/ui/icons/heroicons-solid' + }, + { + id : 'user-interface.icons.material-outline', + title: 'Material Outline', + type : 'basic', + link : '/ui/icons/material-outline' + }, + { + id : 'user-interface.icons.material-twotone', + title: 'Material Twotone', + type : 'basic', + link : '/ui/icons/material-twotone' + }, + { + id : 'user-interface.icons.iconsmind', + title: 'Iconsmind', + type : 'basic', + link : '/ui/icons/iconsmind' + }, + { + id : 'user-interface.icons.feather', + title: 'Feather', + type : 'basic', + link : '/ui/icons/feather' + } + ] + }, + { + id : 'user-interface.page-layouts', + title : 'Page layouts', + type : 'collapsable', + icon : 'heroicons_outline:template', + children: [ + { + id : 'user-interface.page-layouts.overview', + title: 'Overview', + type : 'basic', + link : '/ui/page-layouts/overview' + }, + { + id : 'user-interface.page-layouts.empty', + title: 'Empty', + type : 'basic', + link : '/ui/page-layouts/empty' + }, + { + id: 'user-interface.page-layouts.carded', + + title : 'Carded', + type : 'collapsable', + children: [ + { + id : 'user-interface.page-layouts.carded.fullwidth', + title: 'Fullwidth', + type : 'basic', + link : '/ui/page-layouts/carded/fullwidth' + }, + { + id : 'user-interface.page-layouts.carded.left-sidebar-1', + title: 'Left Sidebar #1', + type : 'basic', + link : '/ui/page-layouts/carded/left-sidebar-1' + }, + { + id : 'user-interface.page-layouts.carded.left-sidebar-2', + title: 'Left Sidebar #2', + type : 'basic', + link : '/ui/page-layouts/carded/left-sidebar-2' + }, + { + id : 'user-interface.page-layouts.carded.right-sidebar-1', + title: 'Right Sidebar #1', + type : 'basic', + link : '/ui/page-layouts/carded/right-sidebar-1' + }, + { + id : 'user-interface.page-layouts.carded.right-sidebar-2', + title: 'Right Sidebar #2', + type : 'basic', + link : '/ui/page-layouts/carded/right-sidebar-2' + } + ] + }, + { + id : 'user-interface.page-layouts.simple', + title : 'Simple', + type : 'collapsable', + children: [ + { + id : 'user-interface.page-layouts.simple.fullwidth', + title: 'Fullwidth', + type : 'basic', + link : '/ui/page-layouts/simple/fullwidth' + }, + { + id : 'user-interface.page-layouts.simple.left-sidebar-1', + title: 'Left Sidebar #1', + type : 'basic', + link : '/ui/page-layouts/simple/left-sidebar-1' + }, + { + id : 'user-interface.page-layouts.simple.left-sidebar-2', + title: 'Left Sidebar #2', + type : 'basic', + link : '/ui/page-layouts/simple/left-sidebar-2' + }, + { + id : 'user-interface.page-layouts.simple.left-sidebar-3', + title: 'Left Sidebar #3', + type : 'basic', + link : '/ui/page-layouts/simple/left-sidebar-3' + }, + { + id : 'user-interface.page-layouts.simple.right-sidebar-1', + title: 'Right Sidebar #1', + type : 'basic', + link : '/ui/page-layouts/simple/right-sidebar-1' + }, + { + id : 'user-interface.page-layouts.simple.right-sidebar-2', + title: 'Right Sidebar #2', + type : 'basic', + link : '/ui/page-layouts/simple/right-sidebar-2' + }, + { + id : 'user-interface.page-layouts.simple.right-sidebar-3', + title: 'Right Sidebar #3', + type : 'basic', + link : '/ui/page-layouts/simple/right-sidebar-3' + } + ] + } + ] + }, + { + id : 'user-interface.typography', + title: 'Typography', + type : 'basic', + icon : 'heroicons_outline:pencil', + link : '/ui/typography' + } + ] + }, + { + id : 'divider-1', + type: 'divider' + }, + { + id : 'documentation', + title : 'Documentation', + subtitle: 'Everything you need to know about Fuse', + type : 'group', + icon : 'heroicons_outline:support', + children: [ + { + id : 'documentation.changelog', + title: 'Changelog', + type : 'basic', + icon : 'heroicons_outline:speakerphone', + link : '/docs/changelog', + badge: { + title : '12.0.0', + classes: 'px-2 bg-yellow-300 text-black rounded-full' + } + }, + { + id : 'documentation.guides', + title: 'Guides', + type : 'basic', + icon : 'heroicons_outline:book-open', + link : '/docs/guides' + }, + { + id : 'documentation.core-features', + title: 'Core features', + type : 'basic', + icon : 'heroicons_outline:book-open', + link : '/docs/core-features' + }, + { + id : 'documentation.other-components', + title: 'Other components', + type : 'basic', + icon : 'heroicons_outline:book-open', + link : '/docs/other-components' + } + ] + }, + { + id : 'divider-2', + type: 'divider' + }, + { + id : 'navigation-features', + title : 'Navigation features', + subtitle: 'Collapsable levels & badge styles', + type : 'group', + icon : 'heroicons_outline:menu', + children: [ + { + id : 'navigation-features.level.0', + title : 'Level 0', + icon : 'heroicons_outline:check-circle', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1', + title : 'Level 1', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1.2', + title : 'Level 2', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1.2.3', + title : 'Level 3', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1.2.3.4', + title : 'Level 4', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1.2.3.4.5', + title : 'Level 5', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1.2.3.4.5.6', + title: 'Level 6', + type : 'basic' + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + id : 'navigation-features.level.0', + title : 'Level 0', + subtitle: 'With subtitle', + icon : 'heroicons_outline:check-circle', + type : 'collapsable', + children: [ + { + id : 'navigation-features.level.0.1-1', + title: 'Level 1.1', + type : 'basic' + }, + { + id : 'navigation-features.level.0.1-2', + title: 'Level 1.2', + type : 'basic' + } + ] + }, + { + id : 'navigation-features.active', + title : 'Active item', + subtitle: 'Manually marked as active', + icon : 'heroicons_outline:check-circle', + type : 'basic', + active : true + }, + { + id : 'navigation-features.disabled-collapsable', + title : 'Disabled collapsable', + subtitle: 'Some subtitle', + icon : 'heroicons_outline:check-circle', + type : 'collapsable', + disabled: true, + children: [ + { + id : 'navigation-features.disabled-collapsable.child', + title: 'You shouldn\'t be able to see this child', + type : 'basic' + } + ] + }, + { + id : 'navigation-features.disabled-basic', + title : 'Disabled basic', + subtitle: 'Some subtitle', + icon : 'heroicons_outline:check-circle', + type : 'basic', + disabled: true + }, + { + id : 'navigation-features.badge-style-oval', + title: 'Oval badge', + icon : 'heroicons_outline:tag', + type : 'basic', + badge: { + title : '8', + classes: 'w-5 h-5 bg-teal-400 text-black rounded-full' + } + }, + { + id : 'navigation-features.badge-style-rectangle', + title: 'Rectangle badge', + icon : 'heroicons_outline:tag', + type : 'basic', + badge: { + title : 'Updated!', + classes: 'px-2 bg-teal-400 text-black rounded' + } + }, + { + id : 'navigation-features.badge-style-rounded', + title: 'Rounded badge', + icon : 'heroicons_outline:tag', + type : 'basic', + badge: { + title : 'NEW', + classes: 'px-2.5 bg-teal-400 text-black rounded-full' + } + }, + { + id : 'navigation-features.badge-style-simple', + title: 'Simple badge', + icon : 'heroicons_outline:tag', + type : 'basic', + badge: { + title : '87 Unread', + classes: 'text-teal-500' + } + }, + { + id : 'navigation-features.multi-line', + title: 'A multi line navigation item title example which works just fine', + icon : 'heroicons_outline:check-circle', + type : 'basic' + } + ] + } +]; +export const compactNavigation: FuseNavigationItem[] = [ + { + id : 'dashboards', + title : 'Dashboards', + type : 'aside', + icon : 'heroicons_outline:home', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'apps', + title : 'Apps', + type : 'aside', + icon : 'heroicons_outline:qrcode', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'pages', + title : 'Pages', + type : 'aside', + icon : 'heroicons_outline:document-duplicate', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'user-interface', + title : 'UI', + type : 'aside', + icon : 'heroicons_outline:collection', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'navigation-features', + title : 'Navigation', + type : 'aside', + icon : 'heroicons_outline:menu', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + } +]; +export const futuristicNavigation: FuseNavigationItem[] = [ + { + id : 'apps', + title : 'APPS', + type : 'group', + children: [ + { + id : 'apps.dashboards.analytics', + title: 'Analytics', + type : 'basic', + icon : 'heroicons_outline:chart-pie', + link : '/dashboards/analytics' + }, + { + id : 'apps.dashboards.project', + title: 'Project', + type : 'basic', + icon : 'heroicons_outline:clipboard-check', + link : '/dashboards/project' + }, + { + id : 'apps.calendar', + title: 'Calendar', + type : 'basic', + icon : 'heroicons_outline:calendar', + link : '/apps/calendar' + }, + { + id : 'apps.contacts', + title: 'Contacts', + type : 'basic', + icon : 'heroicons_outline:user-group', + link : '/apps/contacts' + }, + { + id : 'apps.ecommerce', + title : 'ECommerce', + type : 'collapsable', + icon : 'heroicons_outline:shopping-cart', + children: [ + { + id : 'apps.ecommerce.inventory', + title: 'Inventory', + type : 'basic', + link : '/apps/ecommerce/inventory' + } + ] + }, + { + id : 'apps.file-manager', + title: 'File manager', + type : 'basic', + icon : 'heroicons_outline:shopping-cart', + link : '/apps/file-manager' + }, + { + id : 'apps.help-center', + title : 'Help center', + type : 'collapsable', + icon : 'heroicons_outline:support', + link : '/apps/help-center', + children: [ + { + id : 'apps.help-center.home', + title : 'Home', + type : 'basic', + link : '/apps/help-center', + exactMatch: true + }, + { + id : 'apps.help-center.faqs', + title: 'FAQs', + type : 'basic', + link : '/apps/help-center/faqs' + }, + { + id : 'apps.help-center.guides', + title: 'Guides', + type : 'basic', + link : '/apps/help-center/guides' + }, + { + id : 'apps.help-center.support', + title: 'Support', + type : 'basic', + link : '/apps/help-center/support' + } + ] + }, + { + id : 'apps.mailbox', + title: 'Mailbox', + type : 'basic', + icon : 'heroicons_outline:mail', + link : '/apps/mailbox', + badge: { + title : '27', + classes: 'px-2 bg-black bg-opacity-25 text-white rounded-full' + } + }, + { + id : 'apps.tasks', + title: 'Tasks', + type : 'basic', + icon : 'heroicons_outline:check-circle', + link : '/apps/tasks' + } + ] + }, + { + id : 'others', + title: 'OTHERS', + type : 'group' + }, + { + id : 'pages', + title : 'Pages', + type : 'aside', + icon : 'heroicons_outline:document-duplicate', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'user-interface', + title : 'User Interface', + type : 'aside', + icon : 'heroicons_outline:collection', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'navigation-features', + title : 'Navigation Features', + type : 'aside', + icon : 'heroicons_outline:menu', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + } +]; +export const horizontalNavigation: FuseNavigationItem[] = [ + { + id : 'dashboards', + title : 'Dashboards', + type : 'group', + icon : 'heroicons_outline:home', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'apps', + title : 'Apps', + type : 'group', + icon : 'heroicons_outline:qrcode', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'pages', + title : 'Pages', + type : 'group', + icon : 'heroicons_outline:document-duplicate', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'user-interface', + title : 'UI', + type : 'group', + icon : 'heroicons_outline:collection', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + }, + { + id : 'navigation-features', + title : 'Misc', + type : 'group', + icon : 'heroicons_outline:menu', + children: [] // This will be filled from defaultNavigation so we don't have to manage multiple sets of the same navigation + } +]; diff --git a/src/app/mock-api/common/notifications/api.ts b/src/app/mock-api/common/notifications/api.ts new file mode 100644 index 00000000..b4856ba9 --- /dev/null +++ b/src/app/mock-api/common/notifications/api.ts @@ -0,0 +1,164 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { notifications as notificationsData } from 'app/mock-api/common/notifications/data'; + +@Injectable({ + providedIn: 'root' +}) +export class NotificationsMockApi +{ + private _notifications: any = notificationsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Notifications - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/notifications') + .reply(() => [200, cloneDeep(this._notifications)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Notifications - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/notifications') + .reply(({request}) => { + + // Get the notification + const newNotification = cloneDeep(request.body.notification); + + // Generate a new GUID + newNotification.id = FuseMockApiUtils.guid(); + + // Unshift the new notification + this._notifications.unshift(newNotification); + + // Return the response + return [200, newNotification]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Notifications - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/common/notifications') + .reply(({request}) => { + + // Get the id and notification + const id = request.body.id; + const notification = cloneDeep(request.body.notification); + + // Prepare the updated notification + let updatedNotification = null; + + // Find the notification and update it + this._notifications.forEach((item: any, index: number, notifications: any[]) => { + + if ( item.id === id ) + { + // Update the notification + notifications[index] = assign({}, notifications[index], notification); + + // Store the updated notification + updatedNotification = notifications[index]; + } + }); + + // Return the response + return [200, updatedNotification]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Notifications - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/common/notifications') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Prepare the deleted notification + let deletedNotification = null; + + // Find the notification + const index = this._notifications.findIndex((item: any) => item.id === id); + + // Store the deleted notification + deletedNotification = cloneDeep(this._notifications[index]); + + // Delete the notification + this._notifications.splice(index, 1); + + // Return the response + return [200, deletedNotification]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Mark all as read - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/notifications/mark-all-as-read') + .reply(() => { + + // Go through all notifications + this._notifications.forEach((item: any, index: number, notifications: any[]) => { + + // Mark it as read + notifications[index].read = true; + notifications[index].seen = true; + }); + + // Return the response + return [200, true]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Toggle read status - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/notifications/toggle-read-status') + .reply(({request}) => { + + // Get the notification + const notification = cloneDeep(request.body.notification); + + // Prepare the updated notification + let updatedNotification = null; + + // Find the notification and update it + this._notifications.forEach((item: any, index: number, notifications: any[]) => { + + if ( item.id === notification.id ) + { + // Update the notification + notifications[index].read = notification.read; + + // Store the updated notification + updatedNotification = notifications[index]; + } + }); + + // Return the response + return [200, updatedNotification]; + }); + } +} diff --git a/src/app/mock-api/common/notifications/data.ts b/src/app/mock-api/common/notifications/data.ts new file mode 100644 index 00000000..7a9f69f3 --- /dev/null +++ b/src/app/mock-api/common/notifications/data.ts @@ -0,0 +1,91 @@ +import * as moment from 'moment'; +import { Notification } from 'app/layout/common/notifications/notifications.types'; + +/* tslint:disable:max-line-length */ +export const notifications: Notification[] = [ + { + id : '493190c9-5b61-4912-afe5-78c21f1044d7', + icon : 'heroicons_outline:star', + title : 'Daily challenges', + description: 'Your submission has been accepted', + time : moment().subtract(25, 'minutes').toISOString(), // 25 minutes ago + read : false + }, + { + id : '6e3e97e5-effc-4fb7-b730-52a151f0b641', + image : 'assets/images/avatars/male-04.jpg', + description: 'Leo Gill added you to Top Secret Project group and assigned you as a Project Manager', + time : moment().subtract(50, 'minutes').toISOString(), // 50 minutes ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : 'b91ccb58-b06c-413b-b389-87010e03a120', + icon : 'heroicons_outline:mail', + title : 'Mailbox', + description: 'You have 15 unread mails across 3 mailboxes', + time : moment().subtract(3, 'hours').toISOString(), // 3 hours ago + read : false, + link : '/dashboards/project', + useRouter : true + }, + { + id : '541416c9-84a7-408a-8d74-27a43c38d797', + icon : 'heroicons_outline:refresh', + title : 'Cron jobs', + description: 'Your Docker container is ready to publish', + time : moment().subtract(5, 'hours').toISOString(), // 5 hours ago + read : false, + link : '/dashboards/project', + useRouter : true + }, + { + id : 'ef7b95a7-8e8b-4616-9619-130d9533add9', + image : 'assets/images/avatars/male-06.jpg', + description: 'Roger Murray accepted your friend request', + time : moment().subtract(7, 'hours').toISOString(), // 7 hours ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : 'eb8aa470-635e-461d-88e1-23d9ea2a5665', + image : 'assets/images/avatars/female-04.jpg', + description: 'Sophie Stone sent you a direct message', + time : moment().subtract(9, 'hours').toISOString(), // 9 hours ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : 'b85c2338-cc98-4140-bbf8-c226ce4e395e', + icon : 'heroicons_outline:mail', + title : 'Mailbox', + description: 'You have 3 new mails', + time : moment().subtract(1, 'day').toISOString(), // 1 day ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : '8f8e1bf9-4661-4939-9e43-390957b60f42', + icon : 'heroicons_outline:star', + title : 'Daily challenges', + description: 'Your submission has been accepted and you are ready to sign-up for the final assigment which will be ready in 2 days', + time : moment().subtract(3, 'days').toISOString(), // 3 days ago + read : true, + link : '/dashboards/project', + useRouter : true + }, + { + id : '30af917b-7a6a-45d1-822f-9e7ad7f8bf69', + icon : 'heroicons_outline:refresh', + title : 'Cron jobs', + description: 'Your Vagrant container is ready to download', + time : moment().subtract(4, 'day').toISOString(), // 4 days ago + read : true, + link : '/dashboards/project', + useRouter : true + } +]; diff --git a/src/app/mock-api/common/search/api.ts b/src/app/mock-api/common/search/api.ts new file mode 100644 index 00000000..a7dbf020 --- /dev/null +++ b/src/app/mock-api/common/search/api.ts @@ -0,0 +1,115 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseNavigationItem, FuseNavigationService } from '@fuse/components/navigation'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { defaultNavigation } from 'app/mock-api/common/navigation/data'; +import { contacts } from 'app/mock-api/apps/contacts/data'; + +@Injectable({ + providedIn: 'root' +}) +export class SearchMockApi +{ + private readonly _defaultNavigation: FuseNavigationItem[] = defaultNavigation; + private readonly _contacts: any[] = contacts; + + /** + * Constructor + */ + constructor( + private _fuseMockApiService: FuseMockApiService, + private _fuseNavigationService: FuseNavigationService + ) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // Get the flat navigation and store it + const flatNavigation = this._fuseNavigationService.getFlatNavigation(this._defaultNavigation); + + // ----------------------------------------------------------------------------------------------------- + // @ Search results - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/search') + .reply(({request}) => { + + // Get the search query + const query = cloneDeep(request.body.query.toLowerCase()); + + // If the search query is an empty string, + // return an empty array + if ( query === '' ) + { + return [200, {results: []}]; + } + + // Filter the navigation + const navigationResults = cloneDeep(flatNavigation).filter((item) => { + return (item.title?.toLowerCase().includes(query) || (item.subtitle && item.subtitle.includes(query))); + }); + + // Filter the contacts + const contactsResults = cloneDeep(this._contacts).filter((user) => { + return user.name.toLowerCase().includes(query); + }); + + // Create the results array + const results = []; + + // If there are navigation results... + if ( navigationResults.length > 0 ) + { + // Normalize the results while marking the found chars + navigationResults.forEach((result: any) => { + + // Normalize + result['hint'] = result.link; + result['resultType'] = 'page'; + + // Mark the found chars + const re = new RegExp('(' + query.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')', 'ig'); + result.title = result.title.replace(re, '$1'); + }); + + // Add the results + results.push(...navigationResults); + } + + // If there are contacts results... + if ( contactsResults.length > 0 ) + { + // Normalize the results while marking the found chars + contactsResults.forEach((result) => { + + // Normalize + result.title = result.name; + result.resultType = 'contact'; + + // Make the found chars bold + const re = new RegExp('(' + query.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')', 'ig'); + result.title = result.title.replace(re, '$1'); + + // Add a link + result.link = '/apps/contacts/' + result.id; + }); + + // Add the results to the results object + results.push(...contactsResults); + } + + // Return the response + return [200, {results}]; + }); + } +} diff --git a/src/app/mock-api/common/shortcuts/api.ts b/src/app/mock-api/common/shortcuts/api.ts new file mode 100644 index 00000000..7d1ad06e --- /dev/null +++ b/src/app/mock-api/common/shortcuts/api.ts @@ -0,0 +1,115 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api'; +import { shortcuts as shortcutsData } from 'app/mock-api/common/shortcuts/data'; + +@Injectable({ + providedIn: 'root' +}) +export class ShortcutsMockApi +{ + private _shortcuts: any = shortcutsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Shortcuts - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/shortcuts') + .reply(() => [200, cloneDeep(this._shortcuts)]); + + // ----------------------------------------------------------------------------------------------------- + // @ Shortcuts - POST + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPost('api/common/shortcuts') + .reply(({request}) => { + + // Get the shortcut + const newShortcut = cloneDeep(request.body.shortcut); + + // Generate a new GUID + newShortcut.id = FuseMockApiUtils.guid(); + + // Unshift the new shortcut + this._shortcuts.unshift(newShortcut); + + // Return the response + return [200, newShortcut]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Shortcuts - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/common/shortcuts') + .reply(({request}) => { + + // Get the id and shortcut + const id = request.body.id; + const shortcut = cloneDeep(request.body.shortcut); + + // Prepare the updated shortcut + let updatedShortcut = null; + + // Find the shortcut and update it + this._shortcuts.forEach((item: any, index: number, shortcuts: any[]) => { + + if ( item.id === id ) + { + // Update the shortcut + shortcuts[index] = assign({}, shortcuts[index], shortcut); + + // Store the updated shortcut + updatedShortcut = shortcuts[index]; + } + }); + + // Return the response + return [200, updatedShortcut]; + }); + + // ----------------------------------------------------------------------------------------------------- + // @ Shortcuts - DELETE + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onDelete('api/common/shortcuts') + .reply(({request}) => { + + // Get the id + const id = request.params.get('id'); + + // Prepare the deleted shortcut + let deletedShortcut = null; + + // Find the shortcut + const index = this._shortcuts.findIndex((item: any) => item.id === id); + + // Store the deleted shortcut + deletedShortcut = cloneDeep(this._shortcuts[index]); + + // Delete the shortcut + this._shortcuts.splice(index, 1); + + // Return the response + return [200, deletedShortcut]; + }); + } +} diff --git a/src/app/mock-api/common/shortcuts/data.ts b/src/app/mock-api/common/shortcuts/data.ts new file mode 100644 index 00000000..1621475a --- /dev/null +++ b/src/app/mock-api/common/shortcuts/data.ts @@ -0,0 +1,77 @@ +import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types'; + +/* tslint:disable:max-line-length */ +export const shortcuts: Shortcut[] = [ + { + id : 'a1ae91d3-e2cb-459b-9be9-a184694f548b', + label : 'Changelog', + description: 'Latest version: v1.2', + icon : 'heroicons_outline:clipboard-list', + link : '/dashboards/project', + useRouter : true + }, + { + id : '989ce876-c177-4d71-a749-1953c477f825', + label : 'Documentation', + description: 'Getting started', + icon : 'heroicons_outline:book-open', + link : '/dashboards/project', + useRouter : true + }, + { + id : '2496f42e-2f25-4e34-83d5-3ff9568fd984', + label : 'Help center', + description: 'FAQs and guides', + icon : 'heroicons_outline:support', + link : '/pages/help-center', + useRouter : true + }, + { + id : '3c48e75e-2ae7-4b73-938a-12dc655be28b', + label : 'Dashboard', + description: 'User analytics', + icon : 'heroicons_outline:chart-pie', + link : '/dashboards/project', + useRouter : true + }, + { + id : '34fb28db-4ec8-4570-8584-2414d6de796b', + label : 'Calendar', + description: 'Latest appointments', + icon : 'heroicons_outline:calendar', + link : '/apps/calendar', + useRouter : true + }, + { + id : '2daac375-a2f7-4393-b4d7-ce6061628b66', + label : 'Mailbox', + description: '5 new e-mails', + icon : 'heroicons_outline:mail', + link : 'apps/mailbox', + useRouter : true + }, + { + id : '56a0a561-17e7-40b3-bd75-0b6cef230b7e', + label : 'Tasks', + description: '12 unfinished tasks', + icon : 'heroicons_outline:check-circle', + link : '/apps/tasks', + useRouter : true + }, + { + id : 'f5daf93e-b6f3-4199-8a0c-b951e92a6cb8', + label : 'Contacts', + description: 'List all contacts', + icon : 'heroicons_outline:user-group', + link : '/apps/contacts', + useRouter : true + }, + { + id : '0a240ab8-e19d-4503-bf68-20013030d526', + label : 'Reload', + description: 'Restart the app', + icon : 'heroicons_outline:refresh', + link : '/dashboards/project', + useRouter : false + } +]; diff --git a/src/app/mock-api/common/user/api.ts b/src/app/mock-api/common/user/api.ts new file mode 100644 index 00000000..f73d3671 --- /dev/null +++ b/src/app/mock-api/common/user/api.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { assign, cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { user as userData } from 'app/mock-api/common/user/data'; + +@Injectable({ + providedIn: 'root' +}) +export class UserMockApi +{ + private _user: any = userData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ User - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/common/user') + .reply(() => [200, cloneDeep(this._user)]); + + // ----------------------------------------------------------------------------------------------------- + // @ User - PATCH + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onPatch('api/common/user') + .reply(({request}) => { + + // Get the user mock-api + const user = cloneDeep(request.body.user); + + // Update the user mock-api + this._user = assign({}, this._user, user); + + // Return the response + return [200, cloneDeep(this._user)]; + }); + } +} diff --git a/src/app/mock-api/common/user/data.ts b/src/app/mock-api/common/user/data.ts new file mode 100644 index 00000000..a9fc9cd8 --- /dev/null +++ b/src/app/mock-api/common/user/data.ts @@ -0,0 +1,8 @@ +/* tslint:disable:max-line-length */ +export const user: any = { + id : 'cfaad35d-07a3-4447-a6c3-d8c3d54fd5df', + name : 'Brian Hughes', + email : 'hughes.brian@company.com', + avatar: 'assets/images/avatars/brian-hughes.jpg', + status: 'online' +}; diff --git a/src/app/mock-api/dashboards/analytics/api.ts b/src/app/mock-api/dashboards/analytics/api.ts new file mode 100644 index 00000000..891be01e --- /dev/null +++ b/src/app/mock-api/dashboards/analytics/api.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { analytics as analyticsData } from 'app/mock-api/dashboards/analytics/data'; + +@Injectable({ + providedIn: 'root' +}) +export class AnalyticsMockApi +{ + private _analytics: any = analyticsData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Sales - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/dashboards/analytics') + .reply(() => [200, cloneDeep(this._analytics)]); + } +} diff --git a/src/app/mock-api/dashboards/analytics/data.ts b/src/app/mock-api/dashboards/analytics/data.ts new file mode 100644 index 00000000..1e372c8d --- /dev/null +++ b/src/app/mock-api/dashboards/analytics/data.ts @@ -0,0 +1,1599 @@ +import * as moment from 'moment'; + +/* tslint:disable:max-line-length */ +export const analytics = { + visitors : { + series: { + 'this-year': [ + { + name: 'Visitors', + data: [ + { + x: moment().subtract(12, 'months').day(1).toDate(), + y: 4884 + }, + { + x: moment().subtract(12, 'months').day(4).toDate(), + y: 5351 + }, + { + x: moment().subtract(12, 'months').day(7).toDate(), + y: 5293 + }, + { + x: moment().subtract(12, 'months').day(10).toDate(), + y: 4908 + }, + { + x: moment().subtract(12, 'months').day(13).toDate(), + y: 5027 + }, + { + x: moment().subtract(12, 'months').day(16).toDate(), + y: 4837 + }, + { + x: moment().subtract(12, 'months').day(19).toDate(), + y: 4484 + }, + { + x: moment().subtract(12, 'months').day(22).toDate(), + y: 4071 + }, + { + x: moment().subtract(12, 'months').day(25).toDate(), + y: 4124 + }, + { + x: moment().subtract(12, 'months').day(28).toDate(), + y: 4563 + }, + { + x: moment().subtract(11, 'months').day(1).toDate(), + y: 3820 + }, + { + x: moment().subtract(11, 'months').day(4).toDate(), + y: 3968 + }, + { + x: moment().subtract(11, 'months').day(7).toDate(), + y: 4102 + }, + { + x: moment().subtract(11, 'months').day(10).toDate(), + y: 3941 + }, + { + x: moment().subtract(11, 'months').day(13).toDate(), + y: 3566 + }, + { + x: moment().subtract(11, 'months').day(16).toDate(), + y: 3853 + }, + { + x: moment().subtract(11, 'months').day(19).toDate(), + y: 3853 + }, + { + x: moment().subtract(11, 'months').day(22).toDate(), + y: 4069 + }, + { + x: moment().subtract(11, 'months').day(25).toDate(), + y: 3879 + }, + { + x: moment().subtract(11, 'months').day(28).toDate(), + y: 4298 + }, + { + x: moment().subtract(10, 'months').day(1).toDate(), + y: 4355 + }, + { + x: moment().subtract(10, 'months').day(4).toDate(), + y: 4065 + }, + { + x: moment().subtract(10, 'months').day(7).toDate(), + y: 3650 + }, + { + x: moment().subtract(10, 'months').day(10).toDate(), + y: 3379 + }, + { + x: moment().subtract(10, 'months').day(13).toDate(), + y: 3191 + }, + { + x: moment().subtract(10, 'months').day(16).toDate(), + y: 2968 + }, + { + x: moment().subtract(10, 'months').day(19).toDate(), + y: 2957 + }, + { + x: moment().subtract(10, 'months').day(22).toDate(), + y: 3313 + }, + { + x: moment().subtract(10, 'months').day(25).toDate(), + y: 3708 + }, + { + x: moment().subtract(10, 'months').day(28).toDate(), + y: 3586 + }, + { + x: moment().subtract(9, 'months').day(1).toDate(), + y: 3965 + }, + { + x: moment().subtract(9, 'months').day(4).toDate(), + y: 3901 + }, + { + x: moment().subtract(9, 'months').day(7).toDate(), + y: 3410 + }, + { + x: moment().subtract(9, 'months').day(10).toDate(), + y: 3748 + }, + { + x: moment().subtract(9, 'months').day(13).toDate(), + y: 3929 + }, + { + x: moment().subtract(9, 'months').day(16).toDate(), + y: 3846 + }, + { + x: moment().subtract(9, 'months').day(19).toDate(), + y: 3771 + }, + { + x: moment().subtract(9, 'months').day(22).toDate(), + y: 4015 + }, + { + x: moment().subtract(9, 'months').day(25).toDate(), + y: 3589 + }, + { + x: moment().subtract(9, 'months').day(28).toDate(), + y: 3150 + }, + { + x: moment().subtract(8, 'months').day(1).toDate(), + y: 3050 + }, + { + x: moment().subtract(8, 'months').day(4).toDate(), + y: 2574 + }, + { + x: moment().subtract(8, 'months').day(7).toDate(), + y: 2823 + }, + { + x: moment().subtract(8, 'months').day(10).toDate(), + y: 2848 + }, + { + x: moment().subtract(8, 'months').day(13).toDate(), + y: 3000 + }, + { + x: moment().subtract(8, 'months').day(16).toDate(), + y: 3216 + }, + { + x: moment().subtract(8, 'months').day(19).toDate(), + y: 3299 + }, + { + x: moment().subtract(8, 'months').day(22).toDate(), + y: 3768 + }, + { + x: moment().subtract(8, 'months').day(25).toDate(), + y: 3524 + }, + { + x: moment().subtract(8, 'months').day(28).toDate(), + y: 3918 + }, + { + x: moment().subtract(7, 'months').day(1).toDate(), + y: 4145 + }, + { + x: moment().subtract(7, 'months').day(4).toDate(), + y: 4378 + }, + { + x: moment().subtract(7, 'months').day(7).toDate(), + y: 3941 + }, + { + x: moment().subtract(7, 'months').day(10).toDate(), + y: 3932 + }, + { + x: moment().subtract(7, 'months').day(13).toDate(), + y: 4380 + }, + { + x: moment().subtract(7, 'months').day(16).toDate(), + y: 4243 + }, + { + x: moment().subtract(7, 'months').day(19).toDate(), + y: 4367 + }, + { + x: moment().subtract(7, 'months').day(22).toDate(), + y: 3879 + }, + { + x: moment().subtract(7, 'months').day(25).toDate(), + y: 4357 + }, + { + x: moment().subtract(7, 'months').day(28).toDate(), + y: 4181 + }, + { + x: moment().subtract(6, 'months').day(1).toDate(), + y: 4619 + }, + { + x: moment().subtract(6, 'months').day(4).toDate(), + y: 4769 + }, + { + x: moment().subtract(6, 'months').day(7).toDate(), + y: 4901 + }, + { + x: moment().subtract(6, 'months').day(10).toDate(), + y: 4640 + }, + { + x: moment().subtract(6, 'months').day(13).toDate(), + y: 5128 + }, + { + x: moment().subtract(6, 'months').day(16).toDate(), + y: 5015 + }, + { + x: moment().subtract(6, 'months').day(19).toDate(), + y: 5360 + }, + { + x: moment().subtract(6, 'months').day(22).toDate(), + y: 5608 + }, + { + x: moment().subtract(6, 'months').day(25).toDate(), + y: 5272 + }, + { + x: moment().subtract(6, 'months').day(28).toDate(), + y: 5660 + }, + { + x: moment().subtract(5, 'months').day(1).toDate(), + y: 5836 + }, + { + x: moment().subtract(5, 'months').day(4).toDate(), + y: 5659 + }, + { + x: moment().subtract(5, 'months').day(7).toDate(), + y: 5575 + }, + { + x: moment().subtract(5, 'months').day(10).toDate(), + y: 5474 + }, + { + x: moment().subtract(5, 'months').day(13).toDate(), + y: 5427 + }, + { + x: moment().subtract(5, 'months').day(16).toDate(), + y: 5865 + }, + { + x: moment().subtract(5, 'months').day(19).toDate(), + y: 5700 + }, + { + x: moment().subtract(5, 'months').day(22).toDate(), + y: 6052 + }, + { + x: moment().subtract(5, 'months').day(25).toDate(), + y: 5760 + }, + { + x: moment().subtract(5, 'months').day(28).toDate(), + y: 5648 + }, + { + x: moment().subtract(4, 'months').day(1).toDate(), + y: 5435 + }, + { + x: moment().subtract(4, 'months').day(4).toDate(), + y: 5239 + }, + { + x: moment().subtract(4, 'months').day(7).toDate(), + y: 5452 + }, + { + x: moment().subtract(4, 'months').day(10).toDate(), + y: 5416 + }, + { + x: moment().subtract(4, 'months').day(13).toDate(), + y: 5195 + }, + { + x: moment().subtract(4, 'months').day(16).toDate(), + y: 5119 + }, + { + x: moment().subtract(4, 'months').day(19).toDate(), + y: 4635 + }, + { + x: moment().subtract(4, 'months').day(22).toDate(), + y: 4833 + }, + { + x: moment().subtract(4, 'months').day(25).toDate(), + y: 4584 + }, + { + x: moment().subtract(4, 'months').day(28).toDate(), + y: 4822 + }, + { + x: moment().subtract(3, 'months').day(1).toDate(), + y: 4582 + }, + { + x: moment().subtract(3, 'months').day(4).toDate(), + y: 4348 + }, + { + x: moment().subtract(3, 'months').day(7).toDate(), + y: 4132 + }, + { + x: moment().subtract(3, 'months').day(10).toDate(), + y: 4099 + }, + { + x: moment().subtract(3, 'months').day(13).toDate(), + y: 3849 + }, + { + x: moment().subtract(3, 'months').day(16).toDate(), + y: 4010 + }, + { + x: moment().subtract(3, 'months').day(19).toDate(), + y: 4486 + }, + { + x: moment().subtract(3, 'months').day(22).toDate(), + y: 4403 + }, + { + x: moment().subtract(3, 'months').day(25).toDate(), + y: 4141 + }, + { + x: moment().subtract(3, 'months').day(28).toDate(), + y: 3780 + }, + { + x: moment().subtract(2, 'months').day(1).toDate(), + y: 3524 + }, + { + x: moment().subtract(2, 'months').day(4).toDate(), + y: 3212 + }, + { + x: moment().subtract(2, 'months').day(7).toDate(), + y: 3568 + }, + { + x: moment().subtract(2, 'months').day(10).toDate(), + y: 3800 + }, + { + x: moment().subtract(2, 'months').day(13).toDate(), + y: 3796 + }, + { + x: moment().subtract(2, 'months').day(16).toDate(), + y: 3870 + }, + { + x: moment().subtract(2, 'months').day(19).toDate(), + y: 3745 + }, + { + x: moment().subtract(2, 'months').day(22).toDate(), + y: 3751 + }, + { + x: moment().subtract(2, 'months').day(25).toDate(), + y: 3310 + }, + { + x: moment().subtract(2, 'months').day(28).toDate(), + y: 3509 + }, + { + x: moment().subtract(1, 'months').day(1).toDate(), + y: 3187 + }, + { + x: moment().subtract(1, 'months').day(4).toDate(), + y: 2918 + }, + { + x: moment().subtract(1, 'months').day(7).toDate(), + y: 3191 + }, + { + x: moment().subtract(1, 'months').day(10).toDate(), + y: 3437 + }, + { + x: moment().subtract(1, 'months').day(13).toDate(), + y: 3291 + }, + { + x: moment().subtract(1, 'months').day(16).toDate(), + y: 3317 + }, + { + x: moment().subtract(1, 'months').day(19).toDate(), + y: 3716 + }, + { + x: moment().subtract(1, 'months').day(22).toDate(), + y: 3260 + }, + { + x: moment().subtract(1, 'months').day(25).toDate(), + y: 3694 + }, + { + x: moment().subtract(1, 'months').day(28).toDate(), + y: 3598 + } + ] + } + ], + 'last-year': [ + { + name: 'Visitors', + data: [ + { + x: moment().subtract(12, 'months').day(1).toDate(), + y: 2021 + }, + { + x: moment().subtract(12, 'months').day(4).toDate(), + y: 1749 + }, + { + x: moment().subtract(12, 'months').day(7).toDate(), + y: 1654 + }, + { + x: moment().subtract(12, 'months').day(10).toDate(), + y: 1900 + }, + { + x: moment().subtract(12, 'months').day(13).toDate(), + y: 1647 + }, + { + x: moment().subtract(12, 'months').day(16).toDate(), + y: 1315 + }, + { + x: moment().subtract(12, 'months').day(19).toDate(), + y: 1807 + }, + { + x: moment().subtract(12, 'months').day(22).toDate(), + y: 1793 + }, + { + x: moment().subtract(12, 'months').day(25).toDate(), + y: 1892 + }, + { + x: moment().subtract(12, 'months').day(28).toDate(), + y: 1846 + }, + { + x: moment().subtract(11, 'months').day(1).toDate(), + y: 1804 + }, + { + x: moment().subtract(11, 'months').day(4).toDate(), + y: 1778 + }, + { + x: moment().subtract(11, 'months').day(7).toDate(), + y: 2015 + }, + { + x: moment().subtract(11, 'months').day(10).toDate(), + y: 1892 + }, + { + x: moment().subtract(11, 'months').day(13).toDate(), + y: 1708 + }, + { + x: moment().subtract(11, 'months').day(16).toDate(), + y: 1711 + }, + { + x: moment().subtract(11, 'months').day(19).toDate(), + y: 1570 + }, + { + x: moment().subtract(11, 'months').day(22).toDate(), + y: 1507 + }, + { + x: moment().subtract(11, 'months').day(25).toDate(), + y: 1451 + }, + { + x: moment().subtract(11, 'months').day(28).toDate(), + y: 1522 + }, + { + x: moment().subtract(10, 'months').day(1).toDate(), + y: 1977 + }, + { + x: moment().subtract(10, 'months').day(4).toDate(), + y: 2367 + }, + { + x: moment().subtract(10, 'months').day(7).toDate(), + y: 2798 + }, + { + x: moment().subtract(10, 'months').day(10).toDate(), + y: 3080 + }, + { + x: moment().subtract(10, 'months').day(13).toDate(), + y: 2856 + }, + { + x: moment().subtract(10, 'months').day(16).toDate(), + y: 2745 + }, + { + x: moment().subtract(10, 'months').day(19).toDate(), + y: 2750 + }, + { + x: moment().subtract(10, 'months').day(22).toDate(), + y: 2728 + }, + { + x: moment().subtract(10, 'months').day(25).toDate(), + y: 2436 + }, + { + x: moment().subtract(10, 'months').day(28).toDate(), + y: 2289 + }, + { + x: moment().subtract(9, 'months').day(1).toDate(), + y: 2804 + }, + { + x: moment().subtract(9, 'months').day(4).toDate(), + y: 2777 + }, + { + x: moment().subtract(9, 'months').day(7).toDate(), + y: 3024 + }, + { + x: moment().subtract(9, 'months').day(10).toDate(), + y: 2657 + }, + { + x: moment().subtract(9, 'months').day(13).toDate(), + y: 2218 + }, + { + x: moment().subtract(9, 'months').day(16).toDate(), + y: 1964 + }, + { + x: moment().subtract(9, 'months').day(19).toDate(), + y: 1674 + }, + { + x: moment().subtract(9, 'months').day(22).toDate(), + y: 1721 + }, + { + x: moment().subtract(9, 'months').day(25).toDate(), + y: 2005 + }, + { + x: moment().subtract(9, 'months').day(28).toDate(), + y: 1613 + }, + { + x: moment().subtract(8, 'months').day(1).toDate(), + y: 1071 + }, + { + x: moment().subtract(8, 'months').day(4).toDate(), + y: 1079 + }, + { + x: moment().subtract(8, 'months').day(7).toDate(), + y: 1133 + }, + { + x: moment().subtract(8, 'months').day(10).toDate(), + y: 1536 + }, + { + x: moment().subtract(8, 'months').day(13).toDate(), + y: 2016 + }, + { + x: moment().subtract(8, 'months').day(16).toDate(), + y: 2256 + }, + { + x: moment().subtract(8, 'months').day(19).toDate(), + y: 1934 + }, + { + x: moment().subtract(8, 'months').day(22).toDate(), + y: 1832 + }, + { + x: moment().subtract(8, 'months').day(25).toDate(), + y: 2075 + }, + { + x: moment().subtract(8, 'months').day(28).toDate(), + y: 1709 + }, + { + x: moment().subtract(7, 'months').day(1).toDate(), + y: 1831 + }, + { + x: moment().subtract(7, 'months').day(4).toDate(), + y: 1434 + }, + { + x: moment().subtract(7, 'months').day(7).toDate(), + y: 1293 + }, + { + x: moment().subtract(7, 'months').day(10).toDate(), + y: 1064 + }, + { + x: moment().subtract(7, 'months').day(13).toDate(), + y: 1080 + }, + { + x: moment().subtract(7, 'months').day(16).toDate(), + y: 1032 + }, + { + x: moment().subtract(7, 'months').day(19).toDate(), + y: 1280 + }, + { + x: moment().subtract(7, 'months').day(22).toDate(), + y: 1344 + }, + { + x: moment().subtract(7, 'months').day(25).toDate(), + y: 1835 + }, + { + x: moment().subtract(7, 'months').day(28).toDate(), + y: 2287 + }, + { + x: moment().subtract(6, 'months').day(1).toDate(), + y: 2692 + }, + { + x: moment().subtract(6, 'months').day(4).toDate(), + y: 2250 + }, + { + x: moment().subtract(6, 'months').day(7).toDate(), + y: 1814 + }, + { + x: moment().subtract(6, 'months').day(10).toDate(), + y: 1906 + }, + { + x: moment().subtract(6, 'months').day(13).toDate(), + y: 1973 + }, + { + x: moment().subtract(6, 'months').day(16).toDate(), + y: 1882 + }, + { + x: moment().subtract(6, 'months').day(19).toDate(), + y: 2333 + }, + { + x: moment().subtract(6, 'months').day(22).toDate(), + y: 2048 + }, + { + x: moment().subtract(6, 'months').day(25).toDate(), + y: 2547 + }, + { + x: moment().subtract(6, 'months').day(28).toDate(), + y: 2884 + }, + { + x: moment().subtract(5, 'months').day(1).toDate(), + y: 2771 + }, + { + x: moment().subtract(5, 'months').day(4).toDate(), + y: 2522 + }, + { + x: moment().subtract(5, 'months').day(7).toDate(), + y: 2543 + }, + { + x: moment().subtract(5, 'months').day(10).toDate(), + y: 2413 + }, + { + x: moment().subtract(5, 'months').day(13).toDate(), + y: 2002 + }, + { + x: moment().subtract(5, 'months').day(16).toDate(), + y: 1838 + }, + { + x: moment().subtract(5, 'months').day(19).toDate(), + y: 1830 + }, + { + x: moment().subtract(5, 'months').day(22).toDate(), + y: 1872 + }, + { + x: moment().subtract(5, 'months').day(25).toDate(), + y: 2246 + }, + { + x: moment().subtract(5, 'months').day(28).toDate(), + y: 2171 + }, + { + x: moment().subtract(4, 'months').day(1).toDate(), + y: 2988 + }, + { + x: moment().subtract(4, 'months').day(4).toDate(), + y: 2694 + }, + { + x: moment().subtract(4, 'months').day(7).toDate(), + y: 2806 + }, + { + x: moment().subtract(4, 'months').day(10).toDate(), + y: 3040 + }, + { + x: moment().subtract(4, 'months').day(13).toDate(), + y: 2898 + }, + { + x: moment().subtract(4, 'months').day(16).toDate(), + y: 3013 + }, + { + x: moment().subtract(4, 'months').day(19).toDate(), + y: 2760 + }, + { + x: moment().subtract(4, 'months').day(22).toDate(), + y: 3021 + }, + { + x: moment().subtract(4, 'months').day(25).toDate(), + y: 2688 + }, + { + x: moment().subtract(4, 'months').day(28).toDate(), + y: 2572 + }, + { + x: moment().subtract(3, 'months').day(1).toDate(), + y: 2789 + }, + { + x: moment().subtract(3, 'months').day(4).toDate(), + y: 3069 + }, + { + x: moment().subtract(3, 'months').day(7).toDate(), + y: 3142 + }, + { + x: moment().subtract(3, 'months').day(10).toDate(), + y: 3614 + }, + { + x: moment().subtract(3, 'months').day(13).toDate(), + y: 3202 + }, + { + x: moment().subtract(3, 'months').day(16).toDate(), + y: 2730 + }, + { + x: moment().subtract(3, 'months').day(19).toDate(), + y: 2951 + }, + { + x: moment().subtract(3, 'months').day(22).toDate(), + y: 3267 + }, + { + x: moment().subtract(3, 'months').day(25).toDate(), + y: 2882 + }, + { + x: moment().subtract(3, 'months').day(28).toDate(), + y: 2885 + }, + { + x: moment().subtract(2, 'months').day(1).toDate(), + y: 2915 + }, + { + x: moment().subtract(2, 'months').day(4).toDate(), + y: 2790 + }, + { + x: moment().subtract(2, 'months').day(7).toDate(), + y: 3071 + }, + { + x: moment().subtract(2, 'months').day(10).toDate(), + y: 2802 + }, + { + x: moment().subtract(2, 'months').day(13).toDate(), + y: 2382 + }, + { + x: moment().subtract(2, 'months').day(16).toDate(), + y: 1883 + }, + { + x: moment().subtract(2, 'months').day(19).toDate(), + y: 1448 + }, + { + x: moment().subtract(2, 'months').day(22).toDate(), + y: 1176 + }, + { + x: moment().subtract(2, 'months').day(25).toDate(), + y: 1275 + }, + { + x: moment().subtract(2, 'months').day(28).toDate(), + y: 1136 + }, + { + x: moment().subtract(1, 'months').day(1).toDate(), + y: 1160 + }, + { + x: moment().subtract(1, 'months').day(4).toDate(), + y: 1524 + }, + { + x: moment().subtract(1, 'months').day(7).toDate(), + y: 1305 + }, + { + x: moment().subtract(1, 'months').day(10).toDate(), + y: 1725 + }, + { + x: moment().subtract(1, 'months').day(13).toDate(), + y: 1850 + }, + { + x: moment().subtract(1, 'months').day(16).toDate(), + y: 2304 + }, + { + x: moment().subtract(1, 'months').day(19).toDate(), + y: 2187 + }, + { + x: moment().subtract(1, 'months').day(22).toDate(), + y: 2597 + }, + { + x: moment().subtract(1, 'months').day(25).toDate(), + y: 2246 + }, + { + x: moment().subtract(1, 'months').day(28).toDate(), + y: 1767 + } + ] + } + ] + } + }, + conversions : { + amount: 4123, + labels: [ + moment().subtract(47, 'days').format('DD MMM') + ' - ' + moment().subtract(40, 'days').format('DD MMM'), + moment().subtract(39, 'days').format('DD MMM') + ' - ' + moment().subtract(32, 'days').format('DD MMM'), + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Conversions', + data: [4412, 4345, 4541, 4677, 4322, 4123] + } + ] + }, + impressions : { + amount: 46085, + labels: [ + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Impressions', + data: [11577, 11441, 11544, 11523] + } + ] + }, + visits : { + amount: 62083, + labels: [ + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Visits', + data: [15521, 15519, 15522, 15521] + } + ] + }, + visitorsVsPageViews: { + overallScore : 472, + averageRatio : 45, + predictedRatio: 55, + series : [ + { + name: 'Page Views', + data: [ + { + x: moment().subtract(65, 'days').toDate(), + y: 4769 + }, + { + x: moment().subtract(64, 'days').toDate(), + y: 4901 + }, + { + x: moment().subtract(63, 'days').toDate(), + y: 4640 + }, + { + x: moment().subtract(62, 'days').toDate(), + y: 5128 + }, + { + x: moment().subtract(61, 'days').toDate(), + y: 5015 + }, + { + x: moment().subtract(60, 'days').toDate(), + y: 5360 + }, + { + x: moment().subtract(59, 'days').toDate(), + y: 5608 + }, + { + x: moment().subtract(58, 'days').toDate(), + y: 5272 + }, + { + x: moment().subtract(57, 'days').toDate(), + y: 5660 + }, + { + x: moment().subtract(56, 'days').toDate(), + y: 6026 + }, + { + x: moment().subtract(55, 'days').toDate(), + y: 5836 + }, + { + x: moment().subtract(54, 'days').toDate(), + y: 5659 + }, + { + x: moment().subtract(53, 'days').toDate(), + y: 5575 + }, + { + x: moment().subtract(52, 'days').toDate(), + y: 5474 + }, + { + x: moment().subtract(51, 'days').toDate(), + y: 5427 + }, + { + x: moment().subtract(50, 'days').toDate(), + y: 5865 + }, + { + x: moment().subtract(49, 'days').toDate(), + y: 5700 + }, + { + x: moment().subtract(48, 'days').toDate(), + y: 6052 + }, + { + x: moment().subtract(47, 'days').toDate(), + y: 5760 + }, + { + x: moment().subtract(46, 'days').toDate(), + y: 5648 + }, + { + x: moment().subtract(45, 'days').toDate(), + y: 5510 + }, + { + x: moment().subtract(44, 'days').toDate(), + y: 5435 + }, + { + x: moment().subtract(43, 'days').toDate(), + y: 5239 + }, + { + x: moment().subtract(42, 'days').toDate(), + y: 5452 + }, + { + x: moment().subtract(41, 'days').toDate(), + y: 5416 + }, + { + x: moment().subtract(40, 'days').toDate(), + y: 5195 + }, + { + x: moment().subtract(39, 'days').toDate(), + y: 5119 + }, + { + x: moment().subtract(38, 'days').toDate(), + y: 4635 + }, + { + x: moment().subtract(37, 'days').toDate(), + y: 4833 + }, + { + x: moment().subtract(36, 'days').toDate(), + y: 4584 + }, + { + x: moment().subtract(35, 'days').toDate(), + y: 4822 + }, + { + x: moment().subtract(34, 'days').toDate(), + y: 4330 + }, + { + x: moment().subtract(33, 'days').toDate(), + y: 4582 + }, + { + x: moment().subtract(32, 'days').toDate(), + y: 4348 + }, + { + x: moment().subtract(31, 'days').toDate(), + y: 4132 + }, + { + x: moment().subtract(30, 'days').toDate(), + y: 4099 + }, + { + x: moment().subtract(29, 'days').toDate(), + y: 3849 + }, + { + x: moment().subtract(28, 'days').toDate(), + y: 4010 + }, + { + x: moment().subtract(27, 'days').toDate(), + y: 4486 + }, + { + x: moment().subtract(26, 'days').toDate(), + y: 4403 + }, + { + x: moment().subtract(25, 'days').toDate(), + y: 4141 + }, + { + x: moment().subtract(24, 'days').toDate(), + y: 3780 + }, + { + x: moment().subtract(23, 'days').toDate(), + y: 3929 + }, + { + x: moment().subtract(22, 'days').toDate(), + y: 3524 + }, + { + x: moment().subtract(21, 'days').toDate(), + y: 3212 + }, + { + x: moment().subtract(20, 'days').toDate(), + y: 3568 + }, + { + x: moment().subtract(19, 'days').toDate(), + y: 3800 + }, + { + x: moment().subtract(18, 'days').toDate(), + y: 3796 + }, + { + x: moment().subtract(17, 'days').toDate(), + y: 3870 + }, + { + x: moment().subtract(16, 'days').toDate(), + y: 3745 + }, + { + x: moment().subtract(15, 'days').toDate(), + y: 3751 + }, + { + x: moment().subtract(14, 'days').toDate(), + y: 3310 + }, + { + x: moment().subtract(13, 'days').toDate(), + y: 3509 + }, + { + x: moment().subtract(12, 'days').toDate(), + y: 3311 + }, + { + x: moment().subtract(11, 'days').toDate(), + y: 3187 + }, + { + x: moment().subtract(10, 'days').toDate(), + y: 2918 + }, + { + x: moment().subtract(9, 'days').toDate(), + y: 3191 + }, + { + x: moment().subtract(8, 'days').toDate(), + y: 3437 + }, + { + x: moment().subtract(7, 'days').toDate(), + y: 3291 + }, + { + x: moment().subtract(6, 'days').toDate(), + y: 3317 + }, + { + x: moment().subtract(5, 'days').toDate(), + y: 3716 + }, + { + x: moment().subtract(4, 'days').toDate(), + y: 3260 + }, + { + x: moment().subtract(3, 'days').toDate(), + y: 3694 + }, + { + x: moment().subtract(2, 'days').toDate(), + y: 3598 + }, + { + x: moment().subtract(1, 'days').toDate(), + y: 3812 + } + ] + }, + { + name: 'Visitors', + data: [ + { + x: moment().subtract(65, 'days').toDate(), + y: 1654 + }, + { + x: moment().subtract(64, 'days').toDate(), + y: 1900 + }, + { + x: moment().subtract(63, 'days').toDate(), + y: 1647 + }, + { + x: moment().subtract(62, 'days').toDate(), + y: 1315 + }, + { + x: moment().subtract(61, 'days').toDate(), + y: 1807 + }, + { + x: moment().subtract(60, 'days').toDate(), + y: 1793 + }, + { + x: moment().subtract(59, 'days').toDate(), + y: 1892 + }, + { + x: moment().subtract(58, 'days').toDate(), + y: 1846 + }, + { + x: moment().subtract(57, 'days').toDate(), + y: 1966 + }, + { + x: moment().subtract(56, 'days').toDate(), + y: 1804 + }, + { + x: moment().subtract(55, 'days').toDate(), + y: 1778 + }, + { + x: moment().subtract(54, 'days').toDate(), + y: 2015 + }, + { + x: moment().subtract(53, 'days').toDate(), + y: 1892 + }, + { + x: moment().subtract(52, 'days').toDate(), + y: 1708 + }, + { + x: moment().subtract(51, 'days').toDate(), + y: 1711 + }, + { + x: moment().subtract(50, 'days').toDate(), + y: 1570 + }, + { + x: moment().subtract(49, 'days').toDate(), + y: 1507 + }, + { + x: moment().subtract(48, 'days').toDate(), + y: 1451 + }, + { + x: moment().subtract(47, 'days').toDate(), + y: 1522 + }, + { + x: moment().subtract(46, 'days').toDate(), + y: 1801 + }, + { + x: moment().subtract(45, 'days').toDate(), + y: 1977 + }, + { + x: moment().subtract(44, 'days').toDate(), + y: 2367 + }, + { + x: moment().subtract(43, 'days').toDate(), + y: 2798 + }, + { + x: moment().subtract(42, 'days').toDate(), + y: 3080 + }, + { + x: moment().subtract(41, 'days').toDate(), + y: 2856 + }, + { + x: moment().subtract(40, 'days').toDate(), + y: 2745 + }, + { + x: moment().subtract(39, 'days').toDate(), + y: 2750 + }, + { + x: moment().subtract(38, 'days').toDate(), + y: 2728 + }, + { + x: moment().subtract(37, 'days').toDate(), + y: 2436 + }, + { + x: moment().subtract(36, 'days').toDate(), + y: 2289 + }, + { + x: moment().subtract(35, 'days').toDate(), + y: 2657 + }, + { + x: moment().subtract(34, 'days').toDate(), + y: 2804 + }, + { + x: moment().subtract(33, 'days').toDate(), + y: 2777 + }, + { + x: moment().subtract(32, 'days').toDate(), + y: 3024 + }, + { + x: moment().subtract(31, 'days').toDate(), + y: 2657 + }, + { + x: moment().subtract(30, 'days').toDate(), + y: 2218 + }, + { + x: moment().subtract(29, 'days').toDate(), + y: 1964 + }, + { + x: moment().subtract(28, 'days').toDate(), + y: 1674 + }, + { + x: moment().subtract(27, 'days').toDate(), + y: 1721 + }, + { + x: moment().subtract(26, 'days').toDate(), + y: 2005 + }, + { + x: moment().subtract(25, 'days').toDate(), + y: 1613 + }, + { + x: moment().subtract(24, 'days').toDate(), + y: 1295 + }, + { + x: moment().subtract(23, 'days').toDate(), + y: 1071 + }, + { + x: moment().subtract(22, 'days').toDate(), + y: 799 + }, + { + x: moment().subtract(21, 'days').toDate(), + y: 1133 + }, + { + x: moment().subtract(20, 'days').toDate(), + y: 1536 + }, + { + x: moment().subtract(19, 'days').toDate(), + y: 2016 + }, + { + x: moment().subtract(18, 'days').toDate(), + y: 2256 + }, + { + x: moment().subtract(17, 'days').toDate(), + y: 1934 + }, + { + x: moment().subtract(16, 'days').toDate(), + y: 1832 + }, + { + x: moment().subtract(15, 'days').toDate(), + y: 2075 + }, + { + x: moment().subtract(14, 'days').toDate(), + y: 1709 + }, + { + x: moment().subtract(13, 'days').toDate(), + y: 1932 + }, + { + x: moment().subtract(12, 'days').toDate(), + y: 1831 + }, + { + x: moment().subtract(11, 'days').toDate(), + y: 1434 + }, + { + x: moment().subtract(10, 'days').toDate(), + y: 993 + }, + { + x: moment().subtract(9, 'days').toDate(), + y: 1064 + }, + { + x: moment().subtract(8, 'days').toDate(), + y: 618 + }, + { + x: moment().subtract(7, 'days').toDate(), + y: 1032 + }, + { + x: moment().subtract(6, 'days').toDate(), + y: 1280 + }, + { + x: moment().subtract(5, 'days').toDate(), + y: 1344 + }, + { + x: moment().subtract(4, 'days').toDate(), + y: 1835 + }, + { + x: moment().subtract(3, 'days').toDate(), + y: 2287 + }, + { + x: moment().subtract(2, 'days').toDate(), + y: 2226 + }, + { + x: moment().subtract(1, 'days').toDate(), + y: 2692 + } + ] + } + ] + }, + newVsReturning : { + uniqueVisitors: 46085, + series : [80, 20], + labels : [ + 'New', + 'Returning' + ] + }, + gender : { + uniqueVisitors: 46085, + series : [55, 45], + labels : [ + 'Male', + 'Female' + ] + }, + age : { + uniqueVisitors: 46085, + series : [35, 65], + labels : [ + 'Under 30', + 'Over 30' + ] + }, + language : { + uniqueVisitors: 46085, + series : [25, 75], + labels : [ + 'English', + 'Other' + ] + } +}; diff --git a/src/app/mock-api/dashboards/project/api.ts b/src/app/mock-api/dashboards/project/api.ts new file mode 100644 index 00000000..b5e9b393 --- /dev/null +++ b/src/app/mock-api/dashboards/project/api.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { project as projectData } from 'app/mock-api/dashboards/project/data'; + +@Injectable({ + providedIn: 'root' +}) +export class ProjectMockApi +{ + private _project: any = projectData; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Sales - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/dashboards/project') + .reply(() => [200, cloneDeep(this._project)]); + } +} diff --git a/src/app/mock-api/dashboards/project/data.ts b/src/app/mock-api/dashboards/project/data.ts new file mode 100644 index 00000000..661a9c9e --- /dev/null +++ b/src/app/mock-api/dashboards/project/data.ts @@ -0,0 +1,325 @@ +import * as moment from 'moment'; + +/* tslint:disable:max-line-length */ +export const project = { + githubIssues : { + overview: { + 'this-week': { + 'new-issues' : 214, + 'closed-issues': 75, + 'fixed' : 3, + 'wont-fix' : 4, + 're-opened' : 8, + 'needs-triage' : 6 + }, + 'last-week': { + 'new-issues' : 197, + 'closed-issues': 72, + 'fixed' : 6, + 'wont-fix' : 11, + 're-opened' : 6, + 'needs-triage' : 5 + } + }, + labels : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series : { + 'this-week': [ + { + name: 'New issues', + type: 'line', + data: [42, 28, 43, 34, 20, 25, 22] + }, + { + name: 'Closed issues', + type: 'column', + data: [11, 10, 8, 11, 8, 10, 17] + } + ], + 'last-week': [ + { + name: 'New issues', + type: 'line', + data: [37, 32, 39, 27, 18, 24, 20] + }, + { + name: 'Closed issues', + type: 'column', + data: [9, 8, 10, 12, 7, 11, 15] + } + ] + } + }, + taskDistribution : { + overview: { + 'this-week': { + 'new' : 594, + 'completed': 287 + }, + 'last-week': { + 'new' : 526, + 'completed': 260 + } + }, + labels : ['API', 'Backend', 'Frontend', 'Issues'], + series : { + 'this-week': [15, 20, 38, 27], + 'last-week': [19, 16, 42, 23] + } + }, + schedule : { + today : [ + { + title : 'Group Meeting', + time : 'in 32 minutes', + location: 'Conference room 1B' + }, + { + title: 'Coffee Break', + time : '10:30 AM' + }, + { + title: 'Public Beta Release', + time : '11:00 AM' + }, + { + title: 'Lunch', + time : '12:10 PM' + }, + { + title : 'Dinner with David', + time : '05:30 PM', + location: 'Magnolia' + }, + { + title : 'Jane\'s Birthday Party', + time : '07:30 PM', + location: 'Home' + }, + { + title : 'Overseer\'s Retirement Party', + time : '09:30 PM', + location: 'Overseer\'s room' + } + ], + tomorrow: [ + { + title : 'Marketing Meeting', + time : '09:00 AM', + location: 'Conference room 1A' + }, + { + title: 'Public Announcement', + time : '11:00 AM' + }, + { + title: 'Lunch', + time : '12:10 PM' + }, + { + title : 'Meeting with Beta Testers', + time : '03:00 PM', + location: 'Conference room 2C' + }, + { + title: 'Live Stream', + time : '05:30 PM' + }, + { + title : 'Release Party', + time : '07:30 PM', + location: 'CEO\'s house' + }, + { + title : 'CEO\'s Private Party', + time : '09:30 PM', + location: 'CEO\'s Penthouse' + } + ] + }, + budgetDistribution: { + categories: ['Concept', 'Design', 'Development', 'Extras', 'Marketing'], + series : [ + { + name: 'Budget', + data: [12, 20, 28, 15, 25] + } + ] + }, + weeklyExpenses : { + amount: 17663, + labels: [ + moment().subtract(47, 'days').format('DD MMM') + ' - ' + moment().subtract(40, 'days').format('DD MMM'), + moment().subtract(39, 'days').format('DD MMM') + ' - ' + moment().subtract(32, 'days').format('DD MMM'), + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Expenses', + data: [4412, 4345, 4541, 4677, 4322, 4123] + } + ] + }, + monthlyExpenses : { + amount: 54663, + labels: [ + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Expenses', + data: [15521, 15519, 15522, 15521] + } + ] + }, + yearlyExpenses : { + amount: 648813, + labels: [ + moment().subtract(79, 'days').format('DD MMM') + ' - ' + moment().subtract(72, 'days').format('DD MMM'), + moment().subtract(71, 'days').format('DD MMM') + ' - ' + moment().subtract(64, 'days').format('DD MMM'), + moment().subtract(63, 'days').format('DD MMM') + ' - ' + moment().subtract(56, 'days').format('DD MMM'), + moment().subtract(55, 'days').format('DD MMM') + ' - ' + moment().subtract(48, 'days').format('DD MMM'), + moment().subtract(47, 'days').format('DD MMM') + ' - ' + moment().subtract(40, 'days').format('DD MMM'), + moment().subtract(39, 'days').format('DD MMM') + ' - ' + moment().subtract(32, 'days').format('DD MMM'), + moment().subtract(31, 'days').format('DD MMM') + ' - ' + moment().subtract(24, 'days').format('DD MMM'), + moment().subtract(23, 'days').format('DD MMM') + ' - ' + moment().subtract(16, 'days').format('DD MMM'), + moment().subtract(15, 'days').format('DD MMM') + ' - ' + moment().subtract(8, 'days').format('DD MMM'), + moment().subtract(7, 'days').format('DD MMM') + ' - ' + moment().format('DD MMM') + ], + series: [ + { + name: 'Expenses', + data: [45891, 45801, 45834, 45843, 45800, 45900, 45814, 45856, 45910, 45849] + } + ] + }, + budgetDetails : { + columns: ['type', 'total', 'expensesAmount', 'expensesPercentage', 'remainingAmount', 'remainingPercentage'], + rows : [ + { + id : 1, + type : 'Concept', + total : 14880, + expensesAmount : 14000, + expensesPercentage : 94.08, + remainingAmount : 880, + remainingPercentage: 5.92 + }, + { + id : 2, + type : 'Design', + total : 21080, + expensesAmount : 17240.34, + expensesPercentage : 81.78, + remainingAmount : 3839.66, + remainingPercentage: 18.22 + }, + { + id : 3, + type : 'Development', + total : 34720, + expensesAmount : 3518, + expensesPercentage : 10.13, + remainingAmount : 31202, + remainingPercentage: 89.87 + }, + { + id : 4, + type : 'Extras', + total : 18600, + expensesAmount : 0, + expensesPercentage : 0, + remainingAmount : 18600, + remainingPercentage: 100 + }, + { + id : 5, + type : 'Marketing', + total : 34720, + expensesAmount : 19859.84, + expensesPercentage : 57.2, + remainingAmount : 14860.16, + remainingPercentage: 42.8 + } + ] + }, + teamMembers : [ + { + id : '2bfa2be5-7688-48d5-b5ac-dc0d9ac97f14', + avatar: 'assets/images/avatars/female-10.jpg', + name : 'Nadia Mcknight', + email : 'nadiamcknight@mail.com', + phone : '+1-943-511-2203', + title : 'Project Director' + }, + { + id : '77a4383b-b5a5-4943-bc46-04c3431d1566', + avatar: 'assets/images/avatars/male-19.jpg', + name : 'Best Blackburn', + email : 'blackburn.best@beadzza.me', + phone : '+1-814-498-3701', + title : 'Senior Developer' + }, + { + id : '8bb0f597-673a-47ca-8c77-2f83219cb9af', + avatar: 'assets/images/avatars/male-14.jpg', + name : 'Duncan Carver', + email : 'duncancarver@mail.info', + phone : '+1-968-547-2111', + title : 'Senior Developer' + }, + { + id : 'c318e31f-1d74-49c5-8dae-2bc5805e2fdb', + avatar: 'assets/images/avatars/male-01.jpg', + name : 'Martin Richards', + email : 'martinrichards@mail.biz', + phone : '+1-902-500-2668', + title : 'Junior Developer' + }, + { + id : '0a8bc517-631a-4a93-aacc-000fa2e8294c', + avatar: 'assets/images/avatars/female-20.jpg', + name : 'Candice Munoz', + email : 'candicemunoz@mail.co.uk', + phone : '+1-838-562-2769', + title : 'Lead Designer' + }, + { + id : 'a4c9945a-757b-40b0-8942-d20e0543cabd', + avatar: 'assets/images/avatars/female-01.jpg', + name : 'Vickie Mosley', + email : 'vickiemosley@mail.net', + phone : '+1-939-555-3054', + title : 'Designer' + }, + { + id : 'b8258ccf-48b5-46a2-9c95-e0bd7580c645', + avatar: 'assets/images/avatars/female-02.jpg', + name : 'Tina Harris', + email : 'tinaharris@mail.ca', + phone : '+1-933-464-2431', + title : 'Designer' + }, + { + id : 'f004ea79-98fc-436c-9ba5-6cfe32fe583d', + avatar: 'assets/images/avatars/male-02.jpg', + name : 'Holt Manning', + email : 'holtmanning@mail.org', + phone : '+1-822-531-2600', + title : 'Marketing Manager' + }, + { + id : '8b69fe2d-d7cc-4a3d-983d-559173e37d37', + avatar: 'assets/images/avatars/female-03.jpg', + name : 'Misty Ramsey', + email : 'mistyramsey@mail.us', + phone : '+1-990-457-2106', + title : 'Consultant' + } + ] +}; diff --git a/src/app/mock-api/index.ts b/src/app/mock-api/index.ts new file mode 100644 index 00000000..96b574c3 --- /dev/null +++ b/src/app/mock-api/index.ts @@ -0,0 +1,37 @@ +import { AnalyticsMockApi } from 'app/mock-api/dashboards/analytics/api'; +import { AuthMockApi } from 'app/mock-api/common/auth/api'; +import { CalendarMockApi } from 'app/mock-api/apps/calendar/api'; +import { ContactsMockApi } from 'app/mock-api/apps/contacts/api'; +import { ECommerceInventoryMockApi } from 'app/mock-api/apps/ecommerce/inventory/api'; +import { FileManagerMockApi } from 'app/mock-api/apps/file-manager/api'; +import { HelpCenterMockApi } from 'app/mock-api/apps/help-center/api'; +import { IconsMockApi } from 'app/mock-api/ui/icons/api'; +import { MailboxMockApi } from 'app/mock-api/apps/mailbox/api'; +import { MessagesMockApi } from 'app/mock-api/common/messages/api'; +import { NavigationMockApi } from 'app/mock-api/common/navigation/api'; +import { NotificationsMockApi } from 'app/mock-api/common/notifications/api'; +import { ProjectMockApi } from 'app/mock-api/dashboards/project/api'; +import { SearchMockApi } from 'app/mock-api/common/search/api'; +import { ShortcutsMockApi } from 'app/mock-api/common/shortcuts/api'; +import { TasksMockApi } from 'app/mock-api/apps/tasks/api'; +import { UserMockApi } from 'app/mock-api/common/user/api'; + +export const mockApiServices = [ + AnalyticsMockApi, + AuthMockApi, + CalendarMockApi, + ContactsMockApi, + ECommerceInventoryMockApi, + FileManagerMockApi, + HelpCenterMockApi, + IconsMockApi, + MailboxMockApi, + MessagesMockApi, + NavigationMockApi, + NotificationsMockApi, + ProjectMockApi, + SearchMockApi, + ShortcutsMockApi, + TasksMockApi, + UserMockApi +]; diff --git a/src/app/mock-api/ui/icons/api.ts b/src/app/mock-api/ui/icons/api.ts new file mode 100644 index 00000000..5e8dc8bb --- /dev/null +++ b/src/app/mock-api/ui/icons/api.ts @@ -0,0 +1,124 @@ +import { Injectable } from '@angular/core'; +import { cloneDeep } from 'lodash-es'; +import { FuseMockApiService } from '@fuse/lib/mock-api'; +import { feather, heroicons, iconsmind, material } from 'app/mock-api/ui/icons/data'; + +@Injectable({ + providedIn: 'root' +}) +export class IconsMockApi +{ + private readonly _feather: any = feather; + private readonly _heroicons: any = heroicons; + private readonly _iconsmind: any = iconsmind; + private readonly _material: any = material; + + /** + * Constructor + */ + constructor(private _fuseMockApiService: FuseMockApiService) + { + // Register Mock API handlers + this.registerHandlers(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register Mock API handlers + */ + registerHandlers(): void + { + // ----------------------------------------------------------------------------------------------------- + // @ Feather icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/feather') + .reply(() => [ + 200, + { + namespace: 'feather', + name : 'Feather', + grid : 6, + list : cloneDeep(this._feather) + } + ]); + + // ----------------------------------------------------------------------------------------------------- + // @ Heroicons outline icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/heroicons-outline') + .reply(() => [ + 200, + { + namespace: 'heroicons_outline', + name : 'Heroicons Outline', + grid : 6, + list : cloneDeep(this._heroicons) + } + ]); + + // ----------------------------------------------------------------------------------------------------- + // @ Heroicons solid icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/heroicons-solid') + .reply(() => [ + 200, + { + namespace: 'heroicons_solid', + name : 'Heroicons Solid', + grid : 5, + list : cloneDeep(this._heroicons) + } + ]); + + // ----------------------------------------------------------------------------------------------------- + // @ Iconsmind icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/iconsmind') + .reply(() => [ + 200, + { + namespace: 'iconsmind', + name : 'Iconsmind', + grid : 10, + list : cloneDeep(this._iconsmind) + } + ]); + + // ----------------------------------------------------------------------------------------------------- + // @ Material outline icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/material-outline') + .reply(() => [ + 200, + { + namespace: 'mat_outline', + name : 'Material Outline', + grid : 6, + list : cloneDeep(this._material) + } + ]); + + // ----------------------------------------------------------------------------------------------------- + // @ Material twotone icons - GET + // ----------------------------------------------------------------------------------------------------- + this._fuseMockApiService + .onGet('api/ui/icons/material-twotone') + .reply(() => [ + 200, + { + namespace: '', + name : 'Material Twotone', + grid : 6, + list : cloneDeep(this._material) + } + ]); + } +} diff --git a/src/app/mock-api/ui/icons/data.ts b/src/app/mock-api/ui/icons/data.ts new file mode 100644 index 00000000..166d4559 --- /dev/null +++ b/src/app/mock-api/ui/icons/data.ts @@ -0,0 +1,4383 @@ +/* tslint:disable:max-line-length */ + +// 20210326 - 1777 icons +export const material = [ + '10k', + '10mp', + '11mp', + '12mp', + '13mp', + '14mp', + '15mp', + '16mp', + '17mp', + '18mp', + '19mp', + '1k', + '1k_plus', + '1x_mobiledata', + '20mp', + '21mp', + '22mp', + '23mp', + '24mp', + '2k', + '2k_plus', + '2mp', + '30fps', + '30fps_select', + '360', + '3d_rotation', + '3g_mobiledata', + '3k', + '3k_plus', + '3mp', + '3p', + '4g_mobiledata', + '4g_plus_mobiledata', + '4k', + '4k_plus', + '4mp', + '5g', + '5k', + '5k_plus', + '5mp', + '60fps', + '60fps_select', + '6_ft_apart', + '6k', + '6k_plus', + '6mp', + '7k', + '7k_plus', + '7mp', + '8k', + '8k_plus', + '8mp', + '9k', + '9k_plus', + '9mp', + 'ac_unit', + 'access_alarm', + 'access_alarms', + 'access_time', + 'access_time_filled', + 'accessibility', + 'accessibility_new', + 'accessible', + 'accessible_forward', + 'account_balance', + 'account_balance_wallet', + 'account_box', + 'account_circle', + 'account_tree', + 'ad_units', + 'adb', + 'add', + 'add_a_photo', + 'add_alarm', + 'add_alert', + 'add_box', + 'add_business', + 'add_chart', + 'add_circle', + 'add_circle_outline', + 'add_comment', + 'add_ic_call', + 'add_link', + 'add_location', + 'add_location_alt', + 'add_moderator', + 'add_photo_alternate', + 'add_reaction', + 'add_road', + 'add_shopping_cart', + 'add_task', + 'add_to_drive', + 'add_to_home_screen', + 'add_to_photos', + 'add_to_queue', + 'addchart', + 'adjust', + 'admin_panel_settings', + 'agriculture', + 'air', + 'airline_seat_flat', + 'airline_seat_flat_angled', + 'airline_seat_individual_suite', + 'airline_seat_legroom_extra', + 'airline_seat_legroom_normal', + 'airline_seat_legroom_reduced', + 'airline_seat_recline_extra', + 'airline_seat_recline_normal', + 'airplane_ticket', + 'airplanemode_active', + 'airplanemode_inactive', + 'airplay', + 'airport_shuttle', + 'alarm', + 'alarm_add', + 'alarm_off', + 'alarm_on', + 'album', + 'align_horizontal_center', + 'align_horizontal_left', + 'align_horizontal_right', + 'align_vertical_bottom', + 'align_vertical_center', + 'align_vertical_top', + 'all_inbox', + 'all_inclusive', + 'all_out', + 'alt_route', + 'alternate_email', + 'analytics', + 'anchor', + 'android', + 'animation', + 'announcement', + 'aod', + 'apartment', + 'api', + 'app_blocking', + 'app_registration', + 'app_settings_alt', + 'approval', + 'apps', + 'architecture', + 'archive', + 'arrow_back', + 'arrow_back_ios', + 'arrow_back_ios_new', + 'arrow_circle_down', + 'arrow_circle_up', + 'arrow_downward', + 'arrow_drop_down', + 'arrow_drop_down_circle', + 'arrow_drop_up', + 'arrow_forward', + 'arrow_forward_ios', + 'arrow_left', + 'arrow_right', + 'arrow_right_alt', + 'arrow_upward', + 'art_track', + 'article', + 'aspect_ratio', + 'assessment', + 'assignment', + 'assignment_ind', + 'assignment_late', + 'assignment_return', + 'assignment_returned', + 'assignment_turned_in', + 'assistant', + 'assistant_direction', + 'assistant_photo', + 'atm', + 'attach_email', + 'attach_file', + 'attach_money', + 'attachment', + 'attractions', + 'attribution', + 'audiotrack', + 'auto_awesome', + 'auto_awesome_mosaic', + 'auto_awesome_motion', + 'auto_delete', + 'auto_fix_high', + 'auto_fix_normal', + 'auto_fix_off', + 'auto_graph', + 'auto_stories', + 'autofps_select', + 'autorenew', + 'av_timer', + 'baby_changing_station', + 'backpack', + 'backspace', + 'backup', + 'backup_table', + 'badge', + 'bakery_dining', + 'balcony', + 'ballot', + 'bar_chart', + 'batch_prediction', + 'bathroom', + 'bathtub', + 'battery_alert', + 'battery_charging_full', + 'battery_full', + 'battery_saver', + 'battery_std', + 'battery_unknown', + 'beach_access', + 'bed', + 'bedroom_baby', + 'bedroom_child', + 'bedroom_parent', + 'bedtime', + 'beenhere', + 'bento', + 'bike_scooter', + 'biotech', + 'blender', + 'block', + 'bloodtype', + 'bluetooth', + 'bluetooth_audio', + 'bluetooth_connected', + 'bluetooth_disabled', + 'bluetooth_drive', + 'bluetooth_searching', + 'blur_circular', + 'blur_linear', + 'blur_off', + 'blur_on', + 'bolt', + 'book', + 'book_online', + 'bookmark', + 'bookmark_add', + 'bookmark_added', + 'bookmark_border', + 'bookmark_remove', + 'bookmarks', + 'border_all', + 'border_bottom', + 'border_clear', + 'border_color', + 'border_horizontal', + 'border_inner', + 'border_left', + 'border_outer', + 'border_right', + 'border_style', + 'border_top', + 'border_vertical', + 'branding_watermark', + 'breakfast_dining', + 'brightness_1', + 'brightness_2', + 'brightness_3', + 'brightness_4', + 'brightness_5', + 'brightness_6', + 'brightness_7', + 'brightness_auto', + 'brightness_high', + 'brightness_low', + 'brightness_medium', + 'broken_image', + 'browser_not_supported', + 'brunch_dining', + 'brush', + 'bubble_chart', + 'bug_report', + 'build', + 'build_circle', + 'bungalow', + 'burst_mode', + 'bus_alert', + 'business', + 'business_center', + 'cabin', + 'cable', + 'cached', + 'cake', + 'calculate', + 'calendar_today', + 'calendar_view_day', + 'calendar_view_month', + 'calendar_view_week', + 'call', + 'call_end', + 'call_made', + 'call_merge', + 'call_missed', + 'call_missed_outgoing', + 'call_received', + 'call_split', + 'call_to_action', + 'camera', + 'camera_alt', + 'camera_enhance', + 'camera_front', + 'camera_indoor', + 'camera_outdoor', + 'camera_rear', + 'camera_roll', + 'cameraswitch', + 'campaign', + 'cancel', + 'cancel_presentation', + 'cancel_schedule_send', + 'car_rental', + 'car_repair', + 'card_giftcard', + 'card_membership', + 'card_travel', + 'carpenter', + 'cases', + 'casino', + 'cast', + 'cast_connected', + 'cast_for_education', + 'catching_pokemon', + 'category', + 'celebration', + 'cell_wifi', + 'center_focus_strong', + 'center_focus_weak', + 'chair', + 'chair_alt', + 'chalet', + 'change_circle', + 'change_history', + 'charging_station', + 'chat', + 'chat_bubble', + 'chat_bubble_outline', + 'check', + 'check_box', + 'check_box_outline_blank', + 'check_circle', + 'check_circle_outline', + 'checklist', + 'checklist_rtl', + 'checkroom', + 'chevron_left', + 'chevron_right', + 'child_care', + 'child_friendly', + 'chrome_reader_mode', + 'circle', + 'circle_notifications', + 'class', + 'clean_hands', + 'cleaning_services', + 'clear', + 'clear_all', + 'close', + 'close_fullscreen', + 'closed_caption', + 'closed_caption_disabled', + 'closed_caption_off', + 'cloud', + 'cloud_circle', + 'cloud_done', + 'cloud_download', + 'cloud_off', + 'cloud_queue', + 'cloud_upload', + 'code', + 'code_off', + 'coffee', + 'coffee_maker', + 'collections', + 'collections_bookmark', + 'color_lens', + 'colorize', + 'comment', + 'comment_bank', + 'commute', + 'compare', + 'compare_arrows', + 'compass_calibration', + 'compress', + 'computer', + 'confirmation_number', + 'connect_without_contact', + 'connected_tv', + 'construction', + 'contact_mail', + 'contact_page', + 'contact_phone', + 'contact_support', + 'contactless', + 'contacts', + 'content_copy', + 'content_cut', + 'content_paste', + 'content_paste_off', + 'control_camera', + 'control_point', + 'control_point_duplicate', + 'copy_all', + 'copyright', + 'coronavirus', + 'corporate_fare', + 'cottage', + 'countertops', + 'create', + 'create_new_folder', + 'credit_card', + 'credit_card_off', + 'credit_score', + 'crib', + 'crop', + 'crop_16_9', + 'crop_3_2', + 'crop_5_4', + 'crop_7_5', + 'crop_din', + 'crop_free', + 'crop_landscape', + 'crop_original', + 'crop_portrait', + 'crop_rotate', + 'crop_square', + 'dangerous', + 'dark_mode', + 'dashboard', + 'dashboard_customize', + 'data_saver_off', + 'data_saver_on', + 'data_usage', + 'date_range', + 'deck', + 'dehaze', + 'delete', + 'delete_forever', + 'delete_outline', + 'delete_sweep', + 'delivery_dining', + 'departure_board', + 'description', + 'design_services', + 'desktop_access_disabled', + 'desktop_mac', + 'desktop_windows', + 'details', + 'developer_board', + 'developer_board_off', + 'developer_mode', + 'device_hub', + 'device_thermostat', + 'device_unknown', + 'devices', + 'devices_other', + 'dialer_sip', + 'dialpad', + 'dining', + 'dinner_dining', + 'directions', + 'directions_bike', + 'directions_boat', + 'directions_boat_filled', + 'directions_bus', + 'directions_bus_filled', + 'directions_car', + 'directions_car_filled', + 'directions_off', + 'directions_railway', + 'directions_railway_filled', + 'directions_run', + 'directions_subway', + 'directions_subway_filled', + 'directions_transit', + 'directions_transit_filled', + 'directions_walk', + 'dirty_lens', + 'disabled_by_default', + 'disc_full', + 'dns', + 'do_disturb', + 'do_disturb_alt', + 'do_disturb_off', + 'do_disturb_on', + 'do_not_disturb', + 'do_not_disturb_alt', + 'do_not_disturb_off', + 'do_not_disturb_on', + 'do_not_disturb_on_total_silence', + 'do_not_step', + 'do_not_touch', + 'dock', + 'document_scanner', + 'domain', + 'domain_disabled', + 'domain_verification', + 'done', + 'done_all', + 'done_outline', + 'donut_large', + 'donut_small', + 'door_back', + 'door_front', + 'door_sliding', + 'doorbell', + 'double_arrow', + 'downhill_skiing', + 'download', + 'download_done', + 'download_for_offline', + 'downloading', + 'drafts', + 'drag_handle', + 'drag_indicator', + 'draw', + 'drive_eta', + 'drive_file_move', + 'drive_file_rename_outline', + 'drive_folder_upload', + 'dry', + 'dry_cleaning', + 'duo', + 'dvr', + 'dynamic_feed', + 'dynamic_form', + 'e_mobiledata', + 'earbuds', + 'earbuds_battery', + 'east', + 'eco', + 'edgesensor_high', + 'edgesensor_low', + 'edit', + 'edit_attributes', + 'edit_calendar', + 'edit_location', + 'edit_location_alt', + 'edit_note', + 'edit_notifications', + 'edit_off', + 'edit_road', + 'eject', + 'elderly', + 'electric_bike', + 'electric_car', + 'electric_moped', + 'electric_rickshaw', + 'electric_scooter', + 'electrical_services', + 'elevator', + 'email', + 'emergency', + 'emoji_emotions', + 'emoji_events', + 'emoji_flags', + 'emoji_food_beverage', + 'emoji_nature', + 'emoji_objects', + 'emoji_people', + 'emoji_symbols', + 'emoji_transportation', + 'engineering', + 'enhanced_encryption', + 'equalizer', + 'error', + 'error_outline', + 'escalator', + 'escalator_warning', + 'euro', + 'euro_symbol', + 'ev_station', + 'event', + 'event_available', + 'event_busy', + 'event_note', + 'event_seat', + 'exit_to_app', + 'expand', + 'expand_less', + 'expand_more', + 'explicit', + 'explore', + 'explore_off', + 'exposure', + 'exposure_neg_1', + 'exposure_neg_2', + 'exposure_plus_1', + 'exposure_plus_2', + 'exposure_zero', + 'extension', + 'extension_off', + 'face', + 'face_retouching_natural', + 'face_retouching_off', + 'facebook', + 'fact_check', + 'family_restroom', + 'fast_forward', + 'fast_rewind', + 'fastfood', + 'favorite', + 'favorite_border', + 'featured_play_list', + 'featured_video', + 'feed', + 'feedback', + 'female', + 'fence', + 'festival', + 'fiber_dvr', + 'fiber_manual_record', + 'fiber_new', + 'fiber_pin', + 'fiber_smart_record', + 'file_copy', + 'file_download', + 'file_download_done', + 'file_download_off', + 'file_present', + 'file_upload', + 'filter', + 'filter_1', + 'filter_2', + 'filter_3', + 'filter_4', + 'filter_5', + 'filter_6', + 'filter_7', + 'filter_8', + 'filter_9', + 'filter_9_plus', + 'filter_alt', + 'filter_b_and_w', + 'filter_center_focus', + 'filter_drama', + 'filter_frames', + 'filter_hdr', + 'filter_list', + 'filter_none', + 'filter_tilt_shift', + 'filter_vintage', + 'find_in_page', + 'find_replace', + 'fingerprint', + 'fire_extinguisher', + 'fireplace', + 'first_page', + 'fit_screen', + 'fitness_center', + 'flag', + 'flaky', + 'flare', + 'flash_auto', + 'flash_off', + 'flash_on', + 'flashlight_off', + 'flashlight_on', + 'flatware', + 'flight', + 'flight_land', + 'flight_takeoff', + 'flip', + 'flip_camera_android', + 'flip_camera_ios', + 'flip_to_back', + 'flip_to_front', + 'flourescent', + 'flutter_dash', + 'fmd_bad', + 'fmd_good', + 'folder', + 'folder_open', + 'folder_shared', + 'folder_special', + 'follow_the_signs', + 'font_download', + 'font_download_off', + 'food_bank', + 'format_align_center', + 'format_align_justify', + 'format_align_left', + 'format_align_right', + 'format_bold', + 'format_clear', + 'format_color_fill', + 'format_color_reset', + 'format_color_text', + 'format_indent_decrease', + 'format_indent_increase', + 'format_italic', + 'format_line_spacing', + 'format_list_bulleted', + 'format_list_numbered', + 'format_list_numbered_rtl', + 'format_paint', + 'format_quote', + 'format_shapes', + 'format_size', + 'format_strikethrough', + 'format_textdirection_l_to_r', + 'format_textdirection_r_to_l', + 'format_underlined', + 'forum', + 'forward', + 'forward_10', + 'forward_30', + 'forward_5', + 'forward_to_inbox', + 'foundation', + 'free_breakfast', + 'free_cancellation', + 'fullscreen', + 'fullscreen_exit', + 'functions', + 'g_mobiledata', + 'g_translate', + 'gamepad', + 'games', + 'garage', + 'gavel', + 'generating_tokens', + 'gesture', + 'get_app', + 'gif', + 'gite', + 'golf_course', + 'gpp_bad', + 'gpp_good', + 'gpp_maybe', + 'gps_fixed', + 'gps_not_fixed', + 'gps_off', + 'grade', + 'gradient', + 'grading', + 'grain', + 'graphic_eq', + 'grass', + 'grid_3x3', + 'grid_4x4', + 'grid_goldenratio', + 'grid_off', + 'grid_on', + 'grid_view', + 'group', + 'group_add', + 'group_off', + 'group_work', + 'groups', + 'h_mobiledata', + 'h_plus_mobiledata', + 'hail', + 'handyman', + 'hardware', + 'hd', + 'hdr_auto', + 'hdr_auto_select', + 'hdr_enhanced_select', + 'hdr_off', + 'hdr_off_select', + 'hdr_on', + 'hdr_on_select', + 'hdr_plus', + 'hdr_strong', + 'hdr_weak', + 'headphones', + 'headphones_battery', + 'headset', + 'headset_mic', + 'headset_off', + 'healing', + 'health_and_safety', + 'hearing', + 'hearing_disabled', + 'height', + 'help', + 'help_center', + 'help_outline', + 'hevc', + 'hide_image', + 'hide_source', + 'high_quality', + 'highlight', + 'highlight_alt', + 'highlight_off', + 'hiking', + 'history', + 'history_edu', + 'history_toggle_off', + 'holiday_village', + 'home', + 'home_max', + 'home_mini', + 'home_repair_service', + 'home_work', + 'horizontal_distribute', + 'horizontal_rule', + 'horizontal_split', + 'hot_tub', + 'hotel', + 'hotel_class', + 'hourglass_bottom', + 'hourglass_disabled', + 'hourglass_empty', + 'hourglass_full', + 'hourglass_top', + 'house', + 'house_siding', + 'houseboat', + 'how_to_reg', + 'how_to_vote', + 'http', + 'https', + 'hvac', + 'ice_skating', + 'icecream', + 'image', + 'image_aspect_ratio', + 'image_not_supported', + 'image_search', + 'imagesearch_roller', + 'import_contacts', + 'import_export', + 'important_devices', + 'inbox', + 'indeterminate_check_box', + 'info', + 'input', + 'insert_chart', + 'insert_chart_outlined', + 'insert_comment', + 'insert_drive_file', + 'insert_emoticon', + 'insert_invitation', + 'insert_link', + 'insert_photo', + 'insights', + 'integration_instructions', + 'inventory', + 'inventory_2', + 'invert_colors', + 'invert_colors_off', + 'ios_share', + 'iron', + 'iso', + 'kayaking', + 'keyboard', + 'keyboard_alt', + 'keyboard_arrow_down', + 'keyboard_arrow_left', + 'keyboard_arrow_right', + 'keyboard_arrow_up', + 'keyboard_backspace', + 'keyboard_capslock', + 'keyboard_hide', + 'keyboard_return', + 'keyboard_tab', + 'keyboard_voice', + 'king_bed', + 'kitchen', + 'kitesurfing', + 'label', + 'label_important', + 'label_off', + 'landscape', + 'language', + 'laptop', + 'laptop_chromebook', + 'laptop_mac', + 'laptop_windows', + 'last_page', + 'launch', + 'layers', + 'layers_clear', + 'leaderboard', + 'leak_add', + 'leak_remove', + 'legend_toggle', + 'lens', + 'lens_blur', + 'library_add', + 'library_add_check', + 'library_books', + 'library_music', + 'light', + 'light_mode', + 'lightbulb', + 'line_style', + 'line_weight', + 'linear_scale', + 'link', + 'link_off', + 'linked_camera', + 'liquor', + 'list', + 'list_alt', + 'live_help', + 'live_tv', + 'living', + 'local_activity', + 'local_airport', + 'local_atm', + 'local_bar', + 'local_cafe', + 'local_car_wash', + 'local_convenience_store', + 'local_dining', + 'local_drink', + 'local_fire_department', + 'local_florist', + 'local_gas_station', + 'local_grocery_store', + 'local_hospital', + 'local_hotel', + 'local_laundry_service', + 'local_library', + 'local_mall', + 'local_movies', + 'local_offer', + 'local_parking', + 'local_pharmacy', + 'local_phone', + 'local_pizza', + 'local_play', + 'local_police', + 'local_post_office', + 'local_printshop', + 'local_see', + 'local_shipping', + 'local_taxi', + 'location_city', + 'location_disabled', + 'location_off', + 'location_on', + 'location_searching', + 'lock', + 'lock_clock', + 'lock_open', + 'login', + 'logout', + 'looks', + 'looks_3', + 'looks_4', + 'looks_5', + 'looks_6', + 'looks_one', + 'looks_two', + 'loop', + 'loupe', + 'low_priority', + 'loyalty', + 'lte_mobiledata', + 'lte_plus_mobiledata', + 'luggage', + 'lunch_dining', + 'mail', + 'mail_outline', + 'male', + 'manage_accounts', + 'manage_search', + 'map', + 'maps_home_work', + 'maps_ugc', + 'margin', + 'mark_as_unread', + 'mark_chat_read', + 'mark_chat_unread', + 'mark_email_read', + 'mark_email_unread', + 'markunread', + 'markunread_mailbox', + 'masks', + 'maximize', + 'media_bluetooth_off', + 'media_bluetooth_on', + 'mediation', + 'medical_services', + 'medication', + 'meeting_room', + 'memory', + 'menu', + 'menu_book', + 'menu_open', + 'merge_type', + 'message', + 'mic', + 'mic_external_off', + 'mic_external_on', + 'mic_none', + 'mic_off', + 'microwave', + 'military_tech', + 'minimize', + 'miscellaneous_services', + 'missed_video_call', + 'mms', + 'mobile_friendly', + 'mobile_off', + 'mobile_screen_share', + 'mobiledata_off', + 'mode', + 'mode_comment', + 'mode_edit', + 'mode_edit_outline', + 'mode_night', + 'mode_standby', + 'model_training', + 'monetization_on', + 'money', + 'money_off', + 'money_off_csred', + 'monitor', + 'monitor_weight', + 'monochrome_photos', + 'mood', + 'mood_bad', + 'moped', + 'more', + 'more_horiz', + 'more_time', + 'more_vert', + 'motion_photos_auto', + 'motion_photos_off', + 'motion_photos_on', + 'motion_photos_pause', + 'motion_photos_paused', + 'mouse', + 'move_to_inbox', + 'movie', + 'movie_creation', + 'movie_filter', + 'moving', + 'mp', + 'multiline_chart', + 'multiple_stop', + 'museum', + 'music_note', + 'music_off', + 'music_video', + 'my_location', + 'nat', + 'nature', + 'nature_people', + 'navigate_before', + 'navigate_next', + 'navigation', + 'near_me', + 'near_me_disabled', + 'nearby_error', + 'nearby_off', + 'network_cell', + 'network_check', + 'network_locked', + 'network_wifi', + 'new_label', + 'new_releases', + 'next_plan', + 'next_week', + 'nfc', + 'night_shelter', + 'nightlife', + 'nightlight', + 'nightlight_round', + 'nights_stay', + 'no_accounts', + 'no_backpack', + 'no_cell', + 'no_drinks', + 'no_encryption', + 'no_encryption_gmailerrorred', + 'no_flash', + 'no_food', + 'no_luggage', + 'no_meals', + 'no_meeting_room', + 'no_photography', + 'no_sim', + 'no_stroller', + 'no_transfer', + 'nordic_walking', + 'north', + 'north_east', + 'north_west', + 'not_accessible', + 'not_interested', + 'not_listed_location', + 'not_started', + 'note', + 'note_add', + 'note_alt', + 'notes', + 'notification_add', + 'notification_important', + 'notifications', + 'notifications_active', + 'notifications_none', + 'notifications_off', + 'notifications_paused', + 'offline_bolt', + 'offline_pin', + 'offline_share', + 'ondemand_video', + 'online_prediction', + 'opacity', + 'open_in_browser', + 'open_in_full', + 'open_in_new', + 'open_in_new_off', + 'open_with', + 'other_houses', + 'outbound', + 'outbox', + 'outdoor_grill', + 'outlet', + 'outlined_flag', + 'padding', + 'pages', + 'pageview', + 'paid', + 'palette', + 'pan_tool', + 'panorama', + 'panorama_fish_eye', + 'panorama_horizontal', + 'panorama_horizontal_select', + 'panorama_photosphere', + 'panorama_photosphere_select', + 'panorama_vertical', + 'panorama_vertical_select', + 'panorama_wide_angle', + 'panorama_wide_angle_select', + 'paragliding', + 'park', + 'party_mode', + 'password', + 'pattern', + 'pause', + 'pause_circle', + 'pause_circle_filled', + 'pause_circle_outline', + 'pause_presentation', + 'payment', + 'payments', + 'pedal_bike', + 'pending', + 'pending_actions', + 'people', + 'people_alt', + 'people_outline', + 'perm_camera_mic', + 'perm_contact_calendar', + 'perm_data_setting', + 'perm_device_information', + 'perm_identity', + 'perm_media', + 'perm_phone_msg', + 'perm_scan_wifi', + 'person', + 'person_add', + 'person_add_alt', + 'person_add_alt_1', + 'person_add_disabled', + 'person_off', + 'person_outline', + 'person_pin', + 'person_pin_circle', + 'person_remove', + 'person_remove_alt_1', + 'person_search', + 'personal_injury', + 'personal_video', + 'pest_control', + 'pest_control_rodent', + 'pets', + 'phone', + 'phone_android', + 'phone_bluetooth_speaker', + 'phone_callback', + 'phone_disabled', + 'phone_enabled', + 'phone_forwarded', + 'phone_in_talk', + 'phone_iphone', + 'phone_locked', + 'phone_missed', + 'phone_paused', + 'phonelink', + 'phonelink_erase', + 'phonelink_lock', + 'phonelink_off', + 'phonelink_ring', + 'phonelink_setup', + 'photo', + 'photo_album', + 'photo_camera', + 'photo_camera_back', + 'photo_camera_front', + 'photo_filter', + 'photo_library', + 'photo_size_select_actual', + 'photo_size_select_large', + 'photo_size_select_small', + 'piano', + 'piano_off', + 'picture_as_pdf', + 'picture_in_picture', + 'picture_in_picture_alt', + 'pie_chart', + 'pie_chart_outline', + 'pin', + 'pin_drop', + 'pivot_table_chart', + 'place', + 'plagiarism', + 'play_arrow', + 'play_circle', + 'play_circle_filled', + 'play_circle_outline', + 'play_disabled', + 'play_for_work', + 'play_lesson', + 'playlist_add', + 'playlist_add_check', + 'playlist_play', + 'plumbing', + 'plus_one', + 'podcasts', + 'point_of_sale', + 'policy', + 'poll', + 'polymer', + 'pool', + 'portable_wifi_off', + 'portrait', + 'post_add', + 'power', + 'power_input', + 'power_off', + 'power_settings_new', + 'precision_manufacturing', + 'pregnant_woman', + 'present_to_all', + 'preview', + 'price_change', + 'price_check', + 'print', + 'print_disabled', + 'priority_high', + 'privacy_tip', + 'private_connectivity', + 'production_quantity_limits', + 'psychology', + 'public', + 'public_off', + 'publish', + 'published_with_changes', + 'push_pin', + 'qr_code', + 'qr_code_2', + 'qr_code_scanner', + 'query_builder', + 'query_stats', + 'question_answer', + 'queue', + 'queue_music', + 'queue_play_next', + 'quickreply', + 'quiz', + 'r_mobiledata', + 'radar', + 'radio', + 'radio_button_checked', + 'radio_button_unchecked', + 'railway_alert', + 'ramen_dining', + 'rate_review', + 'raw_off', + 'raw_on', + 'read_more', + 'real_estate_agent', + 'receipt', + 'receipt_long', + 'recent_actors', + 'recommend', + 'record_voice_over', + 'redeem', + 'redo', + 'reduce_capacity', + 'refresh', + 'remember_me', + 'remove', + 'remove_circle', + 'remove_circle_outline', + 'remove_done', + 'remove_from_queue', + 'remove_moderator', + 'remove_red_eye', + 'remove_shopping_cart', + 'reorder', + 'repeat', + 'repeat_on', + 'repeat_one', + 'repeat_one_on', + 'replay', + 'replay_10', + 'replay_30', + 'replay_5', + 'replay_circle_filled', + 'reply', + 'reply_all', + 'report', + 'report_gmailerrorred', + 'report_off', + 'report_problem', + 'request_page', + 'request_quote', + 'reset_tv', + 'restart_alt', + 'restaurant', + 'restaurant_menu', + 'restore', + 'restore_from_trash', + 'restore_page', + 'reviews', + 'rice_bowl', + 'ring_volume', + 'roofing', + 'room', + 'room_preferences', + 'room_service', + 'rotate_90_degrees_ccw', + 'rotate_left', + 'rotate_right', + 'rounded_corner', + 'router', + 'rowing', + 'rss_feed', + 'rsvp', + 'rtt', + 'rule', + 'rule_folder', + 'run_circle', + 'running_with_errors', + 'rv_hookup', + 'safety_divider', + 'sailing', + 'sanitizer', + 'satellite', + 'save', + 'save_alt', + 'saved_search', + 'savings', + 'scanner', + 'scatter_plot', + 'schedule', + 'schedule_send', + 'schema', + 'school', + 'science', + 'score', + 'screen_lock_landscape', + 'screen_lock_portrait', + 'screen_lock_rotation', + 'screen_rotation', + 'screen_search_desktop', + 'screen_share', + 'screenshot', + 'sd', + 'sd_card', + 'sd_card_alert', + 'sd_storage', + 'search', + 'search_off', + 'security', + 'security_update', + 'security_update_good', + 'security_update_warning', + 'segment', + 'select_all', + 'self_improvement', + 'sell', + 'send', + 'send_and_archive', + 'send_to_mobile', + 'sensor_door', + 'sensor_window', + 'sensors', + 'sensors_off', + 'sentiment_dissatisfied', + 'sentiment_neutral', + 'sentiment_satisfied', + 'sentiment_satisfied_alt', + 'sentiment_very_dissatisfied', + 'sentiment_very_satisfied', + 'set_meal', + 'settings', + 'settings_accessibility', + 'settings_applications', + 'settings_backup_restore', + 'settings_bluetooth', + 'settings_brightness', + 'settings_cell', + 'settings_ethernet', + 'settings_input_antenna', + 'settings_input_component', + 'settings_input_composite', + 'settings_input_hdmi', + 'settings_input_svideo', + 'settings_overscan', + 'settings_phone', + 'settings_power', + 'settings_remote', + 'settings_suggest', + 'settings_system_daydream', + 'settings_voice', + 'share', + 'share_location', + 'shield', + 'shop', + 'shop_2', + 'shop_two', + 'shopping_bag', + 'shopping_basket', + 'shopping_cart', + 'short_text', + 'shortcut', + 'show_chart', + 'shower', + 'shuffle', + 'shuffle_on', + 'shutter_speed', + 'sick', + 'signal_cellular_0_bar', + 'signal_cellular_4_bar', + 'signal_cellular_alt', + 'signal_cellular_connected_no_internet_0_bar', + 'signal_cellular_connected_no_internet_4_bar', + 'signal_cellular_no_sim', + 'signal_cellular_nodata', + 'signal_cellular_null', + 'signal_cellular_off', + 'signal_wifi_0_bar', + 'signal_wifi_4_bar', + 'signal_wifi_4_bar_lock', + 'signal_wifi_bad', + 'signal_wifi_connected_no_internet_4', + 'signal_wifi_off', + 'signal_wifi_statusbar_4_bar', + 'signal_wifi_statusbar_connected_no_internet_4', + 'signal_wifi_statusbar_null', + 'sim_card', + 'sim_card_alert', + 'sim_card_download', + 'single_bed', + 'sip', + 'skateboarding', + 'skip_next', + 'skip_previous', + 'sledding', + 'slideshow', + 'slow_motion_video', + 'smart_button', + 'smart_display', + 'smart_screen', + 'smart_toy', + 'smartphone', + 'smoke_free', + 'smoking_rooms', + 'sms', + 'sms_failed', + 'snippet_folder', + 'snooze', + 'snowboarding', + 'snowmobile', + 'snowshoeing', + 'soap', + 'social_distance', + 'sort', + 'sort_by_alpha', + 'source', + 'south', + 'south_east', + 'south_west', + 'spa', + 'space_bar', + 'space_dashboard', + 'speaker', + 'speaker_group', + 'speaker_notes', + 'speaker_notes_off', + 'speaker_phone', + 'speed', + 'spellcheck', + 'splitscreen', + 'sports', + 'sports_bar', + 'sports_baseball', + 'sports_basketball', + 'sports_cricket', + 'sports_esports', + 'sports_football', + 'sports_golf', + 'sports_handball', + 'sports_hockey', + 'sports_kabaddi', + 'sports_mma', + 'sports_motorsports', + 'sports_rugby', + 'sports_score', + 'sports_soccer', + 'sports_tennis', + 'sports_volleyball', + 'square_foot', + 'stacked_bar_chart', + 'stacked_line_chart', + 'stairs', + 'star', + 'star_border', + 'star_border_purple500', + 'star_half', + 'star_outline', + 'star_purple500', + 'star_rate', + 'stars', + 'stay_current_landscape', + 'stay_current_portrait', + 'stay_primary_landscape', + 'stay_primary_portrait', + 'sticky_note_2', + 'stop', + 'stop_circle', + 'stop_screen_share', + 'storage', + 'store', + 'store_mall_directory', + 'storefront', + 'storm', + 'straighten', + 'stream', + 'streetview', + 'strikethrough_s', + 'stroller', + 'style', + 'subdirectory_arrow_left', + 'subdirectory_arrow_right', + 'subject', + 'subscript', + 'subscriptions', + 'subtitles', + 'subtitles_off', + 'subway', + 'summarize', + 'superscript', + 'supervised_user_circle', + 'supervisor_account', + 'support', + 'support_agent', + 'surfing', + 'surround_sound', + 'swap_calls', + 'swap_horiz', + 'swap_horizontal_circle', + 'swap_vert', + 'swap_vertical_circle', + 'swipe', + 'switch_account', + 'switch_camera', + 'switch_left', + 'switch_right', + 'switch_video', + 'sync', + 'sync_alt', + 'sync_disabled', + 'sync_problem', + 'system_security_update', + 'system_security_update_good', + 'system_security_update_warning', + 'system_update', + 'system_update_alt', + 'tab', + 'tab_unselected', + 'table_chart', + 'table_rows', + 'table_view', + 'tablet', + 'tablet_android', + 'tablet_mac', + 'tag', + 'tag_faces', + 'takeout_dining', + 'tap_and_play', + 'tapas', + 'task', + 'task_alt', + 'taxi_alert', + 'terrain', + 'text_fields', + 'text_format', + 'text_rotate_up', + 'text_rotate_vertical', + 'text_rotation_angledown', + 'text_rotation_angleup', + 'text_rotation_down', + 'text_rotation_none', + 'text_snippet', + 'textsms', + 'texture', + 'theater_comedy', + 'theaters', + 'thermostat', + 'thermostat_auto', + 'thumb_down', + 'thumb_down_alt', + 'thumb_down_off_alt', + 'thumb_up', + 'thumb_up_alt', + 'thumb_up_off_alt', + 'thumbs_up_down', + 'time_to_leave', + 'timelapse', + 'timeline', + 'timer', + 'timer_10', + 'timer_10_select', + 'timer_3', + 'timer_3_select', + 'timer_off', + 'title', + 'toc', + 'today', + 'toggle_off', + 'toggle_on', + 'toll', + 'tonality', + 'topic', + 'touch_app', + 'tour', + 'toys', + 'track_changes', + 'traffic', + 'train', + 'tram', + 'transfer_within_a_station', + 'transform', + 'transgender', + 'transit_enterexit', + 'translate', + 'travel_explore', + 'trending_down', + 'trending_flat', + 'trending_up', + 'trip_origin', + 'try', + 'tty', + 'tune', + 'tungsten', + 'turned_in', + 'turned_in_not', + 'tv', + 'tv_off', + 'two_wheeler', + 'umbrella', + 'unarchive', + 'undo', + 'unfold_less', + 'unfold_more', + 'unpublished', + 'unsubscribe', + 'upcoming', + 'update', + 'update_disabled', + 'upgrade', + 'upload', + 'upload_file', + 'usb', + 'usb_off', + 'verified', + 'verified_user', + 'vertical_align_bottom', + 'vertical_align_center', + 'vertical_align_top', + 'vertical_distribute', + 'vertical_split', + 'vibration', + 'video_call', + 'video_camera_back', + 'video_camera_front', + 'video_label', + 'video_library', + 'video_settings', + 'video_stable', + 'videocam', + 'videocam_off', + 'videogame_asset', + 'videogame_asset_off', + 'view_agenda', + 'view_array', + 'view_carousel', + 'view_column', + 'view_comfy', + 'view_compact', + 'view_day', + 'view_headline', + 'view_in_ar', + 'view_list', + 'view_module', + 'view_quilt', + 'view_sidebar', + 'view_stream', + 'view_week', + 'vignette', + 'villa', + 'visibility', + 'visibility_off', + 'voice_chat', + 'voice_over_off', + 'voicemail', + 'volume_down', + 'volume_mute', + 'volume_off', + 'volume_up', + 'volunteer_activism', + 'vpn_key', + 'vpn_lock', + 'vrpano', + 'wallpaper', + 'warning', + 'warning_amber', + 'wash', + 'watch', + 'watch_later', + 'water', + 'water_damage', + 'waterfall_chart', + 'waves', + 'wb_auto', + 'wb_cloudy', + 'wb_incandescent', + 'wb_iridescent', + 'wb_shade', + 'wb_sunny', + 'wb_twilight', + 'wc', + 'web', + 'web_asset', + 'web_asset_off', + 'weekend', + 'west', + 'whatshot', + 'wheelchair_pickup', + 'where_to_vote', + 'widgets', + 'wifi', + 'wifi_calling', + 'wifi_calling_3', + 'wifi_lock', + 'wifi_off', + 'wifi_protected_setup', + 'wifi_tethering', + 'wifi_tethering_error_rounded', + 'wifi_tethering_off', + 'window', + 'wine_bar', + 'work', + 'work_off', + 'work_outline', + 'workspaces', + 'wrap_text', + 'wrong_location', + 'wysiwyg', + 'yard', + 'youtube_searched_for', + 'zoom_in', + 'zoom_out', + 'zoom_out_map' +]; +export const iconsmind = [ + 'a_z', + 'aa', + 'add_bag', + 'add_basket', + 'add_cart', + 'add_file', + 'add_spaceafterparagraph', + 'add_spacebeforeparagraph', + 'add_user', + 'add_userstar', + 'add_window', + 'add', + 'address_book', + 'address_book2', + 'administrator', + 'aerobics_2', + 'aerobics_3', + 'aerobics', + 'affiliate', + 'aim', + 'air_balloon', + 'airbrush', + 'airship', + 'alarm_clock', + 'alarm_clock2', + 'alarm', + 'alien_2', + 'alien', + 'aligator', + 'align_center', + 'align_justifyall', + 'align_justifycenter', + 'align_justifyleft', + 'align_justifyright', + 'align_left', + 'align_right', + 'alpha', + 'ambulance', + 'amx', + 'anchor_2', + 'anchor', + 'android_store', + 'android', + 'angel_smiley', + 'angel', + 'angry', + 'apple_bite', + 'apple_store', + 'apple', + 'approved_window', + 'aquarius_2', + 'aquarius', + 'archery_2', + 'archery', + 'argentina', + 'aries_2', + 'aries', + 'army_key', + 'arrow_around', + 'arrow_back', + 'arrow_back2', + 'arrow_back3', + 'arrow_barrier', + 'arrow_circle', + 'arrow_cross', + 'arrow_down', + 'arrow_down2', + 'arrow_down3', + 'arrow_downincircle', + 'arrow_fork', + 'arrow_forward', + 'arrow_forward2', + 'arrow_from', + 'arrow_inside', + 'arrow_inside45', + 'arrow_insidegap', + 'arrow_insidegap45', + 'arrow_into', + 'arrow_join', + 'arrow_junction', + 'arrow_left', + 'arrow_left2', + 'arrow_leftincircle', + 'arrow_loop', + 'arrow_merge', + 'arrow_mix', + 'arrow_next', + 'arrow_outleft', + 'arrow_outright', + 'arrow_outside', + 'arrow_outside45', + 'arrow_outsidegap', + 'arrow_outsidegap45', + 'arrow_over', + 'arrow_refresh', + 'arrow_refresh2', + 'arrow_right', + 'arrow_right2', + 'arrow_rightincircle', + 'arrow_shuffle', + 'arrow_squiggly', + 'arrow_through', + 'arrow_to', + 'arrow_turnleft', + 'arrow_turnright', + 'arrow_up', + 'arrow_up2', + 'arrow_up3', + 'arrow_upincircle', + 'arrow_xleft', + 'arrow_xright', + 'ask', + 'assistant', + 'astronaut', + 'at_sign', + 'atm', + 'atom', + 'audio', + 'auto_flash', + 'autumn', + 'baby_clothes', + 'baby_clothes2', + 'baby_cry', + 'baby', + 'back_media', + 'back_music', + 'back', + 'back2', + 'background', + 'bacteria', + 'bag_coins', + 'bag_items', + 'bag_quantity', + 'bag', + 'bakelite', + 'ballet_shoes', + 'balloon', + 'banana', + 'band_aid', + 'bank', + 'bar_chart', + 'bar_chart2', + 'bar_chart3', + 'bar_chart4', + 'bar_chart5', + 'bar_code', + 'barricade_2', + 'barricade', + 'baseball', + 'basket_ball', + 'basket_coins', + 'basket_items', + 'basket_quantity', + 'bat_2', + 'bat', + 'bathrobe', + 'batman_mask', + 'battery_0', + 'battery_25', + 'battery_50', + 'battery_75', + 'battery_100', + 'battery_charge', + 'bear', + 'beard_2', + 'beard_3', + 'beard', + 'bebo', + 'bee', + 'beer_glass', + 'beer', + 'bell_2', + 'bell', + 'belt_2', + 'belt_3', + 'belt', + 'berlin_tower', + 'beta', + 'betvibes', + 'bicycle_2', + 'bicycle_3', + 'bicycle', + 'big_bang', + 'big_data', + 'bike_helmet', + 'bikini', + 'bilk_bottle2', + 'billing', + 'bing', + 'binocular', + 'bio_hazard', + 'biotech', + 'bird_deliveringletter', + 'bird', + 'birthday_cake', + 'bisexual', + 'bishop', + 'bitcoin', + 'black_cat', + 'blackboard', + 'blinklist', + 'block_cloud', + 'block_window', + 'blogger', + 'blood', + 'blouse', + 'blueprint', + 'board', + 'bodybuilding', + 'bold_text', + 'bone', + 'bones', + 'book', + 'bookmark', + 'books_2', + 'books', + 'boom', + 'boot_2', + 'boot', + 'bottom_totop', + 'bow_2', + 'bow_3', + 'bow_4', + 'bow_5', + 'bow_6', + 'bow', + 'bowling_2', + 'bowling', + 'box_close', + 'box_full', + 'box_open', + 'box_withfolders', + 'box', + 'box2', + 'boy', + 'bra', + 'brain_2', + 'brain_3', + 'brain', + 'brazil', + 'bread_2', + 'bread', + 'bridge', + 'brightkite', + 'broke_link2', + 'broken_link', + 'broom', + 'brush', + 'bucket', + 'bug', + 'building', + 'bulleted_list', + 'bus_2', + 'bus', + 'business_man', + 'business_manwoman', + 'business_mens', + 'business_woman', + 'butterfly', + 'button', + 'cable_car', + 'cake', + 'calculator_2', + 'calculator_3', + 'calculator', + 'calendar_2', + 'calendar_3', + 'calendar_4', + 'calendar_clock', + 'calendar', + 'camel', + 'camera_2', + 'camera_3', + 'camera_4', + 'camera_5', + 'camera_back', + 'camera', + 'can_2', + 'can', + 'canada', + 'cancer_2', + 'cancer_3', + 'cancer', + 'candle', + 'candy_cane', + 'candy', + 'cannon', + 'cap_2', + 'cap_3', + 'cap_smiley', + 'cap', + 'capricorn_2', + 'capricorn', + 'car_2', + 'car_3', + 'car_coins', + 'car_items', + 'car_wheel', + 'car', + 'cardigan', + 'cardiovascular', + 'cart_quantity', + 'casette_tape', + 'cash_register', + 'cash_register2', + 'castle', + 'cat', + 'cathedral', + 'cauldron', + 'cd_2', + 'cd_cover', + 'cd', + 'cello', + 'celsius', + 'chacked_flag', + 'chair', + 'charger', + 'check_2', + 'check', + 'checked_user', + 'checkmate', + 'checkout_bag', + 'checkout_basket', + 'checkout', + 'cheese', + 'cheetah', + 'chef_hat', + 'chef_hat2', + 'chef', + 'chemical_2', + 'chemical_3', + 'chemical_4', + 'chemical_5', + 'chemical', + 'chess_board', + 'chess', + 'chicken', + 'chile', + 'chimney', + 'china', + 'chinese_temple', + 'chip', + 'chopsticks_2', + 'chopsticks', + 'christmas_ball', + 'christmas_bell', + 'christmas_candle', + 'christmas_hat', + 'christmas_sleigh', + 'christmas_snowman', + 'christmas_sock', + 'christmas_tree', + 'christmas', + 'chrome', + 'chrysler_building', + 'cinema', + 'circular_point', + 'city_hall', + 'clamp', + 'clapperboard_close', + 'clapperboard_open', + 'claps', + 'clef', + 'clinic', + 'clock_2', + 'clock_3', + 'clock_4', + 'clock_back', + 'clock_forward', + 'clock', + 'close_window', + 'close', + 'clothing_store', + 'cloud_', + 'cloud_camera', + 'cloud_computer', + 'cloud_email', + 'cloud_hail', + 'cloud_laptop', + 'cloud_lock', + 'cloud_minus', + 'cloud_moon', + 'cloud_music', + 'cloud_picture', + 'cloud_rain', + 'cloud_remove', + 'cloud_secure', + 'cloud_settings', + 'cloud_smartphone', + 'cloud_snow', + 'cloud_sun', + 'cloud_tablet', + 'cloud_video', + 'cloud_weather', + 'cloud', + 'clouds_weather', + 'clouds', + 'clown', + 'cmyk', + 'coat', + 'cocktail', + 'coconut', + 'code_window', + 'coding', + 'coffee_2', + 'coffee_bean', + 'coffee_machine', + 'coffee_togo', + 'coffee', + 'coffin', + 'coin', + 'coins_2', + 'coins_3', + 'coins', + 'colombia', + 'colosseum', + 'column_2', + 'column_3', + 'column', + 'comb_2', + 'comb', + 'communication_tower', + 'communication_tower2', + 'compass_2', + 'compass_3', + 'compass_4', + 'compass_rose', + 'compass', + 'computer_2', + 'computer_3', + 'computer_secure', + 'computer', + 'conference', + 'confused', + 'conservation', + 'consulting', + 'contrast', + 'control_2', + 'control', + 'cookie_man', + 'cookies', + 'cool_guy', + 'cool', + 'copyright', + 'costume', + 'couple_sign', + 'cow', + 'cpu', + 'crane', + 'cranium', + 'credit_card', + 'credit_card2', + 'credit_card3', + 'cricket', + 'criminal', + 'croissant', + 'crop_2', + 'crop_3', + 'crown_2', + 'crown', + 'crying', + 'cube_molecule', + 'cube_molecule2', + 'cupcake', + 'cursor_click', + 'cursor_click2', + 'cursor_move', + 'cursor_move2', + 'cursor_select', + 'cursor', + 'd_eyeglasses', + 'd_eyeglasses2', + 'dam', + 'danemark', + 'danger_2', + 'danger', + 'dashboard', + 'data_backup', + 'data_block', + 'data_center', + 'data_clock', + 'data_cloud', + 'data_compress', + 'data_copy', + 'data_download', + 'data_financial', + 'data_key', + 'data_lock', + 'data_network', + 'data_password', + 'data_power', + 'data_refresh', + 'data_save', + 'data_search', + 'data_security', + 'data_settings', + 'data_sharing', + 'data_shield', + 'data_signal', + 'data_storage', + 'data_stream', + 'data_transfer', + 'data_unlock', + 'data_upload', + 'data_yes', + 'data', + 'david_star', + 'daylight', + 'death', + 'debian', + 'dec', + 'decrase_inedit', + 'deer_2', + 'deer', + 'delete_file', + 'delete_window', + 'delicious', + 'depression', + 'deviantart', + 'device_syncwithcloud', + 'diamond', + 'dice_2', + 'dice', + 'digg', + 'digital_drawing', + 'diigo', + 'dinosaur', + 'diploma_2', + 'diploma', + 'direction_east', + 'direction_north', + 'direction_south', + 'direction_west', + 'director', + 'disk', + 'dj', + 'dna_2', + 'dna_helix', + 'dna', + 'doctor', + 'dog', + 'dollar_sign', + 'dollar_sign2', + 'dollar', + 'dolphin', + 'domino', + 'door_hanger', + 'door', + 'doplr', + 'double_circle', + 'double_tap', + 'doughnut', + 'dove', + 'down_2', + 'down_3', + 'down_4', + 'down', + 'download_2', + 'download_fromcloud', + 'download_window', + 'download', + 'downward', + 'drag_down', + 'drag_left', + 'drag_right', + 'drag_up', + 'drag', + 'dress', + 'drill_2', + 'drill', + 'drop', + 'dropbox', + 'drum', + 'dry', + 'duck', + 'dumbbell', + 'duplicate_layer', + 'duplicate_window', + 'dvd', + 'eagle', + 'ear', + 'earphones_2', + 'earphones', + 'eci_icon', + 'edit_map', + 'edit', + 'eggs', + 'egypt', + 'eifel_tower', + 'eject_2', + 'eject', + 'el_castillo', + 'elbow', + 'electric_guitar', + 'electricity', + 'elephant', + 'email', + 'embassy', + 'empire_statebuilding', + 'empty_box', + 'end_2', + 'end', + 'end2', + 'endways', + 'engineering', + 'envelope_2', + 'envelope', + 'environmental_2', + 'environmental_3', + 'environmental', + 'equalizer', + 'eraser_2', + 'eraser_3', + 'eraser', + 'error_404window', + 'euro_sign', + 'euro_sign2', + 'euro', + 'evernote', + 'evil', + 'explode', + 'eye_2', + 'eye_blind', + 'eye_invisible', + 'eye_scan', + 'eye_visible', + 'eye', + 'eyebrow_2', + 'eyebrow_3', + 'eyebrow', + 'eyeglasses_smiley', + 'eyeglasses_smiley2', + 'face_style', + 'face_style2', + 'face_style3', + 'face_style4', + 'face_style5', + 'face_style6', + 'facebook_2', + 'facebook', + 'factory_2', + 'factory', + 'fahrenheit', + 'family_sign', + 'fan', + 'farmer', + 'fashion', + 'favorite_window', + 'fax', + 'feather', + 'feedburner', + 'female_2', + 'female_sign', + 'female', + 'file_block', + 'file_bookmark', + 'file_chart', + 'file_clipboard', + 'file_clipboardfiletext', + 'file_clipboardtextimage', + 'file_cloud', + 'file_copy', + 'file_copy2', + 'file_csv', + 'file_download', + 'file_edit', + 'file_excel', + 'file_favorite', + 'file_fire', + 'file_graph', + 'file_hide', + 'file_horizontal', + 'file_horizontaltext', + 'file_html', + 'file_jpg', + 'file_link', + 'file_loading', + 'file_lock', + 'file_love', + 'file_music', + 'file_network', + 'file_pictures', + 'file_pie', + 'file_presentation', + 'file_refresh', + 'file_search', + 'file_settings', + 'file_share', + 'file_textimage', + 'file_trash', + 'file_txt', + 'file_upload', + 'file_video', + 'file_word', + 'file_zip', + 'file', + 'files', + 'film_board', + 'film_cartridge', + 'film_strip', + 'film_video', + 'film', + 'filter_2', + 'filter', + 'financial', + 'find_user', + 'finger_dragfoursides', + 'finger_dragtwosides', + 'finger_print', + 'finger', + 'fingerprint_2', + 'fingerprint', + 'fire_flame', + 'fire_flame2', + 'fire_hydrant', + 'fire_staion', + 'firefox', + 'firewall', + 'first_aid', + 'first', + 'fish_food', + 'fish', + 'fit_to', + 'fit_to2', + 'five_fingers', + 'five_fingersdrag', + 'five_fingersdrag2', + 'five_fingerstouch', + 'flag_2', + 'flag_3', + 'flag_4', + 'flag_5', + 'flag_6', + 'flag', + 'flamingo', + 'flash_2', + 'flash_video', + 'flash', + 'flashlight', + 'flask_2', + 'flask', + 'flick', + 'flickr', + 'flowerpot', + 'fluorescent', + 'fog_day', + 'fog_night', + 'folder_add', + 'folder_archive', + 'folder_binder', + 'folder_binder2', + 'folder_block', + 'folder_bookmark', + 'folder_close', + 'folder_cloud', + 'folder_delete', + 'folder_download', + 'folder_edit', + 'folder_favorite', + 'folder_fire', + 'folder_hide', + 'folder_link', + 'folder_loading', + 'folder_lock', + 'folder_love', + 'folder_music', + 'folder_network', + 'folder_open', + 'folder_open2', + 'folder_organizing', + 'folder_pictures', + 'folder_refresh', + 'folder_remove', + 'folder_search', + 'folder_settings', + 'folder_share', + 'folder_trash', + 'folder_upload', + 'folder_video', + 'folder_withdocument', + 'folder_zip', + 'folder', + 'folders', + 'font_color', + 'font_name', + 'font_size', + 'font_style', + 'font_stylesubscript', + 'font_stylesuperscript', + 'font_window', + 'foot_2', + 'foot', + 'football_2', + 'football', + 'footprint_2', + 'footprint_3', + 'footprint', + 'forest', + 'fork', + 'formspring', + 'formula', + 'forsquare', + 'forward', + 'fountain_pen', + 'four_fingers', + 'four_fingersdrag', + 'four_fingersdrag2', + 'four_fingerstouch', + 'fox', + 'frankenstein', + 'french_fries', + 'friendfeed', + 'friendster', + 'frog', + 'fruits', + 'fuel', + 'full_bag', + 'full_basket', + 'full_cart', + 'full_moon', + 'full_screen', + 'full_screen2', + 'full_view', + 'full_view2', + 'full_viewwindow', + 'function', + 'funky', + 'funny_bicycle', + 'furl', + 'gamepad_2', + 'gamepad', + 'gas_pump', + 'gaugage_2', + 'gaugage', + 'gay', + 'gear_2', + 'gear', + 'gears_2', + 'gears', + 'geek_2', + 'geek', + 'gemini_2', + 'gemini', + 'genius', + 'gentleman', + 'geo_', + 'geo_close', + 'geo_love', + 'geo_minus', + 'geo_number', + 'geo_star', + 'geo', + 'geo2_', + 'geo2_close', + 'geo2_love', + 'geo2_minus', + 'geo2_number', + 'geo2_star', + 'geo2', + 'geo3_', + 'geo3_close', + 'geo3_love', + 'geo3_minus', + 'geo3_number', + 'geo3_star', + 'geo3', + 'gey', + 'gift_box', + 'giraffe', + 'girl', + 'glass_water', + 'glasses_2', + 'glasses_3', + 'glasses', + 'global_position', + 'globe_2', + 'globe', + 'gloves', + 'go_bottom', + 'go_top', + 'goggles', + 'golf_2', + 'golf', + 'google_buzz', + 'google_drive', + 'google_play', + 'google_plus', + 'google', + 'gopro', + 'gorilla', + 'gowalla', + 'grave', + 'graveyard', + 'greece', + 'green_energy', + 'green_house', + 'guitar', + 'gun_2', + 'gun_3', + 'gun', + 'gymnastics', + 'hair_2', + 'hair_3', + 'hair_4', + 'hair', + 'half_moon', + 'halloween_halfmoon', + 'halloween_moon', + 'hamburger', + 'hammer', + 'hand_touch', + 'hand_touch2', + 'hand_touchsmartphone', + 'hand', + 'hands', + 'handshake', + 'hanger', + 'happy', + 'hat_2', + 'hat', + 'haunted_house', + 'hd_video', + 'hd', + 'hdd', + 'headphone', + 'headphones', + 'headset', + 'heart_2', + 'heart', + 'heels_2', + 'heels', + 'height_window', + 'helicopter_2', + 'helicopter', + 'helix_2', + 'hello', + 'helmet_2', + 'helmet_3', + 'helmet', + 'hipo', + 'hipster_glasses', + 'hipster_glasses2', + 'hipster_glasses3', + 'hipster_headphones', + 'hipster_men', + 'hipster_men2', + 'hipster_men3', + 'hipster_sunglasses', + 'hipster_sunglasses2', + 'hipster_sunglasses3', + 'hokey', + 'holly', + 'home_2', + 'home_3', + 'home_4', + 'home_5', + 'home_window', + 'home', + 'homosexual', + 'honey', + 'hong_kong', + 'hoodie', + 'horror', + 'horse', + 'hospital_2', + 'hospital', + 'host', + 'hot_dog', + 'hotel', + 'hour', + 'hub', + 'humor', + 'hurt', + 'ice_cream', + 'icq', + 'id_2', + 'id_3', + 'id_card', + 'idea_2', + 'idea_3', + 'idea_4', + 'idea_5', + 'idea', + 'identification_badge', + 'imdb', + 'inbox_empty', + 'inbox_forward', + 'inbox_full', + 'inbox_into', + 'inbox_out', + 'inbox_reply', + 'inbox', + 'increase_inedit', + 'indent_firstline', + 'indent_leftmargin', + 'indent_rightmargin', + 'india', + 'info_window', + 'information', + 'inifity', + 'instagram', + 'internet_2', + 'internet_explorer', + 'internet_smiley', + 'internet', + 'ios_apple', + 'israel', + 'italic_text', + 'jacket_2', + 'jacket', + 'jamaica', + 'japan', + 'japanese_gate', + 'jeans', + 'jeep_2', + 'jeep', + 'jet', + 'joystick', + 'juice', + 'jump_rope', + 'kangoroo', + 'kenya', + 'key_2', + 'key_3', + 'key_lock', + 'key', + 'keyboard', + 'keyboard3', + 'keypad', + 'king_2', + 'king', + 'kiss', + 'knee', + 'knife_2', + 'knife', + 'knight', + 'koala', + 'korea', + 'lamp', + 'landscape_2', + 'landscape', + 'lantern', + 'laptop_2', + 'laptop_3', + 'laptop_phone', + 'laptop_secure', + 'laptop_tablet', + 'laptop', + 'laser', + 'last_fm', + 'last', + 'laughing', + 'layer_1635', + 'layer_1646', + 'layer_backward', + 'layer_forward', + 'leafs_2', + 'leafs', + 'leaning_tower', + 'left__right', + 'left__right3', + 'left_2', + 'left_3', + 'left_4', + 'left_toright', + 'left', + 'leg_2', + 'leg', + 'lego', + 'lemon', + 'len_2', + 'len_3', + 'len', + 'leo_2', + 'leo', + 'leopard', + 'lesbian', + 'lesbians', + 'letter_close', + 'letter_open', + 'letter_sent', + 'libra_2', + 'libra', + 'library_2', + 'library', + 'life_jacket', + 'life_safer', + 'light_bulb', + 'light_bulb2', + 'light_bulbleaf', + 'lighthouse', + 'like_2', + 'like', + 'line_chart', + 'line_chart2', + 'line_chart3', + 'line_chart4', + 'line_spacing', + 'line_spacingtext', + 'link_2', + 'link', + 'linkedin_2', + 'linkedin', + 'linux', + 'lion', + 'livejournal', + 'loading_2', + 'loading_3', + 'loading_window', + 'loading', + 'location_2', + 'location', + 'lock_2', + 'lock_3', + 'lock_user', + 'lock_window', + 'lock', + 'lollipop_2', + 'lollipop_3', + 'lollipop', + 'loop', + 'loud', + 'loudspeaker', + 'love_2', + 'love_user', + 'love_window', + 'love', + 'lowercase_text', + 'luggafe_front', + 'luggage_2', + 'macro', + 'magic_wand', + 'magnet', + 'magnifi_glass_minus', + 'magnifi_glass', + 'magnifi_glass2', + 'mail_2', + 'mail_3', + 'mail_add', + 'mail_attachement', + 'mail_block', + 'mail_delete', + 'mail_favorite', + 'mail_forward', + 'mail_gallery', + 'mail_inbox', + 'mail_link', + 'mail_lock', + 'mail_love', + 'mail_money', + 'mail_open', + 'mail_outbox', + 'mail_password', + 'mail_photo', + 'mail_read', + 'mail_removex', + 'mail_reply', + 'mail_replyall', + 'mail_search', + 'mail_send', + 'mail_settings', + 'mail_unread', + 'mail_video', + 'mail_withatsign', + 'mail_withcursors', + 'mail', + 'mailbox_empty', + 'mailbox_full', + 'male_2', + 'male_sign', + 'male', + 'malefemale', + 'man_sign', + 'management', + 'mans_underwear', + 'mans_underwear2', + 'map_marker', + 'map_marker2', + 'map_marker3', + 'map', + 'map2', + 'marker_2', + 'marker_3', + 'marker', + 'martini_glass', + 'mask', + 'master_card', + 'maximize_window', + 'maximize', + 'medal_2', + 'medal_3', + 'medal', + 'medical_sign', + 'medicine_2', + 'medicine_3', + 'medicine', + 'megaphone', + 'memory_card', + 'memory_card2', + 'memory_card3', + 'men', + 'menorah', + 'mens', + 'metacafe', + 'mexico', + 'mic', + 'microphone_2', + 'microphone_3', + 'microphone_4', + 'microphone_5', + 'microphone_6', + 'microphone_7', + 'microphone', + 'microscope', + 'milk_bottle', + 'mine', + 'minimize_maximize_close_window', + 'minimize_window', + 'minimize', + 'mirror', + 'mixer', + 'mixx', + 'money_2', + 'money_bag', + 'money_smiley', + 'money', + 'monitor_2', + 'monitor_3', + 'monitor_4', + 'monitor_5', + 'monitor_analytics', + 'monitor_laptop', + 'monitor_phone', + 'monitor_tablet', + 'monitor_vertical', + 'monitor', + 'monitoring', + 'monkey', + 'monster', + 'morocco', + 'motorcycle', + 'mouse_2', + 'mouse_3', + 'mouse_4', + 'mouse_pointer', + 'mouse', + 'moustache_smiley', + 'movie_ticket', + 'movie', + 'mp3_file', + 'museum', + 'mushroom', + 'music_note', + 'music_note2', + 'music_note3', + 'music_note4', + 'music_player', + 'mustache_2', + 'mustache_3', + 'mustache_4', + 'mustache_5', + 'mustache_6', + 'mustache_7', + 'mustache_8', + 'mustache', + 'mute', + 'myspace', + 'navigat_start', + 'navigate_end', + 'navigation_leftwindow', + 'navigation_rightwindow', + 'nepal', + 'netscape', + 'network_window', + 'network', + 'neutron', + 'new_mail', + 'new_tab', + 'newspaper_2', + 'newspaper', + 'newsvine', + 'next_3', + 'next_music', + 'next', + 'next2', + 'no_battery', + 'no_drop', + 'no_flash', + 'no_smoking', + 'noose', + 'normal_text', + 'note', + 'notepad_2', + 'notepad', + 'nuclear', + 'numbering_list', + 'nurse', + 'office_lamp', + 'office', + 'oil', + 'old_camera', + 'old_cassette', + 'old_clock', + 'old_radio', + 'old_sticky', + 'old_sticky2', + 'old_telephone', + 'old_tv', + 'on_air', + 'on_off_2', + 'on_off_3', + 'on_off', + 'one_finger', + 'one_fingertouch', + 'one_window', + 'open_banana', + 'open_book', + 'opera_house', + 'opera', + 'optimization', + 'orientation_2', + 'orientation_3', + 'orientation', + 'orkut', + 'ornament', + 'over_time', + 'over_time2', + 'owl', + 'pac_man', + 'paint_brush', + 'paint_bucket', + 'paintbrush', + 'palette', + 'palm_tree', + 'panda', + 'panorama', + 'pantheon', + 'pantone', + 'pants', + 'paper_plane', + 'paper', + 'parasailing', + 'parrot', + 'password_2shopping', + 'password_field', + 'password_shopping', + 'password', + 'pause_2', + 'pause', + 'paw', + 'pawn', + 'paypal', + 'pen_2', + 'pen_3', + 'pen_4', + 'pen_5', + 'pen_6', + 'pen', + 'pencil_ruler', + 'pencil', + 'penguin', + 'pentagon', + 'people_oncloud', + 'pepper_withfire', + 'pepper', + 'petrol', + 'petronas_tower', + 'philipines', + 'phone_2', + 'phone_3', + 'phone_3g', + 'phone_4g', + 'phone_simcard', + 'phone_sms', + 'phone_wifi', + 'phone', + 'photo_2', + 'photo_3', + 'photo_album', + 'photo_album2', + 'photo_album3', + 'photo', + 'photos', + 'physics', + 'pi', + 'piano', + 'picasa', + 'pie_chart', + 'pie_chart2', + 'pie_chart3', + 'pilates_2', + 'pilates_3', + 'pilates', + 'pilot', + 'pinch', + 'ping_pong', + 'pinterest', + 'pipe', + 'pipette', + 'piramids', + 'pisces_2', + 'pisces', + 'pizza_slice', + 'pizza', + 'plane_2', + 'plane', + 'plant', + 'plasmid', + 'plaster', + 'plastic_cupphone', + 'plastic_cupphone2', + 'plate', + 'plates', + 'plaxo', + 'play_music', + 'plug_in', + 'plug_in2', + 'plurk', + 'pointer', + 'poland', + 'police_man', + 'police_station', + 'police_woman', + 'police', + 'polo_shirt', + 'portrait', + 'portugal', + 'post_mail', + 'post_mail2', + 'post_office', + 'post_sign', + 'post_sign2ways', + 'posterous', + 'pound_sign', + 'pound_sign2', + 'pound', + 'power_2', + 'power_3', + 'power_cable', + 'power_station', + 'power', + 'prater', + 'present', + 'presents', + 'press', + 'preview', + 'previous', + 'pricing', + 'printer', + 'professor', + 'profile', + 'project', + 'projector_2', + 'projector', + 'pulse', + 'pumpkin', + 'punk', + 'punker', + 'puzzle', + 'qik', + 'qr_code', + 'queen_2', + 'queen', + 'quill_2', + 'quill_3', + 'quill', + 'quotes_2', + 'quotes', + 'radio', + 'radioactive', + 'rafting', + 'rain_drop', + 'rainbow_2', + 'rainbow', + 'ram', + 'razzor_blade', + 'receipt_2', + 'receipt_3', + 'receipt_4', + 'receipt', + 'record_3', + 'record_music', + 'record', + 'record2', + 'recycling_2', + 'recycling', + 'reddit', + 'redhat', + 'redirect', + 'redo', + 'reel', + 'refinery', + 'refresh_window', + 'refresh', + 'reload_2', + 'reload_3', + 'reload', + 'remote_controll', + 'remote_controll2', + 'remove_bag', + 'remove_basket', + 'remove_cart', + 'remove_file', + 'remove_user', + 'remove_window', + 'remove', + 'rename', + 'repair', + 'repeat_2', + 'repeat_3', + 'repeat_4', + 'repeat_5', + 'repeat_6', + 'repeat_7', + 'repeat', + 'reset', + 'resize', + 'restore_window', + 'retouching', + 'retro_camera', + 'retro', + 'retweet', + 'reverbnation', + 'rewind', + 'rgb', + 'ribbon_2', + 'ribbon_3', + 'ribbon', + 'right_2', + 'right_3', + 'right_4', + 'right_toleft', + 'right', + 'road_2', + 'road_3', + 'road', + 'robot_2', + 'robot', + 'rock_androll', + 'rocket', + 'roller', + 'roof', + 'rook', + 'rotate_gesture', + 'rotate_gesture2', + 'rotate_gesture3', + 'rotation_390', + 'rotation', + 'router_2', + 'router', + 'rss', + 'ruler_2', + 'ruler', + 'running_shoes', + 'running', + 'safari', + 'safe_box', + 'safe_box2', + 'safety_pinclose', + 'safety_pinopen', + 'sagittarus_2', + 'sagittarus', + 'sailing_ship', + 'sand_watch', + 'sand_watch2', + 'santa_claus', + 'santa_claus2', + 'santa_onsled', + 'satelite_2', + 'satelite', + 'save_window', + 'save', + 'saw', + 'saxophone', + 'scale', + 'scarf', + 'scissor', + 'scooter_front', + 'scooter', + 'scorpio_2', + 'scorpio', + 'scotland', + 'screwdriver', + 'scroll_fast', + 'scroll', + 'scroller_2', + 'scroller', + 'sea_dog', + 'search_oncloud', + 'search_people', + 'secound', + 'secound2', + 'security_block', + 'security_bug', + 'security_camera', + 'security_check', + 'security_settings', + 'security_smiley', + 'securiy_remove', + 'seed', + 'selfie', + 'serbia', + 'server_2', + 'server', + 'servers', + 'settings_window', + 'sewing_machine', + 'sexual', + 'share_oncloud', + 'share_window', + 'share', + 'sharethis', + 'shark', + 'sheep', + 'sheriff_badge', + 'shield', + 'ship_2', + 'ship', + 'shirt', + 'shoes_2', + 'shoes_3', + 'shoes', + 'shop_2', + 'shop_3', + 'shop_4', + 'shop', + 'shopping_bag', + 'shopping_basket', + 'shopping_cart', + 'short_pants', + 'shoutwire', + 'shovel', + 'shuffle_2', + 'shuffle_3', + 'shuffle_4', + 'shuffle', + 'shutter', + 'sidebar_window', + 'signal', + 'singapore', + 'skate_shoes', + 'skateboard_2', + 'skateboard', + 'skeleton', + 'ski', + 'skirt', + 'skrill', + 'skull', + 'skydiving', + 'skype', + 'sled_withgifts', + 'sled', + 'sleeping', + 'sleet', + 'slippers', + 'smart', + 'smartphone_2', + 'smartphone_3', + 'smartphone_4', + 'smartphone_secure', + 'smartphone', + 'smile', + 'smoking_area', + 'smoking_pipe', + 'snake', + 'snorkel', + 'snow_2', + 'snow_dome', + 'snow_storm', + 'snow', + 'snowflake_2', + 'snowflake_3', + 'snowflake_4', + 'snowflake', + 'snowman', + 'soccer_ball', + 'soccer_shoes', + 'socks', + 'solar', + 'sound_wave', + 'sound', + 'soundcloud', + 'soup', + 'south_africa', + 'space_needle', + 'spain', + 'spam_mail', + 'speach_bubble', + 'speach_bubble2', + 'speach_bubble3', + 'speach_bubble4', + 'speach_bubble5', + 'speach_bubble6', + 'speach_bubble7', + 'speach_bubble8', + 'speach_bubble9', + 'speach_bubble10', + 'speach_bubble11', + 'speach_bubble12', + 'speach_bubble13', + 'speach_bubbleasking', + 'speach_bubblecomic', + 'speach_bubblecomic2', + 'speach_bubblecomic3', + 'speach_bubblecomic4', + 'speach_bubbledialog', + 'speach_bubbles', + 'speak_2', + 'speak', + 'speaker_2', + 'speaker', + 'spell_check', + 'spell_checkabc', + 'spermium', + 'spider', + 'spiderweb', + 'split_foursquarewindow', + 'split_horizontal', + 'split_horizontal2window', + 'split_vertical', + 'split_vertical2', + 'split_window', + 'spoder', + 'spoon', + 'sport_mode', + 'sports_clothings1', + 'sports_clothings2', + 'sports_shirt', + 'spot', + 'spray', + 'spread', + 'spring', + 'spurl', + 'spy', + 'squirrel', + 'ssl', + 'st_basilscathedral', + 'st_paulscathedral', + 'stamp_2', + 'stamp', + 'stapler', + 'star_track', + 'star', + 'starfish', + 'start_3', + 'start_ways', + 'start', + 'start2', + 'statistic', + 'stethoscope', + 'stop__2', + 'stop_music', + 'stop', + 'stopwatch_2', + 'stopwatch', + 'storm', + 'street_view', + 'street_view2', + 'strikethrough_text', + 'stroller', + 'structure', + 'student_female', + 'student_hat', + 'student_hat2', + 'student_male', + 'student_malefemale', + 'students', + 'studio_flash', + 'studio_lightbox', + 'stumbleupon', + 'suit', + 'suitcase', + 'sum_2', + 'sum', + 'summer', + 'sun_cloudyrain', + 'sun', + 'sunglasses_2', + 'sunglasses_3', + 'sunglasses_smiley', + 'sunglasses_smiley2', + 'sunglasses_w', + 'sunglasses_w2', + 'sunglasses_w3', + 'sunglasses', + 'sunrise', + 'sunset', + 'superman', + 'support', + 'surprise', + 'sushi', + 'sweden', + 'swimming_short', + 'swimming', + 'swimmwear', + 'switch', + 'switzerland', + 'sync_cloud', + 'sync', + 'synchronize_2', + 'synchronize', + 't_shirt', + 'tablet_2', + 'tablet_3', + 'tablet_orientation', + 'tablet_phone', + 'tablet_secure', + 'tablet_vertical', + 'tablet', + 'tactic', + 'tag_2', + 'tag_3', + 'tag_4', + 'tag_5', + 'tag', + 'taj_mahal', + 'talk_man', + 'tap', + 'target_market', + 'target', + 'taurus_2', + 'taurus', + 'taxi_2', + 'taxi_sign', + 'taxi', + 'teacher', + 'teapot', + 'technorati', + 'teddy_bear', + 'tee_mug', + 'telephone_2', + 'telephone', + 'telescope', + 'temperature_2', + 'temperature_3', + 'temperature', + 'temple', + 'tennis_ball', + 'tennis', + 'tent', + 'test_tube', + 'test_tube2', + 'testimonal', + 'text_box', + 'text_effect', + 'text_highlightcolor', + 'text_paragraph', + 'thailand', + 'the_whitehouse', + 'this_sideup', + 'thread', + 'three_arrowfork', + 'three_fingers', + 'three_fingersdrag', + 'three_fingersdrag2', + 'three_fingerstouch', + 'thumb', + 'thumbs_downsmiley', + 'thumbs_upsmiley', + 'thunder', + 'thunderstorm', + 'ticket', + 'tie_2', + 'tie_3', + 'tie_4', + 'tie', + 'tiger', + 'time_backup', + 'time_bomb', + 'time_clock', + 'time_fire', + 'time_machine', + 'time_window', + 'timer_2', + 'timer', + 'to_bottom', + 'to_bottom2', + 'to_left', + 'to_right', + 'to_top', + 'to_top2', + 'token_', + 'tomato', + 'tongue', + 'tooth_2', + 'tooth', + 'top_tobottom', + 'touch_window', + 'tourch', + 'tower_2', + 'tower_bridge', + 'tower', + 'trace', + 'tractor', + 'traffic_light', + 'traffic_light2', + 'train_2', + 'train', + 'tram', + 'transform_2', + 'transform_3', + 'transform_4', + 'transform', + 'trash_withmen', + 'tree_2', + 'tree_3', + 'tree_4', + 'tree_5', + 'tree', + 'trekking', + 'triangle_arrowdown', + 'triangle_arrowleft', + 'triangle_arrowright', + 'triangle_arrowup', + 'tripod_2', + 'tripod_andvideo', + 'tripod_withcamera', + 'tripod_withgopro', + 'trophy_2', + 'trophy', + 'truck', + 'trumpet', + 'tumblr', + 'turkey', + 'turn_down', + 'turn_down2', + 'turn_downfromleft', + 'turn_downfromright', + 'turn_left', + 'turn_left3', + 'turn_right', + 'turn_right3', + 'turn_up', + 'turn_up2', + 'turtle', + 'tuxedo', + 'tv', + 'twister', + 'twitter_2', + 'twitter', + 'two_fingers', + 'two_fingersdrag', + 'two_fingersdrag2', + 'two_fingersscroll', + 'two_fingerstouch', + 'two_windows', + 'type_pass', + 'ukraine', + 'umbrela', + 'umbrella_2', + 'umbrella_3', + 'under_linetext', + 'undo', + 'united_kingdom', + 'united_states', + 'university_2', + 'university', + 'unlike_2', + 'unlike', + 'unlock_2', + 'unlock_3', + 'unlock', + 'up__down', + 'up__down3', + 'up_2', + 'up_3', + 'up_4', + 'up', + 'upgrade', + 'upload_2', + 'upload_tocloud', + 'upload_window', + 'upload', + 'uppercase_text', + 'upward', + 'url_window', + 'usb_2', + 'usb_cable', + 'usb', + 'user', + 'ustream', + 'vase', + 'vector_2', + 'vector_3', + 'vector_4', + 'vector_5', + 'vector', + 'venn_diagram', + 'vest_2', + 'vest', + 'viddler', + 'video_2', + 'video_3', + 'video_4', + 'video_5', + 'video_6', + 'video_gamecontroller', + 'video_len', + 'video_len2', + 'video_photographer', + 'video_tripod', + 'video', + 'vietnam', + 'view_height', + 'view_width', + 'vimeo', + 'virgo_2', + 'virgo', + 'virus_2', + 'virus_3', + 'virus', + 'visa', + 'voice', + 'voicemail', + 'volleyball', + 'volume_down', + 'volume_up', + 'vpn', + 'wacom_tablet', + 'waiter', + 'walkie_talkie', + 'wallet_2', + 'wallet_3', + 'wallet', + 'warehouse', + 'warning_window', + 'watch_2', + 'watch_3', + 'watch', + 'wave_2', + 'wave', + 'webcam', + 'weight_lift', + 'wheelbarrow', + 'wheelchair', + 'width_window', + 'wifi_2', + 'wifi_keyboard', + 'wifi', + 'wind_turbine', + 'windmill', + 'window_2', + 'window', + 'windows_2', + 'windows_microsoft', + 'windows', + 'windsock', + 'windy', + 'wine_bottle', + 'wine_glass', + 'wink', + 'winter_2', + 'winter', + 'wireless', + 'witch_hat', + 'witch', + 'wizard', + 'wolf', + 'woman_sign', + 'womanman', + 'womans_underwear', + 'womans_underwear2', + 'women', + 'wonder_woman', + 'wordpress', + 'worker_clothes', + 'worker', + 'wrap_text', + 'wreath', + 'wrench', + 'x_box', + 'x_ray', + 'xanga', + 'xing', + 'yacht', + 'yahoo_buzz', + 'yahoo', + 'yelp', + 'yes', + 'ying_yang', + 'youtube', + 'z_a', + 'zebra', + 'zombie', + 'zoom_gesture', + 'zootool' +]; +export const feather = [ + 'activity', + 'airplay', + 'alert-circle', + 'alert-octagon', + 'alert-triangle', + 'align-center', + 'align-justify', + 'align-left', + 'align-right', + 'anchor', + 'aperture', + 'archive', + 'arrow-down-circle', + 'arrow-down-left', + 'arrow-down-right', + 'arrow-down', + 'arrow-left-circle', + 'arrow-left', + 'arrow-right-circle', + 'arrow-right', + 'arrow-up-circle', + 'arrow-up-left', + 'arrow-up-right', + 'arrow-up', + 'at-sign', + 'award', + 'bar-chart-2', + 'bar-chart', + 'battery-charging', + 'battery', + 'bell-off', + 'bell', + 'bluetooth', + 'bold', + 'book-open', + 'book', + 'bookmark', + 'box', + 'briefcase', + 'calendar', + 'camera-off', + 'camera', + 'cast', + 'check-circle', + 'check-square', + 'check', + 'chevron-down', + 'chevron-left', + 'chevron-right', + 'chevron-up', + 'chevrons-down', + 'chevrons-left', + 'chevrons-right', + 'chevrons-up', + 'chrome', + 'circle', + 'clipboard', + 'clock', + 'cloud-drizzle', + 'cloud-lightning', + 'cloud-off', + 'cloud-rain', + 'cloud-snow', + 'cloud', + 'code', + 'codepen', + 'codesandbox', + 'coffee', + 'columns', + 'command', + 'compass', + 'copy', + 'corner-down-left', + 'corner-down-right', + 'corner-left-down', + 'corner-left-up', + 'corner-right-down', + 'corner-right-up', + 'corner-up-left', + 'corner-up-right', + 'cpu', + 'credit-card', + 'crop', + 'crosshair', + 'database', + 'delete', + 'disc', + 'dollar-sign', + 'download-cloud', + 'download', + 'droplet', + 'edit-2', + 'edit-3', + 'edit', + 'external-link', + 'eye-off', + 'eye', + 'facebook', + 'fast-forward', + 'feather', + 'figma', + 'file-minus', + 'file-plus', + 'file-text', + 'file', + 'film', + 'filter', + 'flag', + 'folder-minus', + 'folder-plus', + 'folder', + 'framer', + 'frown', + 'gift', + 'git-branch', + 'git-commit', + 'git-merge', + 'git-pull-request', + 'github', + 'gitlab', + 'globe', + 'grid', + 'hard-drive', + 'hash', + 'headphones', + 'heart', + 'help-circle', + 'hexagon', + 'home', + 'image', + 'inbox', + 'info', + 'instagram', + 'italic', + 'key', + 'layers', + 'layout', + 'life-buoy', + 'link-2', + 'link', + 'linkedin', + 'list', + 'loader', + 'lock', + 'log-in', + 'log-out', + 'mail', + 'map-pin', + 'map', + 'maximize-2', + 'maximize', + 'meh', + 'menu', + 'message-circle', + 'message-square', + 'mic-off', + 'mic', + 'minimize-2', + 'minimize', + 'minus-circle', + 'minus-square', + 'minus', + 'monitor', + 'moon', + 'more-horizontal', + 'more-vertical', + 'mouse-pointer', + 'move', + 'music', + 'navigation-2', + 'navigation', + 'octagon', + 'package', + 'paperclip', + 'pause-circle', + 'pause', + 'pen-tool', + 'percent', + 'phone-call', + 'phone-forwarded', + 'phone-incoming', + 'phone-missed', + 'phone-off', + 'phone-outgoing', + 'phone', + 'pie-chart', + 'play-circle', + 'play', + 'plus-circle', + 'plus-square', + 'plus', + 'pocket', + 'power', + 'printer', + 'radio', + 'refresh-ccw', + 'refresh-cw', + 'repeat', + 'rewind', + 'rotate-ccw', + 'rotate-cw', + 'rss', + 'save', + 'scissors', + 'search', + 'send', + 'server', + 'settings', + 'share-2', + 'share', + 'shield-off', + 'shield', + 'shopping-bag', + 'shopping-cart', + 'shuffle', + 'sidebar', + 'skip-back', + 'skip-forward', + 'slack', + 'slash', + 'sliders', + 'smartphone', + 'smile', + 'speaker', + 'square', + 'star', + 'stop-circle', + 'sun', + 'sunrise', + 'sunset', + 'tablet', + 'tag', + 'target', + 'terminal', + 'thermometer', + 'thumbs-down', + 'thumbs-up', + 'toggle-left', + 'toggle-right', + 'tool', + 'trash-2', + 'trash', + 'trello', + 'trending-down', + 'trending-up', + 'triangle', + 'truck', + 'tv', + 'twitch', + 'twitter', + 'type', + 'umbrella', + 'underline', + 'unlock', + 'upload-cloud', + 'upload', + 'user-check', + 'user-minus', + 'user-plus', + 'user-x', + 'user', + 'users', + 'video-off', + 'video', + 'voicemail', + 'volume-1', + 'volume-2', + 'volume-x', + 'volume', + 'watch', + 'wifi-off', + 'wifi', + 'wind', + 'x-circle', + 'x-octagon', + 'x-square', + 'x', + 'youtube', + 'zap-off', + 'zap', + 'zoom-in', + 'zoom-out' +]; +// heroicons v0.4.2 +export const heroicons = [ + 'academic-cap', + 'annotation', + 'arrow-circle-down', + 'adjustments', + 'arrow-circle-left', + 'arrow-circle-right', + 'archive', + 'arrow-circle-up', + 'arrow-down', + 'arrow-narrow-down', + 'arrow-left', + 'arrow-narrow-left', + 'arrow-narrow-right', + 'arrow-right', + 'arrow-narrow-up', + 'arrow-up', + 'at-symbol', + 'arrows-expand', + 'backspace', + 'badge-check', + 'ban', + 'beaker', + 'bell', + 'book-open', + 'bookmark-alt', + 'bookmark', + 'calendar', + 'briefcase', + 'calculator', + 'cake', + 'camera', + 'cash', + 'chart-bar', + 'chart-pie', + 'chart-square-bar', + 'chat-alt-2', + 'chat', + 'check-circle', + 'chat-alt', + 'check', + 'chevron-double-down', + 'chevron-double-left', + 'chevron-down', + 'chevron-double-up', + 'chevron-left', + 'chevron-double-right', + 'chevron-right', + 'chevron-up', + 'chip', + 'clipboard-check', + 'clipboard-copy', + 'clipboard-list', + 'clock', + 'cloud-upload', + 'clipboard', + 'cloud-download', + 'code', + 'cloud', + 'cog', + 'collection', + 'color-swatch', + 'credit-card', + 'cube-transparent', + 'cube', + 'currency-bangladeshi', + 'currency-dollar', + 'currency-pound', + 'currency-euro', + 'currency-rupee', + 'cursor-click', + 'currency-yen', + 'database', + 'desktop-computer', + 'device-mobile', + 'device-tablet', + 'document-download', + 'document-add', + 'document-remove', + 'document-duplicate', + 'document-report', + 'document-search', + 'document-text', + 'document', + 'dots-circle-horizontal', + 'dots-horizontal', + 'dots-vertical', + 'download', + 'emoji-happy', + 'emoji-sad', + 'duplicate', + 'exclamation-circle', + 'exclamation', + 'external-link', + 'eye-off', + 'film', + 'fast-forward', + 'finger-print', + 'eye', + 'filter', + 'fire', + 'flag', + 'folder-add', + 'folder-remove', + 'folder-open', + 'folder', + 'folder-download', + 'gift', + 'globe-alt', + 'hand', + 'globe', + 'hashtag', + 'identification', + 'heart', + 'home', + 'inbox-in', + 'inbox', + 'information-circle', + 'key', + 'light-bulb', + 'lightning-bolt', + 'library', + 'link', + 'location-marker', + 'lock-closed', + 'lock-open', + 'logout', + 'mail', + 'login', + 'map', + 'mail-open', + 'menu-alt-1', + 'menu-alt-3', + 'menu-alt-4', + 'menu-alt-2', + 'menu', + 'microphone', + 'minus-circle', + 'minus-sm', + 'minus', + 'music-note', + 'moon', + 'newspaper', + 'office-building', + 'paper-clip', + 'paper-airplane', + 'pause', + 'pencil-alt', + 'pencil', + 'phone-incoming', + 'phone-missed-call', + 'phone-outgoing', + 'plus-circle', + 'play', + 'photograph', + 'phone', + 'plus-sm', + 'plus', + 'presentation-chart-bar', + 'puzzle', + 'presentation-chart-line', + 'qrcode', + 'printer', + 'question-mark-circle', + 'receipt-refund', + 'receipt-tax', + 'refresh', + 'reply', + 'rewind', + 'rss', + 'save-as', + 'save', + 'scale', + 'scissors', + 'search', + 'search-circle', + 'selector', + 'server', + 'share', + 'shield-check', + 'shield-exclamation', + 'shopping-bag', + 'shopping-cart', + 'sort-ascending', + 'sort-descending', + 'sparkles', + 'speakerphone', + 'star', + 'status-offline', + 'status-online', + 'stop', + 'sun', + 'support', + 'switch-horizontal', + 'switch-vertical', + 'table', + 'tag', + 'template', + 'thumb-down', + 'terminal', + 'thumb-up', + 'ticket', + 'translate', + 'trash', + 'trending-down', + 'trending-up', + 'truck', + 'upload', + 'user-add', + 'user-circle', + 'user-group', + 'user', + 'user-remove', + 'users', + 'video-camera', + 'view-boards', + 'variable', + 'view-grid-add', + 'view-grid', + 'view-list', + 'volume-off', + 'volume-up', + 'wifi', + 'x-circle', + 'x', + 'zoom-in', + 'zoom-out' +]; diff --git a/src/app/modules/admin/apps/calendar/calendar.component.html b/src/app/modules/admin/apps/calendar/calendar.component.html new file mode 100644 index 00000000..76e92f33 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.component.html @@ -0,0 +1,386 @@ +
+ + + + + + + + + + + +
+ + +
+ + + +
+ {{viewTitle}} +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + +
+ +
+ + + + + + +
+ +
+ +
+ +
+
{{event.title || '(No title)'}}
+
{{event.start | date:'EEEE, MMMM d'}}
+
{{recurrenceStatus}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
{{event.description}}
+
+ + +
+ +
+
+
{{getCalendar(event.calendarId).title}}
+
+
+
+
+ + + +
+ + +
+ + + + +
+ + +
+ +
+ + + All day + +
+
+ + +
+ +
+
+ {{recurrenceStatus || 'Does not repeat'}} +
+
+
+ + +
+ + + + + + {{getCalendar(eventForm.get('calendarId').value)?.title}} + + +
+ + {{calendar.title}} +
+
+
+
+
+ + +
+ + + + +
+ + +
+ + +
+
+
+ +
+ +
+ +
+ +
+ +
+ + diff --git a/src/app/modules/admin/apps/calendar/calendar.component.scss b/src/app/modules/admin/apps/calendar/calendar.component.scss new file mode 100644 index 00000000..59754831 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.component.scss @@ -0,0 +1,121 @@ +calendar { + + /* Tweak: FullCalendar CSS only height to improve resize performance */ + /* With this tweak, we can disable "handleWindowResize" option of FullCalendar */ + /* which disables the height calculations on window resize and increases the */ + /* overall performance. */ + /* This tweak only affects the Calendar app's FullCalendar. */ + full-calendar { + display: flex; + flex-direction: column; + flex: 1 0 auto; + width: 100%; + height: 100%; + + .fc-view-container { + display: flex; + flex-direction: column; + flex: 1 0 auto; + width: 100%; + height: 100%; + + .fc-view { + + /* Day grid - Month view */ + /* Time grid - Week view */ + /* Time grid - Day view */ + &.fc-dayGridMonth-view, + &.fc-timeGridWeek-view, + &.fc-timeGridDay-view { + display: flex; + flex-direction: column; + flex: 1 0 auto; + width: 100%; + height: 100%; + + > table { + display: flex; + flex-direction: column; + flex: 1 0 auto; + height: 100%; + + > thead { + display: flex; + } + + > tbody { + display: flex; + flex: 1 1 auto; + overflow: hidden; + + > tr { + display: flex; + + > td { + display: flex; + flex-direction: column; + + .fc-scroller { + flex: 1 1 auto; + overflow: hidden scroll !important; + height: auto !important; + + } + } + } + } + } + } + + /* Day grid - Month view */ + &.fc-dayGridMonth-view { + + > table { + + > tbody { + + > tr { + + > td { + + .fc-scroller { + display: flex; + + > .fc-day-grid { + display: flex; + flex-direction: column; + min-height: 580px; + + > .fc-row { + flex: 1 0 0; + height: auto !important; + } + } + } + } + } + } + } + } + + /* List - Year view */ + &.fc-listYear-view { + width: 100%; + height: 100%; + + .fc-scroller { + width: 100%; + height: 100% !important; + overflow: hidden !important; + } + } + } + } + } +} + +/* Event panel */ +.calendar-event-panel { + border-radius: 8px; + @apply shadow-2xl bg-card; +} diff --git a/src/app/modules/admin/apps/calendar/calendar.component.ts b/src/app/modules/admin/apps/calendar/calendar.component.ts new file mode 100644 index 00000000..db0b9658 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.component.ts @@ -0,0 +1,1011 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { MatDialog } from '@angular/material/dialog'; +import { MatDrawer } from '@angular/material/sidenav'; +import { FullCalendarComponent } from '@fullcalendar/angular'; +import { Calendar as FullCalendar } from '@fullcalendar/core'; +import dayGridPlugin from '@fullcalendar/daygrid'; +import listPlugin from '@fullcalendar/list'; +import interactionPlugin from '@fullcalendar/interaction'; +import momentPlugin from '@fullcalendar/moment'; +import rrulePlugin from '@fullcalendar/rrule'; +import timeGridPlugin from '@fullcalendar/timegrid'; +import { clone, cloneDeep, isEqual, omit } from 'lodash-es'; +import * as moment from 'moment'; +import { RRule } from 'rrule'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { CalendarRecurrenceComponent } from 'app/modules/admin/apps/calendar/recurrence/recurrence.component'; +import { CalendarService } from 'app/modules/admin/apps/calendar/calendar.service'; +import { Calendar, CalendarDrawerMode, CalendarEvent, CalendarEventEditMode, CalendarEventPanelMode, CalendarSettings } from 'app/modules/admin/apps/calendar/calendar.types'; + +@Component({ + selector : 'calendar', + templateUrl : './calendar.component.html', + styleUrls : ['./calendar.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation : ViewEncapsulation.None +}) +export class CalendarComponent implements OnInit, AfterViewInit, OnDestroy +{ + @ViewChild('eventPanel') private _eventPanel: TemplateRef; + @ViewChild('fullCalendar') private _fullCalendar: FullCalendarComponent; + @ViewChild('drawer') private _drawer: MatDrawer; + + calendars: Calendar[]; + calendarPlugins: any[] = [dayGridPlugin, interactionPlugin, listPlugin, momentPlugin, rrulePlugin, timeGridPlugin]; + drawerMode: CalendarDrawerMode = 'side'; + drawerOpened: boolean = true; + event: CalendarEvent; + eventEditMode: CalendarEventEditMode = 'single'; + eventForm: FormGroup; + eventTimeFormat: any; + events: CalendarEvent[] = []; + panelMode: CalendarEventPanelMode = 'view'; + settings: CalendarSettings; + view: 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay' | 'listYear' = 'dayGridMonth'; + views: any; + viewTitle: string; + private _eventPanelOverlayRef: OverlayRef; + private _fullCalendarApi: FullCalendar; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _calendarService: CalendarService, + private _changeDetectorRef: ChangeDetectorRef, + @Inject(DOCUMENT) private _document: Document, + private _formBuilder: FormBuilder, + private _matDialog: MatDialog, + private _overlay: Overlay, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for event's recurrence status + */ + get recurrenceStatus(): string + { + // Get the recurrence from event form + const recurrence = this.eventForm.get('recurrence').value; + + // Return null, if there is no recurrence on the event + if ( !recurrence ) + { + return null; + } + + // Convert the recurrence rule to text + let ruleText = RRule.fromString(recurrence).toText(); + ruleText = ruleText.charAt(0).toUpperCase() + ruleText.slice(1); + + // Return the rule text + return ruleText; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the event form + this.eventForm = this._formBuilder.group({ + id : [''], + calendarId : [''], + recurringEventId: [null], + title : [''], + description : [''], + start : [null], + end : [null], + duration : [null], + allDay : [true], + recurrence : [null], + range : [{}] + }); + + // Subscribe to 'range' field value changes + this.eventForm.get('range').valueChanges.subscribe((value) => { + + if ( !value ) + { + return; + } + + // Set the 'start' field value from the range + this.eventForm.get('start').setValue(value.start, {emitEvent: false}); + + // If this is a recurring event... + if ( this.eventForm.get('recurrence').value ) + { + // Update the recurrence rules if needed + this._updateRecurrenceRule(); + + // Set the duration field + const duration = moment(value.end).diff(moment(value.start), 'minutes'); + this.eventForm.get('duration').setValue(duration, {emitEvent: false}); + + // Update the end value + this._updateEndValue(); + } + // Otherwise... + else + { + // Set the end field + this.eventForm.get('end').setValue(value.end, {emitEvent: false}); + } + }); + + // Subscribe to 'recurrence' field changes + this.eventForm.get('recurrence').valueChanges.subscribe((value) => { + + // If this is a recurring event... + if ( value ) + { + // Update the end value + this._updateEndValue(); + } + }); + + // Get calendars + this._calendarService.calendars$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((calendars) => { + + // Store the calendars + this.calendars = calendars; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get events + this._calendarService.events$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((events) => { + + // Clone the events to change the object reference so + // that the FullCalendar can trigger a re-render. + this.events = cloneDeep(events); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get settings + this._calendarService.settings$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((settings) => { + + // Store the settings + this.settings = settings; + + // Set the FullCalendar event time format based on the time format setting + this.eventTimeFormat = { + hour : settings.timeFormat === '12' ? 'numeric' : '2-digit', + hour12 : settings.timeFormat === '12', + minute : '2-digit', + meridiem: settings.timeFormat === '12' ? 'short' : false + }; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if the given breakpoint is active + if ( matchingAliases.includes('md') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Build the view specific FullCalendar options + this.views = { + dayGridMonth: { + eventLimit : 3, + eventTimeFormat: this.eventTimeFormat, + fixedWeekCount : false + }, + timeGrid : { + allDayText : '', + columnHeaderFormat: { + weekday : 'short', + day : 'numeric', + omitCommas: true + }, + columnHeaderHtml : (date) => { + return `${moment(date).format('ddd')} + ${moment(date).format('D')}`; + }, + slotDuration : '01:00:00', + slotLabelFormat : this.eventTimeFormat + }, + timeGridWeek: {}, + timeGridDay : {}, + listYear : { + allDayText : 'All day', + eventTimeFormat : this.eventTimeFormat, + listDayFormat : false, + listDayAltFormat: false + } + }; + } + + /** + * After view init + */ + ngAfterViewInit(): void + { + // Get the full calendar API + this._fullCalendarApi = this._fullCalendar.getApi(); + + // Get the current view's title + this.viewTitle = this._fullCalendarApi.view.title; + + // Get the view's current start and end dates, add/subtract + // 60 days to create a ~150 days period to fetch the mock-api for + const viewStart = moment(this._fullCalendarApi.view.currentStart).subtract(60, 'days'); + const viewEnd = moment(this._fullCalendarApi.view.currentEnd).add(60, 'days'); + + // Get events + this._calendarService.getEvents(viewStart, viewEnd, true).subscribe(); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._eventPanelOverlayRef ) + { + this._eventPanelOverlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle Drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._drawer.toggle(); + } + + /** + * Open recurrence panel + */ + openRecurrenceDialog(): void + { + // Open the dialog + const dialogRef = this._matDialog.open(CalendarRecurrenceComponent, { + panelClass: 'calendar-event-recurrence-dialog', + data : { + event: this.eventForm.value + } + }); + + // After dialog closed + dialogRef.afterClosed().subscribe((result) => { + + // Return if canceled + if ( !result || !result.recurrence ) + { + return; + } + + // Only update the recurrence if it actually changed + if ( this.eventForm.get('recurrence').value === result.recurrence ) + { + return; + } + + // If returned value is 'cleared'... + if ( result.recurrence === 'cleared' ) + { + // Clear the recurrence field if recurrence cleared + this.eventForm.get('recurrence').setValue(null); + } + // Otherwise... + else + { + // Update the recurrence field with the result + this.eventForm.get('recurrence').setValue(result.recurrence); + } + }); + } + + /** + * Change the event panel mode between view and edit + * mode while setting the event edit mode + * + * @param panelMode + * @param eventEditMode + */ + changeEventPanelMode(panelMode: CalendarEventPanelMode, eventEditMode: CalendarEventEditMode = 'single'): void + { + // Set the panel mode + this.panelMode = panelMode; + + // Set the event edit mode + this.eventEditMode = eventEditMode; + + // Update the panel position + setTimeout(() => { + this._eventPanelOverlayRef.updatePosition(); + }); + } + + /** + * Get calendar by id + * + * @param id + */ + getCalendar(id): Calendar + { + if ( !id ) + { + return; + } + + return this.calendars.find((calendar) => calendar.id === id); + } + + /** + * Change the calendar view + * + * @param view + */ + changeView(view: 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay' | 'listYear'): void + { + // Store the view + this.view = view; + + // If the FullCalendar API is available... + if ( this._fullCalendarApi ) + { + // Set the view + this._fullCalendarApi.changeView(view); + + // Update the view title + this.viewTitle = this._fullCalendarApi.view.title; + } + } + + /** + * Moves the calendar one stop back + */ + previous(): void + { + // Go to previous stop + this._fullCalendarApi.prev(); + + // Update the view title + this.viewTitle = this._fullCalendarApi.view.title; + + // Get the view's current start date + const start = moment(this._fullCalendarApi.view.currentStart); + + // Prefetch past events + this._calendarService.prefetchPastEvents(start).subscribe(); + } + + /** + * Moves the calendar to the current date + */ + today(): void + { + // Go to today + this._fullCalendarApi.today(); + + // Update the view title + this.viewTitle = this._fullCalendarApi.view.title; + } + + /** + * Moves the calendar one stop forward + */ + next(): void + { + // Go to next stop + this._fullCalendarApi.next(); + + // Update the view title + this.viewTitle = this._fullCalendarApi.view.title; + + // Get the view's current end date + const end = moment(this._fullCalendarApi.view.currentEnd); + + // Prefetch future events + this._calendarService.prefetchFutureEvents(end).subscribe(); + } + + /** + * On date click + * + * @param calendarEvent + */ + onDateClick(calendarEvent): void + { + // Prepare the event + const event = { + id : null, + calendarId : this.calendars[0].id, + recurringEventId: null, + isFirstInstance : false, + title : '', + description : '', + start : moment(calendarEvent.date).startOf('day').toISOString(), + end : moment(calendarEvent.date).endOf('day').toISOString(), + duration : null, + allDay : true, + recurrence : null, + range : { + start: moment(calendarEvent.date).startOf('day').toISOString(), + end : moment(calendarEvent.date).endOf('day').toISOString() + } + }; + + // Set the event + this.event = event; + + // Set the el on calendarEvent for consistency + calendarEvent.el = calendarEvent.dayEl; + + // Reset the form and fill the event + this.eventForm.reset(); + this.eventForm.patchValue(event); + + // Open the event panel + this._openEventPanel(calendarEvent); + + // Change the event panel mode + this.changeEventPanelMode('add'); + } + + /** + * On event click + * + * @param calendarEvent + */ + onEventClick(calendarEvent): void + { + // Find the event with the clicked event's id + const event: any = cloneDeep(this.events.find(item => item.id === calendarEvent.event.id)); + + // Set the event + this.event = event; + + // Prepare the end value + let end; + + // If this is a recurring event... + if ( event.recuringEventId ) + { + // Calculate the end value using the duration + end = moment(event.start).add(event.duration, 'minutes').toISOString(); + } + // Otherwise... + else + { + // Set the end value from the end + end = event.end; + } + + // Set the range on the event + event.range = { + start: event.start, + end + }; + + // Reset the form and fill the event + this.eventForm.reset(); + this.eventForm.patchValue(event); + + // Open the event panel + this._openEventPanel(calendarEvent); + } + + /** + * On event render + * + * @param calendarEvent + */ + onEventRender(calendarEvent): void + { + // Get event's calendar + const calendar = this.calendars.find((item) => item.id === calendarEvent.event.extendedProps.calendarId); + + // Return if the calendar doesn't exist... + if ( !calendar ) + { + return; + } + + // If current view is year list... + if ( this.view === 'listYear' ) + { + // Create a new 'fc-list-item-date' node + const fcListItemDate1 = ` + + ${moment(calendarEvent.event.start).format('D')} + ${moment(calendarEvent.event.start).format('MMM')}, ${moment(calendarEvent.event.start).format('ddd')} + + `; + + // Insert the 'fc-list-item-date' into the calendar event element + calendarEvent.el.insertAdjacentHTML('afterbegin', fcListItemDate1); + + // Set the color class of the event dot + calendarEvent.el.getElementsByClassName('fc-event-dot')[0].classList.add(calendar.color); + + // Set the event's title to '(No title)' if event title is not available + if ( !calendarEvent.event.title ) + { + calendarEvent.el.querySelector('.fc-list-item-title').innerText = '(No title)'; + } + } + // If current view is not month list... + else + { + // Set the color class of the event + calendarEvent.el.classList.add(calendar.color); + + // Set the event's title to '(No title)' if event title is not available + if ( !calendarEvent.event.title ) + { + calendarEvent.el.querySelector('.fc-title').innerText = '(No title)'; + } + } + + // Set the event's visibility + calendarEvent.el.style.display = calendar.visible ? 'flex' : 'none'; + } + + /** + * On calendar updated + * + * @param calendar + */ + onCalendarUpdated(calendar): void + { + // Re-render the events + this._fullCalendarApi.rerenderEvents(); + } + + /** + * Add event + */ + addEvent(): void + { + // Get the clone of the event form value + let newEvent = clone(this.eventForm.value); + + // If the event is a recurring event... + if ( newEvent.recurrence ) + { + // Set the event duration + newEvent.duration = moment(newEvent.range.end).diff(moment(newEvent.range.start), 'minutes'); + } + + // Modify the event before sending it to the server + newEvent = omit(newEvent, ['range', 'recurringEventId']); + + // Add the event + this._calendarService.addEvent(newEvent).subscribe(() => { + + // Reload events + this._calendarService.reloadEvents().subscribe(); + + // Close the event panel + this._closeEventPanel(); + }); + } + + /** + * Update the event + */ + updateEvent(): void + { + // Get the clone of the event form value + let event = clone(this.eventForm.value); + const { + range, + ...eventWithoutRange + } = event; + + // Get the original event + const originalEvent = this.events.find(item => item.id === event.id); + + // Return if there are no changes made to the event + if ( isEqual(eventWithoutRange, originalEvent) ) + { + // Close the event panel + this._closeEventPanel(); + + // Return + return; + } + + // If the event is a recurring event... + if ( event.recurrence && event.recurringEventId ) + { + // Update the recurring event on the server + this._calendarService.updateRecurringEvent(event, originalEvent, this.eventEditMode).subscribe(() => { + + // Reload events + this._calendarService.reloadEvents().subscribe(); + + // Close the event panel + this._closeEventPanel(); + }); + + // Return + return; + } + + // If the event is a non-recurring event... + if ( !event.recurrence && !event.recurringEventId ) + { + // Update the event on the server + this._calendarService.updateEvent(event.id, event).subscribe(() => { + + // Close the event panel + this._closeEventPanel(); + }); + + // Return + return; + } + + // If the event was a non-recurring event but now it will be a recurring event... + if ( event.recurrence && !event.recurringEventId ) + { + // Set the event duration + event.duration = moment(event.range.end).diff(moment(event.range.start), 'minutes'); + + // Omit unnecessary fields + event = omit(event, ['range', 'recurringEventId']); + + // Update the event on the server + this._calendarService.updateEvent(event.id, event).subscribe(() => { + + // Reload events + this._calendarService.reloadEvents().subscribe(); + + // Close the event panel + this._closeEventPanel(); + }); + + // Return + return; + } + + // If the event was a recurring event but now it will be a non-recurring event... + if ( !event.recurrence && event.recurringEventId ) + { + // Set the end date + event.end = moment(event.start).add(event.duration, 'minutes').toISOString(); + + // Set the duration as null + event.duration = null; + + // Update the recurring event on the server + this._calendarService.updateRecurringEvent(event, originalEvent, this.eventEditMode).subscribe(() => { + + // Reload events + this._calendarService.reloadEvents().subscribe(); + + // Close the event panel + this._closeEventPanel(); + }); + } + } + + /** + * Delete the given event + * + * @param event + * @param mode + */ + deleteEvent(event, mode: CalendarEventEditMode = 'single'): void + { + // If the event is a recurring event... + if ( event.recurrence ) + { + // Delete the recurring event on the server + this._calendarService.deleteRecurringEvent(event, mode).subscribe(() => { + + // Reload events + this._calendarService.reloadEvents().subscribe(); + + // Close the event panel + this._closeEventPanel(); + }); + } + // If the event is a non-recurring, normal event... + else + { + // Update the event on the server + this._calendarService.deleteEvent(event.id).subscribe(() => { + + // Close the event panel + this._closeEventPanel(); + }); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create the event panel overlay + * @private + */ + private _createEventPanelOverlay(positionStrategy): void + { + // Create the overlay + this._eventPanelOverlayRef = this._overlay.create({ + panelClass : ['calendar-event-panel'], + backdropClass : '', + hasBackdrop : true, + scrollStrategy: this._overlay.scrollStrategies.reposition(), + positionStrategy + }); + + // Detach the overlay from the portal on backdrop click + this._eventPanelOverlayRef.backdropClick().subscribe(() => { + this._closeEventPanel(); + }); + } + + /** + * Open the event panel + * + * @private + */ + private _openEventPanel(calendarEvent): void + { + const positionStrategy = this._overlay.position().flexibleConnectedTo(calendarEvent.el).withFlexibleDimensions(false).withPositions([ + { + originX : 'end', + originY : 'top', + overlayX: 'start', + overlayY: 'top', + offsetX : 8 + }, + { + originX : 'start', + originY : 'top', + overlayX: 'end', + overlayY: 'top', + offsetX : -8 + }, + { + originX : 'start', + originY : 'bottom', + overlayX: 'end', + overlayY: 'bottom', + offsetX : -8 + }, + { + originX : 'end', + originY : 'bottom', + overlayX: 'start', + overlayY: 'bottom', + offsetX : 8 + } + ]); + + // Create the overlay if it doesn't exist + if ( !this._eventPanelOverlayRef ) + { + this._createEventPanelOverlay(positionStrategy); + } + // Otherwise, just update the position + else + { + this._eventPanelOverlayRef.updatePositionStrategy(positionStrategy); + } + + // Attach the portal to the overlay + this._eventPanelOverlayRef.attach(new TemplatePortal(this._eventPanel, this._viewContainerRef)); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Close the event panel + * + * @private + */ + private _closeEventPanel(): void + { + // Detach the overlay from the portal + this._eventPanelOverlayRef.detach(); + + // Reset the panel and event edit modes + this.panelMode = 'view'; + this.eventEditMode = 'single'; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Update the recurrence rule based on the event if needed + * + * @private + */ + private _updateRecurrenceRule(): void + { + // Get the event + const event = this.eventForm.value; + + // Return if this is a non-recurring event + if ( !event.recurrence ) + { + return; + } + + // Parse the recurrence rule + const parsedRules = {}; + event.recurrence.split(';').forEach((rule) => { + + // Split the rule + const parsedRule = rule.split('='); + + // Add the rule to the parsed rules + parsedRules[parsedRule[0]] = parsedRule[1]; + }); + + // If there is a BYDAY rule, split that as well + if ( parsedRules['BYDAY'] ) + { + parsedRules['BYDAY'] = parsedRules['BYDAY'].split(','); + } + + // Do not update the recurrence rule if ... + // ... the frequency is DAILY, + // ... the frequency is WEEKLY and BYDAY has multiple values, + // ... the frequency is MONTHLY and there isn't a BYDAY rule, + // ... the frequency is YEARLY, + if ( parsedRules['FREQ'] === 'DAILY' || + (parsedRules['FREQ'] === 'WEEKLY' && parsedRules['BYDAY'].length > 1) || + (parsedRules['FREQ'] === 'MONTHLY' && !parsedRules['BYDAY']) || + parsedRules['FREQ'] === 'YEARLY' ) + { + return; + } + + // If the frequency is WEEKLY, update the BYDAY value with the new one + if ( parsedRules['FREQ'] === 'WEEKLY' ) + { + parsedRules['BYDAY'] = [moment(event.start).format('dd').toUpperCase()]; + } + + // If the frequency is MONTHLY, update the BYDAY value with the new one + if ( parsedRules['FREQ'] === 'MONTHLY' ) + { + // Calculate the weekday + const weekday = moment(event.start).format('dd').toUpperCase(); + + // Calculate the nthWeekday + let nthWeekdayNo = 1; + while ( moment(event.start).isSame(moment(event.start).subtract(nthWeekdayNo, 'week'), 'month') ) + { + nthWeekdayNo++; + } + + // Set the BYDAY + parsedRules['BYDAY'] = [nthWeekdayNo + weekday]; + } + + // Generate the rule string from the parsed rules + const rules = []; + Object.keys(parsedRules).forEach((key) => { + rules.push(key + '=' + (Array.isArray(parsedRules[key]) ? parsedRules[key].join(',') : parsedRules[key])); + }); + const rrule = rules.join(';'); + + // Update the recurrence rule + this.eventForm.get('recurrence').setValue(rrule); + } + + /** + * Update the end value based on the recurrence and duration + * + * @private + */ + private _updateEndValue(): void + { + // Get the event recurrence + const recurrence = this.eventForm.get('recurrence').value; + + // Return if this is a non-recurring event + if ( !recurrence ) + { + return; + } + + // Parse the recurrence rule + const parsedRules = {}; + recurrence.split(';').forEach((rule) => { + + // Split the rule + const parsedRule = rule.split('='); + + // Add the rule to the parsed rules + parsedRules[parsedRule[0]] = parsedRule[1]; + }); + + // If there is an UNTIL rule... + if ( parsedRules['UNTIL'] ) + { + // Use that to set the end date + this.eventForm.get('end').setValue(parsedRules['UNTIL']); + + // Return + return; + } + + // If there is a COUNT rule... + if ( parsedRules['COUNT'] ) + { + // Generate the RRule string + const rrule = 'DTSTART=' + moment(this.eventForm.get('start').value).utc().format('YYYYMMDD[T]HHmmss[Z]') + '\nRRULE:' + recurrence; + + // Use RRule string to generate dates + const dates = RRule.fromString(rrule).all(); + + // Get the last date from dates array and set that as the end date + this.eventForm.get('end').setValue(moment(dates[dates.length - 1]).toISOString()); + + // Return + return; + } + + // If there are no UNTIL or COUNT, set the end date to a fixed value + this.eventForm.get('end').setValue(moment().year(9999).endOf('year').toISOString()); + } +} diff --git a/src/app/modules/admin/apps/calendar/calendar.module.ts b/src/app/modules/admin/apps/calendar/calendar.module.ts new file mode 100644 index 00000000..12b15b2a --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.module.ts @@ -0,0 +1,75 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { MAT_DATE_FORMATS } from '@angular/material/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { FullCalendarModule } from '@fullcalendar/angular'; +import { FuseDateRangeModule } from '@fuse/components/date-range'; +import { SharedModule } from 'app/shared/shared.module'; +import { CalendarComponent } from 'app/modules/admin/apps/calendar/calendar.component'; +import { CalendarRecurrenceComponent } from 'app/modules/admin/apps/calendar/recurrence/recurrence.component'; +import { CalendarSettingsComponent } from 'app/modules/admin/apps/calendar/settings/settings.component'; +import { CalendarSidebarComponent } from 'app/modules/admin/apps/calendar/sidebar/sidebar.component'; +import { calendarRoutes } from 'app/modules/admin/apps/calendar/calendar.routing'; + +@NgModule({ + declarations: [ + CalendarComponent, + CalendarRecurrenceComponent, + CalendarSettingsComponent, + CalendarSidebarComponent + ], + imports : [ + RouterModule.forChild(calendarRoutes), + ScrollingModule, + MatButtonModule, + MatButtonToggleModule, + MatCheckboxModule, + MatDatepickerModule, + MatDialogModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatMomentDateModule, + MatRadioModule, + MatSelectModule, + MatSidenavModule, + MatTooltipModule, + FullCalendarModule, + FuseDateRangeModule, + SharedModule + ], + providers : [ + { + provide : MAT_DATE_FORMATS, + useValue: { + parse : { + dateInput: 'DD.MM.YYYY' + }, + display: { + dateInput : 'DD.MM.YYYY', + monthYearLabel : 'MMM YYYY', + dateA11yLabel : 'DD.MM.YYYY', + monthYearA11yLabel: 'MMMM YYYY' + } + } + } + ] +}) +export class CalendarModule +{ +} diff --git a/src/app/modules/admin/apps/calendar/calendar.resolvers.ts b/src/app/modules/admin/apps/calendar/calendar.resolvers.ts new file mode 100644 index 00000000..b53a9762 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.resolvers.ts @@ -0,0 +1,89 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { CalendarService } from 'app/modules/admin/apps/calendar/calendar.service'; +import { Calendar, CalendarSettings, CalendarWeekday } from 'app/modules/admin/apps/calendar/calendar.types'; + +@Injectable({ + providedIn: 'root' +}) +export class CalendarCalendarsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _calendarService: CalendarService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._calendarService.getCalendars(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class CalendarSettingsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _calendarService: CalendarService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._calendarService.getSettings(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class CalendarWeekdaysResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _calendarService: CalendarService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._calendarService.getWeekdays(); + } +} diff --git a/src/app/modules/admin/apps/calendar/calendar.routing.ts b/src/app/modules/admin/apps/calendar/calendar.routing.ts new file mode 100644 index 00000000..79d7d32b --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.routing.ts @@ -0,0 +1,23 @@ +import { Route } from '@angular/router'; +import { CalendarComponent } from 'app/modules/admin/apps/calendar/calendar.component'; +import { CalendarSettingsComponent } from 'app/modules/admin/apps/calendar/settings/settings.component'; +import { CalendarCalendarsResolver, CalendarSettingsResolver, CalendarWeekdaysResolver } from 'app/modules/admin/apps/calendar/calendar.resolvers'; + +export const calendarRoutes: Route[] = [ + { + path : '', + component: CalendarComponent, + resolve : { + calendars: CalendarCalendarsResolver, + settings : CalendarSettingsResolver, + weekdays : CalendarWeekdaysResolver + } + }, + { + path : 'settings', + component: CalendarSettingsComponent, + resolve : { + settings: CalendarSettingsResolver + } + } +]; diff --git a/src/app/modules/admin/apps/calendar/calendar.service.ts b/src/app/modules/admin/apps/calendar/calendar.service.ts new file mode 100644 index 00000000..d8e743cb --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.service.ts @@ -0,0 +1,475 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of } from 'rxjs'; +import { map, switchMap, take, tap } from 'rxjs/operators'; +import { Moment } from 'moment'; +import { Calendar, CalendarEvent, CalendarEventEditMode, CalendarSettings, CalendarWeekday } from 'app/modules/admin/apps/calendar/calendar.types'; + +@Injectable({ + providedIn: 'root' +}) +export class CalendarService +{ + // Private + private _calendars: BehaviorSubject = new BehaviorSubject(null); + private _events: BehaviorSubject = new BehaviorSubject(null); + private _loadedEventsRange: { start: Moment | null, end: Moment | null } = { + start: null, + end : null + }; + private readonly _numberOfDaysToPrefetch = 60; + private _settings: BehaviorSubject = new BehaviorSubject(null); + private _weekdays: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for calendars + */ + get calendars$(): Observable + { + return this._calendars.asObservable(); + } + + /** + * Getter for events + */ + get events$(): Observable + { + return this._events.asObservable(); + } + + /** + * Getter for settings + */ + get settings$(): Observable + { + return this._settings.asObservable(); + } + + /** + * Getter for weekdays + */ + get weekdays$(): Observable + { + return this._weekdays.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get calendars + */ + getCalendars(): Observable + { + return this._httpClient.get('api/apps/calendar/calendars').pipe( + tap((response) => { + this._calendars.next(response); + }) + ); + } + + /** + * Add calendar + * + * @param calendar + */ + addCalendar(calendar: Calendar): Observable + { + return this.calendars$.pipe( + take(1), + switchMap(calendars => this._httpClient.post('api/apps/calendar/calendars', { + calendar + }).pipe( + map((addedCalendar) => { + + // Add the calendar + calendars.push(addedCalendar); + + // Update the calendars + this._calendars.next(calendars); + + // Return the added calendar + return addedCalendar; + }) + )) + ); + } + + /** + * Update calendar + * + * @param id + * @param calendar + */ + updateCalendar(id: string, calendar: Calendar): Observable + { + return this.calendars$.pipe( + take(1), + switchMap(calendars => this._httpClient.patch('api/apps/calendar/calendars', { + id, + calendar + }).pipe( + map((updatedCalendar) => { + + // Find the index of the updated calendar + const index = calendars.findIndex(item => item.id === id); + + // Update the calendar + calendars[index] = updatedCalendar; + + // Update the calendars + this._calendars.next(calendars); + + // Return the updated calendar + return updatedCalendar; + }) + )) + ); + } + + /** + * Delete calendar + * + * @param id + */ + deleteCalendar(id: string): Observable + { + return this.calendars$.pipe( + take(1), + switchMap(calendars => this._httpClient.delete('api/apps/calendar/calendars', { + params: {id} + }).pipe( + map((isDeleted) => { + + // Find the index of the deleted calendar + const index = calendars.findIndex(item => item.id === id); + + // Delete the calendar + calendars.splice(index, 1); + + // Update the calendars + this._calendars.next(calendars); + + // Remove the events belong to deleted calendar + const events = this._events.value.filter((event) => event.calendarId !== id); + + // Update the events + this._events.next(events); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Get events + * + * @param start + * @param end + * @param replace + */ + getEvents(start: Moment, end: Moment, replace = false): Observable + { + // Set the new start date for loaded events + if ( replace || !this._loadedEventsRange.start || start.isBefore(this._loadedEventsRange.start) ) + { + this._loadedEventsRange.start = start; + } + + // Set the new end date for loaded events + if ( replace || !this._loadedEventsRange.end || end.isAfter(this._loadedEventsRange.end) ) + { + this._loadedEventsRange.end = end; + } + + // Get the events + return this._httpClient.get('api/apps/calendar/events', { + params: { + start: start.toISOString(true), + end : end.toISOString(true) + } + }).pipe( + switchMap(response => this._events.pipe( + take(1), + map((events) => { + + // If replace... + if ( replace ) + { + // Execute the observable with the response replacing the events object + this._events.next(response); + } + // Otherwise... + else + { + // If events is null, replace it with an empty array + events = events || []; + + // Execute the observable by appending the response to the current events + this._events.next([...events, ...response]); + } + + // Return the response + return response; + }) + )) + ); + } + + /** + * Reload events using the loaded events range + */ + reloadEvents(): Observable + { + // Get the events + return this._httpClient.get('api/apps/calendar/events', { + params: { + start: this._loadedEventsRange.start.toISOString(), + end : this._loadedEventsRange.end.toISOString() + } + }).pipe( + map((response) => { + + // Execute the observable with the response replacing the events object + this._events.next(response); + + // Return the response + return response; + }) + ); + } + + /** + * Prefetch future events + * + * @param end + */ + prefetchFutureEvents(end: Moment): Observable + { + // Calculate the remaining prefetched days + const remainingDays = this._loadedEventsRange.end.diff(end, 'days'); + + // Return if remaining days is bigger than the number + // of days to prefetch. This means we were already been + // there and fetched the events mock-api so no need for doing + // it again. + if ( remainingDays >= this._numberOfDaysToPrefetch ) + { + return of([]); + } + + // Figure out the start and end dates + const start = this._loadedEventsRange.end.clone().add(1, 'day'); + end = this._loadedEventsRange.end.clone().add(this._numberOfDaysToPrefetch - remainingDays, 'days'); + + // Prefetch the events + return this.getEvents(start, end); + } + + /** + * Prefetch past events + * + * @param start + */ + prefetchPastEvents(start: Moment): Observable + { + // Calculate the remaining prefetched days + const remainingDays = start.diff(this._loadedEventsRange.start, 'days'); + + // Return if remaining days is bigger than the number + // of days to prefetch. This means we were already been + // there and fetched the events mock-api so no need for doing + // it again. + if ( remainingDays >= this._numberOfDaysToPrefetch ) + { + return of([]); + } + + // Figure out the start and end dates + start = this._loadedEventsRange.start.clone().subtract(this._numberOfDaysToPrefetch - remainingDays, 'days'); + const end = this._loadedEventsRange.start.clone().subtract(1, 'day'); + + // Prefetch the events + return this.getEvents(start, end); + } + + /** + * Add event + * + * @param event + */ + addEvent(event): Observable + { + return this.events$.pipe( + take(1), + switchMap(events => this._httpClient.post('api/apps/calendar/event', { + event + }).pipe( + map((addedEvent) => { + + // Update the events + this._events.next(events); + + // Return the added event + return addedEvent; + }) + )) + ); + } + + /** + * Update event + * + * @param id + * @param event + */ + updateEvent(id: string, event): Observable + { + return this.events$.pipe( + take(1), + switchMap(events => this._httpClient.patch('api/apps/calendar/event', { + id, + event + }).pipe( + map((updatedEvent) => { + + // Find the index of the updated event + const index = events.findIndex(item => item.id === id); + + // Update the event + events[index] = updatedEvent; + + // Update the events + this._events.next(events); + + // Return the updated event + return updatedEvent; + }) + )) + ); + } + + /** + * Update recurring event + * + * @param event + * @param originalEvent + * @param mode + */ + updateRecurringEvent(event, originalEvent, mode: CalendarEventEditMode): Observable + { + return this._httpClient.patch('api/apps/calendar/recurring-event', { + event, + originalEvent, + mode + }); + } + + /** + * Delete event + * + * @param id + */ + deleteEvent(id: string): Observable + { + return this.events$.pipe( + take(1), + switchMap(events => this._httpClient.delete('api/apps/calendar/event', {params: {id}}).pipe( + map((isDeleted) => { + + // Find the index of the deleted event + const index = events.findIndex(item => item.id === id); + + // Delete the event + events.splice(index, 1); + + // Update the events + this._events.next(events); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Delete recurring event + * + * @param event + * @param mode + */ + deleteRecurringEvent(event, mode: CalendarEventEditMode): Observable + { + return this._httpClient.delete('api/apps/calendar/recurring-event', { + params: { + event: JSON.stringify(event), + mode + } + }); + } + + /** + * Get settings + */ + getSettings(): Observable + { + return this._httpClient.get('api/apps/calendar/settings').pipe( + tap((response) => { + this._settings.next(response); + }) + ); + } + + /** + * Update settings + */ + updateSettings(settings: CalendarSettings): Observable + { + return this.events$.pipe( + take(1), + switchMap(events => this._httpClient.patch('api/apps/calendar/settings', { + settings + }).pipe( + map((updatedSettings) => { + + // Update the settings + this._settings.next(settings); + + // Get weekdays again to get them in correct order + // in case the startWeekOn setting changes + this.getWeekdays().subscribe(); + + // Return the updated settings + return updatedSettings; + }) + )) + ); + } + + /** + * Get weekdays + */ + getWeekdays(): Observable + { + return this._httpClient.get('api/apps/calendar/weekdays').pipe( + tap((response) => { + this._weekdays.next(response); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/calendar/calendar.types.ts b/src/app/modules/admin/apps/calendar/calendar.types.ts new file mode 100644 index 00000000..ff79255c --- /dev/null +++ b/src/app/modules/admin/apps/calendar/calendar.types.ts @@ -0,0 +1,47 @@ +export interface Calendar +{ + id: string; + title: string; + color: string; + visible: boolean; +} + +export type CalendarDrawerMode = 'over' | 'side'; + +export interface CalendarEvent +{ + id: string; + calendarId: string; + recurringEventId: string | null; + isFirstInstance: boolean; + title: string; + description: string; + start: string | null; + end: string | null; + allDay: boolean; + recurrence: string; +} + +export interface CalendarEventException +{ + id: string; + eventId: string; + exdate: string; +} + +export type CalendarEventPanelMode = 'view' | 'add' | 'edit'; +export type CalendarEventEditMode = 'single' | 'future' | 'all'; + +export interface CalendarSettings +{ + dateFormat: 'DD/MM/YYYY' | 'MM/DD/YYYY' | 'YYYY-MM-DD' | 'll'; + timeFormat: '12' | '24'; + startWeekOn: 6 | 0 | 1; +} + +export interface CalendarWeekday +{ + abbr: string; + label: string; + value: string; +} diff --git a/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.html b/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.html new file mode 100644 index 00000000..730d38ea --- /dev/null +++ b/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.html @@ -0,0 +1,120 @@ +
+ +
Recurrence rules
+ + +
+ + Repeat every + + + + + day(s) + week(s) + month(s) + year(s) + + +
+ + +
+
Repeat on
+ + + {{weekday.abbr}} + + +
+ + +
+ + Repeat on + + Monthly on day {{recurrenceForm.get('monthly.date').value}} + Monthly on the {{nthWeekdayText}} + + +
+ + +
+
+ + Ends + + Never + On + After + + + + + + + + + + occurrence(s) + +
+
+ + +
+ + +
+ +
diff --git a/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.ts b/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.ts new file mode 100644 index 00000000..c5abd23e --- /dev/null +++ b/src/app/modules/admin/apps/calendar/recurrence/recurrence.component.ts @@ -0,0 +1,341 @@ +import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import * as moment from 'moment'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { CalendarService } from 'app/modules/admin/apps/calendar/calendar.service'; +import { CalendarWeekday } from 'app/modules/admin/apps/calendar/calendar.types'; + +@Component({ + selector : 'calendar-recurrence', + templateUrl : './recurrence.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CalendarRecurrenceComponent implements OnInit, OnDestroy +{ + nthWeekdayText: string; + recurrenceForm: FormGroup; + recurrenceFormValues: any; + weekdays: CalendarWeekday[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public matDialogRef: MatDialogRef, + private _calendarService: CalendarService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get weekdays + this._calendarService.weekdays$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((weekdays) => { + + // Store the weekdays + this.weekdays = weekdays; + }); + + // Initialize + this._init(); + + // Create the recurrence form + this.recurrenceForm = this._formBuilder.group({ + freq : [null], + interval: [null, Validators.required], + weekly : this._formBuilder.group({ + byDay: [[]] + }), + monthly : this._formBuilder.group({ + repeatOn : [null], // date | nthWeekday + date : [null], + nthWeekday: [null] + }), + end : this._formBuilder.group({ + type : [null], // never | until | count + until: [null], + count: [null] + }) + }); + + // Subscribe to 'freq' field value changes + this.recurrenceForm.get('freq').valueChanges.subscribe((value) => { + + // Set the end values + this._setEndValues(value); + }); + + // Subscribe to 'weekly.byDay' field value changes + this.recurrenceForm.get('weekly.byDay').valueChanges.subscribe((value) => { + + // Get the event's start date + const startDate = moment(this.data.event.start); + + // If nothing is selected, select the original value from + // the event form to prevent an empty value on the field + if ( !value || !value.length ) + { + // Get the day of event start date + const eventStartDay = startDate.format('dd').toUpperCase(); + + // Set the original value back without emitting a + // change event to prevent an infinite loop + this.recurrenceForm.get('weekly.byDay').setValue([eventStartDay], {emitEvent: false}); + } + }); + + // Patch the form with the values + this.recurrenceForm.patchValue(this.recurrenceFormValues); + + // Set end values for the first time + this._setEndValues(this.recurrenceForm.get('freq').value); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Clear + */ + clear(): void + { + // Close the dialog + this.matDialogRef.close({recurrence: 'cleared'}); + } + + /** + * Done + */ + done(): void + { + // Get the recurrence form values + const recurrenceForm = this.recurrenceForm.value; + + // Prepare the rule array and add the base rules + const ruleArr = ['FREQ=' + recurrenceForm.freq, 'INTERVAL=' + recurrenceForm.interval]; + + // If monthly on certain days... + if ( recurrenceForm.freq === 'MONTHLY' && recurrenceForm.monthly.repeatOn === 'nthWeekday' ) + { + ruleArr.push('BYDAY=' + recurrenceForm.monthly.nthWeekday); + } + + // If weekly... + if ( recurrenceForm.freq === 'WEEKLY' ) + { + // If byDay is an array... + if ( Array.isArray(recurrenceForm.weekly.byDay) ) + { + ruleArr.push('BYDAY=' + recurrenceForm.weekly.byDay.join(',')); + } + // Otherwise + else + { + ruleArr.push('BYDAY=' + recurrenceForm.weekly.byDay); + } + } + + // If one of the end options is selected... + if ( recurrenceForm.end.type === 'until' ) + { + ruleArr.push('UNTIL=' + moment(recurrenceForm.end.until).endOf('day').utc().format('YYYYMMDD[T]HHmmss[Z]')); + } + + if ( recurrenceForm.end.type === 'count' ) + { + ruleArr.push('COUNT=' + recurrenceForm.end.count); + } + + // Generate rule text + const ruleText = ruleArr.join(';'); + + // Close the dialog + this.matDialogRef.close({recurrence: ruleText}); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void + { + // Get the event's start date + const startDate = moment(this.data.event.start); + + // Calculate the weekday + const weekday = moment(this.data.event.start).format('dd').toUpperCase(); + + // Calculate the nthWeekday + let nthWeekdayNo = 1; + while ( startDate.clone().isSame(startDate.clone().subtract(nthWeekdayNo, 'week'), 'month') ) + { + nthWeekdayNo++; + } + const nthWeekday = nthWeekdayNo + weekday; + + // Calculate the nthWeekday as text + const ordinalNumberSuffixes = { + 1: 'st', + 2: 'nd', + 3: 'rd', + 4: 'th', + 5: 'th' + }; + this.nthWeekdayText = nthWeekday.slice(0, 1) + ordinalNumberSuffixes[nthWeekday.slice(0, 1)] + ' ' + + this.weekdays.find((item) => item.value === nthWeekday.slice(-2)).label; + + // Set the defaults on recurrence form values + this.recurrenceFormValues = { + freq : 'DAILY', + interval: 1, + weekly : { + byDay: weekday + }, + monthly : { + repeatOn : 'date', + date : moment(this.data.event.start).date(), + nthWeekday: nthWeekday + }, + end : { + type : 'never', + until: null, + count: null + } + }; + + // If recurrence rule string is available on the + // event meaning that the is a recurring one... + if ( this.data.event.recurrence ) + { + // Parse the rules + const parsedRules: any = {}; + this.data.event.recurrence.split(';').forEach((rule) => { + parsedRules[rule.split('=')[0]] = rule.split('=')[1]; + }); + + // Overwrite the recurrence form values + this.recurrenceFormValues.freq = parsedRules.FREQ; + this.recurrenceFormValues.interval = parsedRules.INTERVAL; + + if ( parsedRules.FREQ === 'WEEKLY' ) + { + this.recurrenceFormValues.weekly.byDay = parsedRules.BYDAY.split(','); + } + + if ( parsedRules.FREQ === 'MONTHLY' ) + { + this.recurrenceFormValues.monthly.repeatOn = parsedRules.BYDAY ? 'nthWeekday' : 'date'; + } + + this.recurrenceFormValues.end.type = parsedRules.UNTIL ? 'until' : (parsedRules.COUNT ? 'count' : 'never'); + this.recurrenceFormValues.end.until = parsedRules.UNTIL || null; + this.recurrenceFormValues.end.count = parsedRules.COUNT || null; + } + } + + /** + * Set the end value based on frequency + * + * @param freq + * @private + */ + private _setEndValues(freq: string): void + { + // Return if freq is not available + if ( !freq ) + { + return; + } + + // Get the event's start date + const startDate = moment(this.data.event.startDate); + + // Get the end type + const endType = this.recurrenceForm.get('end.type').value; + + // If until is not selected + if ( endType !== 'until' ) + { + let until; + + // Change the until's default value based on the frequency + if ( freq === 'DAILY' ) + { + until = startDate.clone().add(1, 'month').toISOString(); + } + + if ( freq === 'WEEKLY' ) + { + until = startDate.clone().add(12, 'weeks').toISOString(); + } + + if ( freq === 'MONTHLY' ) + { + until = startDate.clone().add(12, 'months').toISOString(); + } + + if ( freq === 'YEARLY' ) + { + until = startDate.clone().add(5, 'years').toISOString(); + } + + // Set the until + this.recurrenceForm.get('end.until').setValue(until); + } + + // If count is not selected... + if ( endType !== 'count' ) + { + let count; + + // Change the count's default value based on the frequency + if ( freq === 'DAILY' ) + { + count = 30; + } + + if ( freq === 'WEEKLY' || freq === 'MONTHLY' ) + { + count = 12; + } + + if ( freq === 'YEARLY' ) + { + count = 5; + } + + // Set the count + this.recurrenceForm.get('end.count').setValue(count); + } + } +} diff --git a/src/app/modules/admin/apps/calendar/settings/settings.component.html b/src/app/modules/admin/apps/calendar/settings/settings.component.html new file mode 100644 index 00000000..ba07ebbf --- /dev/null +++ b/src/app/modules/admin/apps/calendar/settings/settings.component.html @@ -0,0 +1,60 @@ +
+ + +
+ + +
+ + + +
Settings
+
+ +
+
+ + Date format + + Aug 20, {{year}} + 12/31/{{year}} + 31/12/{{year}} + {{year}}-12-31 + + + + + Time format + + 1:00pm + 13:30 + + + + + Start week on + + Saturday + Sunday + Monday + + + + +
+
+
+
diff --git a/src/app/modules/admin/apps/calendar/settings/settings.component.ts b/src/app/modules/admin/apps/calendar/settings/settings.component.ts new file mode 100644 index 00000000..f0f62d43 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/settings/settings.component.ts @@ -0,0 +1,96 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { CalendarService } from 'app/modules/admin/apps/calendar/calendar.service'; + +@Component({ + selector : 'calendar-settings', + templateUrl : './settings.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation : ViewEncapsulation.None +}) +export class CalendarSettingsComponent implements OnInit, OnDestroy +{ + settingsForm: FormGroup; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _calendarService: CalendarService, + private _changeDetectorRef: ChangeDetectorRef, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for current year + */ + get year(): string + { + return new Date().getFullYear().toString(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the event form + this.settingsForm = this._formBuilder.group({ + dateFormat : [''], + timeFormat : [''], + startWeekOn: [''] + }); + + // Get settings + this._calendarService.settings$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((settings) => { + + // Fill the settings form + this.settingsForm.patchValue(settings); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + updateSettings(): void + { + // Get the settings + const settings = this.settingsForm.value; + + // Update the settings on the server + this._calendarService.updateSettings(settings).subscribe((updatedSettings) => { + + // Reset the form with the updated settings + this.settingsForm.reset(updatedSettings); + }); + } +} diff --git a/src/app/modules/admin/apps/calendar/sidebar/calendar-colors.ts b/src/app/modules/admin/apps/calendar/sidebar/calendar-colors.ts new file mode 100644 index 00000000..3d4ec0d0 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/sidebar/calendar-colors.ts @@ -0,0 +1,12 @@ +export const calendarColors = [ + 'bg-gray-500', + 'bg-red-500', + 'bg-orange-500', + 'bg-yellow-500', + 'bg-green-500', + 'bg-teal-500', + 'bg-blue-500', + 'bg-indigo-500', + 'bg-purple-500', + 'bg-pink-500' +]; diff --git a/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.html b/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.html new file mode 100644 index 00000000..c3e4eba1 --- /dev/null +++ b/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.html @@ -0,0 +1,116 @@ +
+
Calendar
+ + +
+ Calendars + +
+
+
+ + + {{calendar.title}} +
+ +
+ + + + + + +
+
+ Add calendar + Edit calendar +
+
+ + + + + + +
Calendar color
+
+ + + + +
+
+
+
+ + +
+ + + + +
+
+
+
diff --git a/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.ts b/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.ts new file mode 100644 index 00000000..03bf404e --- /dev/null +++ b/src/app/modules/admin/apps/calendar/sidebar/sidebar.component.ts @@ -0,0 +1,217 @@ +import { Component, EventEmitter, OnDestroy, OnInit, Output, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { cloneDeep } from 'lodash-es'; +import { Calendar } from 'app/modules/admin/apps/calendar/calendar.types'; +import { CalendarService } from 'app/modules/admin/apps/calendar/calendar.service'; +import { calendarColors } from 'app/modules/admin/apps/calendar/sidebar/calendar-colors'; + +@Component({ + selector : 'calendar-sidebar', + templateUrl : './sidebar.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CalendarSidebarComponent implements OnInit, OnDestroy +{ + @ViewChild('editPanel') private _editPanel: TemplateRef; + @Output() readonly calendarUpdated: EventEmitter = new EventEmitter(); + + calendar: Calendar | null; + calendarColors: any = calendarColors; + calendars: Calendar[]; + private _editPanelOverlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _calendarService: CalendarService, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get calendars + this._calendarService.calendars$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((calendars) => { + + // Store the calendars + this.calendars = calendars; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._editPanelOverlayRef ) + { + this._editPanelOverlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open edit panel + */ + openEditPanel(calendar: Calendar): void + { + // Set the calendar + this.calendar = cloneDeep(calendar); + + // Create the overlay if it doesn't exist + if ( !this._editPanelOverlayRef ) + { + this._createEditPanelOverlay(); + } + + // Attach the portal to the overlay + this._editPanelOverlayRef.attach(new TemplatePortal(this._editPanel, this._viewContainerRef)); + } + + /** + * Close the edit panel + */ + closeEditPanel(): void + { + // Detach the overlay from the portal + if ( this._editPanelOverlayRef ) + { + this._editPanelOverlayRef.detach(); + } + } + + /** + * Toggle the calendar visibility + * + * @param calendar + */ + toggleCalendarVisibility(calendar: Calendar): void + { + // Toggle the visibility + calendar.visible = !calendar.visible; + + // Update the calendar + this.saveCalendar(calendar); + } + + /** + * Add calendar + */ + addCalendar(): void + { + // Create a new calendar with default values + const calendar = { + id : null, + title : '', + color : 'bg-blue-500', + visible: true + }; + + // Open the edit panel + this.openEditPanel(calendar); + } + + /** + * Save the calendar + * + * @param calendar + */ + saveCalendar(calendar: Calendar): void + { + // If there is no id on the calendar... + if ( !calendar.id ) + { + // Add calendar to the server + this._calendarService.addCalendar(calendar).subscribe(() => { + + // Close the edit panel + this.closeEditPanel(); + + // Emit the calendarUpdated event + this.calendarUpdated.emit(); + }); + } + // Otherwise... + else + { + // Update the calendar on the server + this._calendarService.updateCalendar(calendar.id, calendar).subscribe(() => { + + // Close the edit panel + this.closeEditPanel(); + + // Emit the calendarUpdated event + this.calendarUpdated.emit(); + }); + } + } + + /** + * Delete the calendar + * + * @param calendar + */ + deleteCalendar(calendar: Calendar): void + { + // Delete the calendar on the server + this._calendarService.deleteCalendar(calendar.id).subscribe(() => { + + // Close the edit panel + this.closeEditPanel(); + + // Emit the calendarUpdated event + this.calendarUpdated.emit(); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Create the edit panel overlay + * @private + */ + private _createEditPanelOverlay(): void + { + // Create the overlay + this._editPanelOverlayRef = this._overlay.create({ + hasBackdrop : true, + scrollStrategy : this._overlay.scrollStrategies.reposition(), + positionStrategy: this._overlay.position() + .global() + .centerHorizontally() + .centerVertically() + }); + + // Detach the overlay from the portal on backdrop click + this._editPanelOverlayRef.backdropClick().subscribe(() => { + this.closeEditPanel(); + this.calendar = null; + }); + } +} diff --git a/src/app/modules/admin/apps/contacts/contacts.component.html b/src/app/modules/admin/apps/contacts/contacts.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.component.html @@ -0,0 +1 @@ + diff --git a/src/app/modules/admin/apps/contacts/contacts.component.ts b/src/app/modules/admin/apps/contacts/contacts.component.ts new file mode 100644 index 00000000..52bd4292 --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'contacts', + templateUrl : './contacts.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ContactsComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/apps/contacts/contacts.guards.ts b/src/app/modules/admin/apps/contacts/contacts.guards.ts new file mode 100644 index 00000000..e6cf5e8f --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.guards.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ContactsDetailsComponent } from 'app/modules/admin/apps/contacts/details/details.component'; + +@Injectable({ + providedIn: 'root' +}) +export class CanDeactivateContactsDetails implements CanDeactivate +{ + canDeactivate( + component: ContactsDetailsComponent, + currentRoute: ActivatedRouteSnapshot, + currentState: RouterStateSnapshot, + nextState: RouterStateSnapshot + ): Observable | Promise | boolean | UrlTree + { + // Get the next route + let nextRoute: ActivatedRouteSnapshot = nextState.root; + while ( nextRoute.firstChild ) + { + nextRoute = nextRoute.firstChild; + } + + // If the next state doesn't contain '/contacts' + // it means we are navigating away from the + // contacts app + if ( !nextState.url.includes('/contacts') ) + { + // Let it navigate + return true; + } + + // If we are navigating to another contact... + if ( nextRoute.paramMap.get('id') ) + { + // Just navigate + return true; + } + // Otherwise... + else + { + // Close the drawer first, and then navigate + return component.closeDrawer().then(() => { + return true; + }); + } + } +} diff --git a/src/app/modules/admin/apps/contacts/contacts.module.ts b/src/app/modules/admin/apps/contacts/contacts.module.ts new file mode 100644 index 00000000..bfbebc32 --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.module.ts @@ -0,0 +1,75 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MAT_DATE_FORMATS, MatRippleModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import * as moment from 'moment'; +import { FuseAutogrowModule } from '@fuse/directives/autogrow'; +import { FuseFindByKeyPipeModule } from '@fuse/pipes/find-by-key'; +import { SharedModule } from 'app/shared/shared.module'; +import { contactsRoutes } from 'app/modules/admin/apps/contacts/contacts.routing'; +import { ContactsComponent } from 'app/modules/admin/apps/contacts/contacts.component'; +import { ContactsDetailsComponent } from 'app/modules/admin/apps/contacts/details/details.component'; +import { ContactsListComponent } from 'app/modules/admin/apps/contacts/list/list.component'; + +@NgModule({ + declarations: [ + ContactsComponent, + ContactsListComponent, + ContactsDetailsComponent + ], + imports : [ + RouterModule.forChild(contactsRoutes), + MatButtonModule, + MatCheckboxModule, + MatDatepickerModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatMomentDateModule, + MatProgressBarModule, + MatRadioModule, + MatRippleModule, + MatSelectModule, + MatSidenavModule, + MatTableModule, + MatTooltipModule, + FuseAutogrowModule, + FuseFindByKeyPipeModule, + SharedModule + ], + providers : [ + { + provide : MAT_DATE_FORMATS, + useValue: { + parse : { + dateInput: moment.ISO_8601 + }, + display: { + dateInput : 'LL', + monthYearLabel : 'MMM YYYY', + dateA11yLabel : 'LL', + monthYearA11yLabel: 'MMMM YYYY' + } + } + } + ] +}) +export class ContactsModule +{ +} diff --git a/src/app/modules/admin/apps/contacts/contacts.resolvers.ts b/src/app/modules/admin/apps/contacts/contacts.resolvers.ts new file mode 100644 index 00000000..89ad16fd --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.resolvers.ts @@ -0,0 +1,138 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { ContactsService } from 'app/modules/admin/apps/contacts/contacts.service'; +import { Contact, Country, Tag } from 'app/modules/admin/apps/contacts/contacts.types'; + +@Injectable({ + providedIn: 'root' +}) +export class ContactsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _contactsService: ContactsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._contactsService.getContacts(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class ContactsContactResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _contactsService: ContactsService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._contactsService.getContactById(route.paramMap.get('id')) + .pipe( + // Error here means the requested contact is not available + catchError((error) => { + + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class ContactsCountriesResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _contactsService: ContactsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._contactsService.getCountries(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class ContactsTagsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _contactsService: ContactsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._contactsService.getTags(); + } +} diff --git a/src/app/modules/admin/apps/contacts/contacts.routing.ts b/src/app/modules/admin/apps/contacts/contacts.routing.ts new file mode 100644 index 00000000..8b00b89c --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.routing.ts @@ -0,0 +1,37 @@ +import { Route } from '@angular/router'; +import { CanDeactivateContactsDetails } from 'app/modules/admin/apps/contacts/contacts.guards'; +import { ContactsContactResolver, ContactsCountriesResolver, ContactsResolver, ContactsTagsResolver } from 'app/modules/admin/apps/contacts/contacts.resolvers'; +import { ContactsComponent } from 'app/modules/admin/apps/contacts/contacts.component'; +import { ContactsListComponent } from 'app/modules/admin/apps/contacts/list/list.component'; +import { ContactsDetailsComponent } from 'app/modules/admin/apps/contacts/details/details.component'; + +export const contactsRoutes: Route[] = [ + { + path : '', + component: ContactsComponent, + resolve : { + tags: ContactsTagsResolver + }, + children : [ + { + path : '', + component: ContactsListComponent, + resolve : { + tasks : ContactsResolver, + countries: ContactsCountriesResolver + }, + children : [ + { + path : ':id', + component : ContactsDetailsComponent, + resolve : { + task : ContactsContactResolver, + countries: ContactsCountriesResolver + }, + canDeactivate: [CanDeactivateContactsDetails] + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/apps/contacts/contacts.service.ts b/src/app/modules/admin/apps/contacts/contacts.service.ts new file mode 100644 index 00000000..cf38779c --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.service.ts @@ -0,0 +1,389 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { filter, map, switchMap, take, tap } from 'rxjs/operators'; +import { Contact, Country, Tag } from 'app/modules/admin/apps/contacts/contacts.types'; + +@Injectable({ + providedIn: 'root' +}) +export class ContactsService +{ + // Private + private _contact: BehaviorSubject = new BehaviorSubject(null); + private _contacts: BehaviorSubject = new BehaviorSubject(null); + private _countries: BehaviorSubject = new BehaviorSubject(null); + private _tags: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for contact + */ + get contact$(): Observable + { + return this._contact.asObservable(); + } + + /** + * Getter for contacts + */ + get contacts$(): Observable + { + return this._contacts.asObservable(); + } + + /** + * Getter for countries + */ + get countries$(): Observable + { + return this._countries.asObservable(); + } + + /** + * Getter for tags + */ + get tags$(): Observable + { + return this._tags.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get contacts + */ + getContacts(): Observable + { + return this._httpClient.get('api/apps/contacts/all').pipe( + tap((contacts) => { + this._contacts.next(contacts); + }) + ); + } + + /** + * Search contacts with given query + * + * @param query + */ + searchContacts(query: string): Observable + { + return this._httpClient.get('api/apps/contacts/search', { + params: {query} + }).pipe( + tap((contacts) => { + this._contacts.next(contacts); + }) + ); + } + + /** + * Get contact by id + */ + getContactById(id: string): Observable + { + return this._contacts.pipe( + take(1), + map((contacts) => { + + // Find the contact + const contact = contacts.find(item => item.id === id) || null; + + // Update the contact + this._contact.next(contact); + + // Return the contact + return contact; + }), + switchMap((contact) => { + + if ( !contact ) + { + return throwError('Could not found contact with id of ' + id + '!'); + } + + return of(contact); + }) + ); + } + + /** + * Create contact + */ + createContact(): Observable + { + return this.contacts$.pipe( + take(1), + switchMap((contacts) => this._httpClient.post('api/apps/contacts/contact', {}).pipe( + map((newContact) => { + + // Update the contacts with the new contact + this._contacts.next([newContact, ...contacts]); + + // Return the new contact + return newContact; + }) + )) + ); + } + + /** + * Update contact + * + * @param id + * @param contact + */ + updateContact(id: string, contact: Contact): Observable + { + return this.contacts$.pipe( + take(1), + switchMap(contacts => this._httpClient.patch('api/apps/contacts/contact', { + id, + contact + }).pipe( + map((updatedContact) => { + + // Find the index of the updated contact + const index = contacts.findIndex(item => item.id === id); + + // Update the contact + contacts[index] = updatedContact; + + // Update the contacts + this._contacts.next(contacts); + + // Return the updated contact + return updatedContact; + }), + switchMap(updatedContact => this.contact$.pipe( + take(1), + filter(item => item && item.id === id), + tap(() => { + + // Update the contact if it's selected + this._contact.next(updatedContact); + + // Return the updated contact + return updatedContact; + }) + )) + )) + ); + } + + /** + * Delete the contact + * + * @param id + */ + deleteContact(id: string): Observable + { + return this.contacts$.pipe( + take(1), + switchMap(contacts => this._httpClient.delete('api/apps/contacts/contact', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted contact + const index = contacts.findIndex(item => item.id === id); + + // Delete the contact + contacts.splice(index, 1); + + // Update the contacts + this._contacts.next(contacts); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Get countries + */ + getCountries(): Observable + { + return this._httpClient.get('api/apps/contacts/countries').pipe( + tap((countries) => { + this._countries.next(countries); + }) + ); + } + + /** + * Get tags + */ + getTags(): Observable + { + return this._httpClient.get('api/apps/contacts/tags').pipe( + tap((tags) => { + this._tags.next(tags); + }) + ); + } + + /** + * Create tag + * + * @param tag + */ + createTag(tag: Tag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.post('api/apps/contacts/tag', {tag}).pipe( + map((newTag) => { + + // Update the tags with the new tag + this._tags.next([...tags, newTag]); + + // Return new tag from observable + return newTag; + }) + )) + ); + } + + /** + * Update the tag + * + * @param id + * @param tag + */ + updateTag(id: string, tag: Tag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.patch('api/apps/contacts/tag', { + id, + tag + }).pipe( + map((updatedTag) => { + + // Find the index of the updated tag + const index = tags.findIndex(item => item.id === id); + + // Update the tag + tags[index] = updatedTag; + + // Update the tags + this._tags.next(tags); + + // Return the updated tag + return updatedTag; + }) + )) + ); + } + + /** + * Delete the tag + * + * @param id + */ + deleteTag(id: string): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.delete('api/apps/contacts/tag', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted tag + const index = tags.findIndex(item => item.id === id); + + // Delete the tag + tags.splice(index, 1); + + // Update the tags + this._tags.next(tags); + + // Return the deleted status + return isDeleted; + }), + filter(isDeleted => isDeleted), + switchMap(isDeleted => this.contacts$.pipe( + take(1), + map((contacts) => { + + // Iterate through the contacts + contacts.forEach((contact) => { + + const tagIndex = contact.tags.findIndex(tag => tag === id); + + // If the contact has the tag, remove it + if ( tagIndex > -1 ) + { + contact.tags.splice(tagIndex, 1); + } + }); + + // Return the deleted status + return isDeleted; + }) + )) + )) + ); + } + + /** + * Update the avatar of the given contact + * + * @param id + * @param avatar + */ + uploadAvatar(id: string, avatar: File): Observable + { + return this.contacts$.pipe( + take(1), + switchMap(contacts => this._httpClient.post('api/apps/contacts/avatar', { + id, + avatar + }, { + headers: { + 'Content-Type': avatar.type + } + }).pipe( + map((updatedContact) => { + + // Find the index of the updated contact + const index = contacts.findIndex(item => item.id === id); + + // Update the contact + contacts[index] = updatedContact; + + // Update the contacts + this._contacts.next(contacts); + + // Return the updated contact + return updatedContact; + }), + switchMap(updatedContact => this.contact$.pipe( + take(1), + filter(item => item && item.id === id), + tap(() => { + + // Update the contact if it's selected + this._contact.next(updatedContact); + + // Return the updated contact + return updatedContact; + }) + )) + )) + ); + } +} diff --git a/src/app/modules/admin/apps/contacts/contacts.types.ts b/src/app/modules/admin/apps/contacts/contacts.types.ts new file mode 100644 index 00000000..8befb04b --- /dev/null +++ b/src/app/modules/admin/apps/contacts/contacts.types.ts @@ -0,0 +1,37 @@ +export interface Contact +{ + id: string; + avatar?: string | null; + background?: string | null; + name: string; + emails?: { + email: string, + label: string + }[]; + phoneNumbers?: { + country: string; + number: string; + label: string + }[]; + title?: string; + company?: string; + birthday?: string | null; + address?: string | null; + notes?: string | null; + tags: string[]; +} + +export interface Country +{ + id: string; + iso: string; + name: string; + code: string; + flagImagePos: string; +} + +export interface Tag +{ + id?: string; + title?: string; +} diff --git a/src/app/modules/admin/apps/contacts/details/details.component.html b/src/app/modules/admin/apps/contacts/details/details.component.html new file mode 100644 index 00000000..ecf5827e --- /dev/null +++ b/src/app/modules/admin/apps/contacts/details/details.component.html @@ -0,0 +1,641 @@ +
+ + + + + +
+ + + + + +
+ +
+
+ + +
+
+ + +
+ +
+ +
+ {{contact.name.charAt(0)}} +
+
+ +
+ +
+
+ + +
{{contact.name}}
+ + + +
+ + +
+ {{tag.title}} +
+
+
+
+ +
+ + +
+ +
{{contact.title}}
+
+
+ + + +
+ +
{{contact.company}}
+
+
+ + + +
+ +
+ +
+ + {{email.email}} + +
+ + {{email.label}} +
+
+
+
+
+
+ + + +
+ +
+ +
+ +
{{getCountryByIso(phoneNumber.country).code}}
+
{{phoneNumber.number}}
+
+ + {{phoneNumber.label}} +
+
+
+
+
+
+ + + +
+ +
{{contact.address}}
+
+
+ + + +
+ +
{{contact.birthday | date:'longDate'}}
+
+
+ + + +
+ +
+
+
+
+ +
+
+
+ + + + + +
+ + + + + +
+ +
+
+ + +
+
+
+ + +
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+ {{contact.name.charAt(0)}} +
+
+
+ + +
+ + Name + + + +
+ + +
+ + + +
+ {{tag.title}} +
+
+
+ +
+ + + + Edit + + + + + Add + + + + +
+ +
+
+ +
+ +
+
+ +
+
+ + +
+ + +
{{tag.title}}
+
+
+ + +
+
+ + + + +
+
+
+ +
+ +
Create "{{newTagInput.value}}"
+
+
+
+
+
+
+ + +
+ + Title + + + +
+ + +
+ + Company + + + +
+ + +
+
+ +
+ + Email + + + + + Label + + + + + +
+ +
+
+
+
+
+
+ + Add an email address +
+
+ + +
+
+ +
+ + Phone + + + + + + {{getCountryByIso(phoneNumber.get('country').value).code}} + + + + + + {{country.name}} + {{country.code}} + + + + + + Label + + + + + +
+ +
+
+
+
+
+
+ + Add a phone number +
+
+ + +
+ + Address + + + +
+ + +
+ + Birthday + + + + + + +
+ + +
+ + Notes + + + +
+ + +
+ + + + + + +
+ +
+
+
+
+
diff --git a/src/app/modules/admin/apps/contacts/details/details.component.ts b/src/app/modules/admin/apps/contacts/details/details.component.ts new file mode 100644 index 00000000..56c3c49b --- /dev/null +++ b/src/app/modules/admin/apps/contacts/details/details.component.ts @@ -0,0 +1,711 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, Renderer2, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { MatDrawerToggleResult } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { debounceTime, takeUntil } from 'rxjs/operators'; +import { Contact, Country, Tag } from 'app/modules/admin/apps/contacts/contacts.types'; +import { ContactsListComponent } from 'app/modules/admin/apps/contacts/list/list.component'; +import { ContactsService } from 'app/modules/admin/apps/contacts/contacts.service'; + +@Component({ + selector : 'contacts-details', + templateUrl : './details.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ContactsDetailsComponent implements OnInit, OnDestroy +{ + @ViewChild('avatarFileInput') private _avatarFileInput: ElementRef; + @ViewChild('tagsPanel') private _tagsPanel: TemplateRef; + @ViewChild('tagsPanelOrigin') private _tagsPanelOrigin: ElementRef; + + editMode: boolean = false; + tags: Tag[]; + tagsEditMode: boolean = false; + filteredTags: Tag[]; + contact: Contact; + contactForm: FormGroup; + contacts: Contact[]; + countries: Country[]; + private _tagsPanelOverlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + private _contactsListComponent: ContactsListComponent, + private _contactsService: ContactsService, + private _formBuilder: FormBuilder, + private _renderer2: Renderer2, + private _router: Router, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Open the drawer + this._contactsListComponent.matDrawer.open(); + + // Create the contact form + this.contactForm = this._formBuilder.group({ + id : [''], + avatar : [null], + name : ['', [Validators.required]], + emails : this._formBuilder.array([]), + phoneNumbers: this._formBuilder.array([]), + title : [''], + company : [''], + birthday : [null], + address : [null], + notes : [null], + tags : [[]] + }); + + // Get the contacts + this._contactsService.contacts$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((contacts: Contact[]) => { + this.contacts = contacts; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the contact + this._contactsService.contact$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((contact: Contact) => { + + // Open the drawer in case it is closed + this._contactsListComponent.matDrawer.open(); + + // Get the contact + this.contact = contact; + + // Clear the emails and phoneNumbers form arrays + (this.contactForm.get('emails') as FormArray).clear(); + (this.contactForm.get('phoneNumbers') as FormArray).clear(); + + // Patch values to the form + this.contactForm.patchValue(contact); + + // Setup the emails form array + const emailFormGroups = []; + + if ( contact.emails.length > 0 ) + { + // Iterate through them + contact.emails.forEach((email) => { + + // Create an email form group + emailFormGroups.push( + this._formBuilder.group({ + email: [email.email], + label: [email.label] + }) + ); + }); + } + else + { + // Create an email form group + emailFormGroups.push( + this._formBuilder.group({ + email: [''], + label: [''] + }) + ); + } + + // Add the email form groups to the emails form array + emailFormGroups.forEach((emailFormGroup) => { + (this.contactForm.get('emails') as FormArray).push(emailFormGroup); + }); + + // Setup the phone numbers form array + const phoneNumbersFormGroups = []; + + if ( contact.phoneNumbers.length > 0 ) + { + // Iterate through them + contact.phoneNumbers.forEach((phoneNumber) => { + + // Create an email form group + phoneNumbersFormGroups.push( + this._formBuilder.group({ + country: [phoneNumber.country], + number : [phoneNumber.number], + label : [phoneNumber.label] + }) + ); + }); + } + else + { + // Create a phone number form group + phoneNumbersFormGroups.push( + this._formBuilder.group({ + country: ['us'], + number : [''], + label : [''] + }) + ); + } + + // Add the phone numbers form groups to the phone numbers form array + phoneNumbersFormGroups.forEach((phoneNumbersFormGroup) => { + (this.contactForm.get('phoneNumbers') as FormArray).push(phoneNumbersFormGroup); + }); + + // Toggle the edit mode off + this.toggleEditMode(false); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the country telephone codes + this._contactsService.countries$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((codes: Country[]) => { + this.countries = codes; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the tags + this._contactsService.tags$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tags: Tag[]) => { + this.tags = tags; + this.filteredTags = tags; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlays if they are still on the DOM + if ( this._tagsPanelOverlayRef ) + { + this._tagsPanelOverlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Close the drawer + */ + closeDrawer(): Promise + { + return this._contactsListComponent.matDrawer.close(); + } + + /** + * Toggle edit mode + * + * @param editMode + */ + toggleEditMode(editMode: boolean | null = null): void + { + if ( editMode === null ) + { + this.editMode = !this.editMode; + } + else + { + this.editMode = editMode; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Update the contact + */ + updateContact(): void + { + // Get the contact object + const contact = this.contactForm.getRawValue(); + + // Go through the contact object and clear empty values + contact.emails = contact.emails.filter((email) => { + return email.email; + }); + + contact.phoneNumbers = contact.phoneNumbers.filter((phoneNumber) => { + return phoneNumber.number; + }); + + // Update the contact on the server + this._contactsService.updateContact(contact.id, contact).subscribe(() => { + + // Toggle the edit mode off + this.toggleEditMode(false); + }); + } + + /** + * Delete the contact + */ + deleteContact(): void + { + // Get the current contact's id + const id = this.contact.id; + + // Get the next/previous contact's id + const currentContactIndex = this.contacts.findIndex(item => item.id === id); + const nextContactIndex = currentContactIndex + ((currentContactIndex === (this.contacts.length - 1)) ? -1 : 1); + const nextContactId = (this.contacts.length === 1 && this.contacts[0].id === id) ? null : this.contacts[nextContactIndex].id; + + // Delete the contact + this._contactsService.deleteContact(id) + .subscribe((isDeleted) => { + + // Return if the contact wasn't deleted... + if ( !isDeleted ) + { + return; + } + + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Navigate to the next contact if available + if ( nextContactId ) + { + this._router.navigate(['../', nextContactId], {relativeTo: route}); + } + // Otherwise, navigate to the parent + else + { + this._router.navigate(['../'], {relativeTo: route}); + } + + // Toggle the edit mode off + this.toggleEditMode(false); + }); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Upload avatar + * + * @param fileList + */ + uploadAvatar(fileList: FileList): void + { + // Return if canceled + if ( !fileList.length ) + { + return; + } + + const allowedTypes = ['image/jpeg', 'image/png']; + const file = fileList[0]; + + // Return if the file is not allowed + if ( !allowedTypes.includes(file.type) ) + { + return; + } + + // Upload the avatar + this._contactsService.uploadAvatar(this.contact.id, file).subscribe(); + } + + /** + * Remove the avatar + */ + removeAvatar(): void + { + // Get the form control for 'avatar' + const avatarFormControl = this.contactForm.get('avatar'); + + // Set the avatar as null + avatarFormControl.setValue(null); + + // Set the file input value as null + this._avatarFileInput.nativeElement.value = null; + + // Update the contact + this.contact.avatar = null; + } + + /** + * Open tags panel + */ + openTagsPanel(): void + { + // Create the overlay + this._tagsPanelOverlayRef = this._overlay.create({ + backdropClass : '', + hasBackdrop : true, + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._tagsPanelOrigin.nativeElement) + .withFlexibleDimensions() + .withViewportMargin(64) + .withLockedPosition() + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + } + ]) + }); + + // Subscribe to the attachments observable + this._tagsPanelOverlayRef.attachments().subscribe(() => { + + // Add a class to the origin + this._renderer2.addClass(this._tagsPanelOrigin.nativeElement, 'panel-opened'); + + // Focus to the search input once the overlay has been attached + this._tagsPanelOverlayRef.overlayElement.querySelector('input').focus(); + }); + + // Create a portal from the template + const templatePortal = new TemplatePortal(this._tagsPanel, this._viewContainerRef); + + // Attach the portal to the overlay + this._tagsPanelOverlayRef.attach(templatePortal); + + // Subscribe to the backdrop click + this._tagsPanelOverlayRef.backdropClick().subscribe(() => { + + // Remove the class from the origin + this._renderer2.removeClass(this._tagsPanelOrigin.nativeElement, 'panel-opened'); + + // If overlay exists and attached... + if ( this._tagsPanelOverlayRef && this._tagsPanelOverlayRef.hasAttached() ) + { + // Detach it + this._tagsPanelOverlayRef.detach(); + + // Reset the tag filter + this.filteredTags = this.tags; + + // Toggle the edit mode off + this.tagsEditMode = false; + } + + // If template portal exists and attached... + if ( templatePortal && templatePortal.isAttached ) + { + // Detach it + templatePortal.detach(); + } + }); + } + + /** + * Toggle the tags edit mode + */ + toggleTagsEditMode(): void + { + this.tagsEditMode = !this.tagsEditMode; + } + + /** + * Filter tags + * + * @param event + */ + filterTags(event): void + { + // Get the value + const value = event.target.value.toLowerCase(); + + // Filter the tags + this.filteredTags = this.tags.filter(tag => tag.title.toLowerCase().includes(value)); + } + + /** + * Filter tags input key down event + * + * @param event + */ + filterTagsInputKeyDown(event): void + { + // Return if the pressed key is not 'Enter' + if ( event.key !== 'Enter' ) + { + return; + } + + // If there is no tag available... + if ( this.filteredTags.length === 0 ) + { + // Create the tag + this.createTag(event.target.value); + + // Clear the input + event.target.value = ''; + + // Return + return; + } + + // If there is a tag... + const tag = this.filteredTags[0]; + const isTagApplied = this.contact.tags.find((id) => id === tag.id); + + // If the found tag is already applied to the contact... + if ( isTagApplied ) + { + // Remove the tag from the contact + this.removeTagFromContact(tag); + } + else + { + // Otherwise add the tag to the contact + this.addTagToContact(tag); + } + } + + /** + * Create a new tag + * + * @param title + */ + createTag(title: string): void + { + const tag = { + title + }; + + // Create tag on the server + this._contactsService.createTag(tag) + .subscribe((response) => { + + // Add the tag to the contact + this.addTagToContact(response); + }); + } + + /** + * Update the tag title + * + * @param tag + * @param event + */ + updateTagTitle(tag: Tag, event): void + { + // Update the title on the tag + tag.title = event.target.value; + + // Update the tag on the server + this._contactsService.updateTag(tag.id, tag) + .pipe(debounceTime(300)) + .subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Delete the tag + * + * @param tag + */ + deleteTag(tag: Tag): void + { + // Delete the tag from the server + this._contactsService.deleteTag(tag.id).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Add tag to the contact + * + * @param tag + */ + addTagToContact(tag: Tag): void + { + // Add the tag + this.contact.tags.unshift(tag.id); + + // Update the contact form + this.contactForm.get('tags').patchValue(this.contact.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Remove tag from the contact + * + * @param tag + */ + removeTagFromContact(tag: Tag): void + { + // Remove the tag + this.contact.tags.splice(this.contact.tags.findIndex(item => item === tag.id), 1); + + // Update the contact form + this.contactForm.get('tags').patchValue(this.contact.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle contact tag + * + * @param tag + */ + toggleContactTag(tag: Tag): void + { + if ( this.contact.tags.includes(tag.id) ) + { + this.removeTagFromContact(tag); + } + else + { + this.addTagToContact(tag); + } + } + + /** + * Should the create tag button be visible + * + * @param inputValue + */ + shouldShowCreateTagButton(inputValue: string): boolean + { + return !!!(inputValue === '' || this.tags.findIndex(tag => tag.title.toLowerCase() === inputValue.toLowerCase()) > -1); + } + + /** + * Add the email field + */ + addEmailField(): void + { + // Create an empty email form group + const emailFormGroup = this._formBuilder.group({ + email: [''], + label: [''] + }); + + // Add the email form group to the emails form array + (this.contactForm.get('emails') as FormArray).push(emailFormGroup); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Remove the email field + * + * @param index + */ + removeEmailField(index: number): void + { + // Get form array for emails + const emailsFormArray = this.contactForm.get('emails') as FormArray; + + // Remove the email field + emailsFormArray.removeAt(index); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Add an empty phone number field + */ + addPhoneNumberField(): void + { + // Create an empty phone number form group + const phoneNumberFormGroup = this._formBuilder.group({ + country: ['us'], + number : [''], + label : [''] + }); + + // Add the phone number form group to the phoneNumbers form array + (this.contactForm.get('phoneNumbers') as FormArray).push(phoneNumberFormGroup); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Remove the phone number field + * + * @param index + */ + removePhoneNumberField(index: number): void + { + // Get form array for phone numbers + const phoneNumbersFormArray = this.contactForm.get('phoneNumbers') as FormArray; + + // Remove the phone number field + phoneNumbersFormArray.removeAt(index); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Get country info by iso code + * + * @param iso + */ + getCountryByIso(iso: string): Country + { + return this.countries.find((country) => country.iso === iso); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/contacts/list/list.component.html b/src/app/modules/admin/apps/contacts/list/list.component.html new file mode 100644 index 00000000..55d0a961 --- /dev/null +++ b/src/app/modules/admin/apps/contacts/list/list.component.html @@ -0,0 +1,120 @@ +
+ + + + + + + + + + + +
+ + +
+ + +
+
Contacts
+
+ + {{contactsCount}} + + {{contactsCount | i18nPlural: { + '=0' : 'No contacts', + '=1' : 'contact', + 'other': 'contacts' + } }} +
+
+ + +
+ +
+ + + + +
+ + +
+
+ + +
+ + + + + +
+ {{contact.name.charAt(0)}} +
+
+ +
+
+ + Contact avatar + + +
+ {{contact.name.charAt(0)}} +
+
+
+
+
{{contact.name}}
+
{{contact.title}}
+
+
+
+
+
+ + + +
There are no contacts!
+
+ +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/apps/contacts/list/list.component.ts b/src/app/modules/admin/apps/contacts/list/list.component.ts new file mode 100644 index 00000000..a1ac2df4 --- /dev/null +++ b/src/app/modules/admin/apps/contacts/list/list.component.ts @@ -0,0 +1,241 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FormControl } from '@angular/forms'; +import { MatDrawer } from '@angular/material/sidenav'; +import { fromEvent, Observable, Subject } from 'rxjs'; +import { filter, switchMap, takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { Contact, Country } from 'app/modules/admin/apps/contacts/contacts.types'; +import { ContactsService } from 'app/modules/admin/apps/contacts/contacts.service'; + +@Component({ + selector : 'contacts-list', + templateUrl : './list.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ContactsListComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + + contacts$: Observable; + + contactsCount: number = 0; + contactsTableColumns: string[] = ['name', 'email', 'phoneNumber', 'job']; + countries: Country[]; + drawerMode: 'side' | 'over'; + searchInputControl: FormControl = new FormControl(); + selectedContact: Contact; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + private _contactsService: ContactsService, + @Inject(DOCUMENT) private _document: any, + private _router: Router, + private _fuseMediaWatcherService: FuseMediaWatcherService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the contacts + this.contacts$ = this._contactsService.contacts$; + this._contactsService.contacts$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((contacts: Contact[]) => { + + // Update the counts + this.contactsCount = contacts.length; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the contact + this._contactsService.contact$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((contact: Contact) => { + + // Update the selected contact + this.selectedContact = contact; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the countries + this._contactsService.countries$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((countries: Country[]) => { + + // Update the countries + this.countries = countries; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to search input field value changes + this.searchInputControl.valueChanges + .pipe( + takeUntil(this._unsubscribeAll), + switchMap((query) => { + + // Search + return this._contactsService.searchContacts(query); + }) + ) + .subscribe(); + + // Subscribe to MatDrawer opened change + this.matDrawer.openedChange.subscribe((opened) => { + if ( !opened ) + { + // Remove the selected contact when drawer closed + this.selectedContact = null; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + }); + + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode if the given breakpoint is active + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + } + else + { + this.drawerMode = 'over'; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Listen for shortcuts + fromEvent(this._document, 'keydown') + .pipe( + takeUntil(this._unsubscribeAll), + filter((event) => { + return (event.ctrlKey === true || event.metaKey) // Ctrl or Cmd + && (event.key === '/'); // '/' + }) + ) + .subscribe(() => { + this.createContact(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Go to contact + * + * @param id + */ + goToContact(id: string): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go to contact + this._router.navigate(['../', id], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * On backdrop clicked + */ + onBackdropClicked(): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go to the parent route + this._router.navigate(['../'], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Create contact + */ + createContact(): void + { + // Create the contact + this._contactsService.createContact().subscribe((newContact) => { + + // Go to new contact + this.goToContact(newContact.id); + }); + } + + /** + * Get country code + * + * @param iso + */ + getCountryCode(iso: string): string + { + if ( !iso ) + { + return ''; + } + + return this.countries.find((country) => country.iso === iso).code; + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/ecommerce/ecommerce.module.ts b/src/app/modules/admin/apps/ecommerce/ecommerce.module.ts new file mode 100644 index 00000000..1a06f40b --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/ecommerce.module.ts @@ -0,0 +1,48 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSortModule } from '@angular/material/sort'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { SharedModule } from 'app/shared/shared.module'; +import { InventoryComponent } from 'app/modules/admin/apps/ecommerce/inventory/inventory.component'; +import { InventoryListComponent } from 'app/modules/admin/apps/ecommerce/inventory/list/inventory.component'; +import { ecommerceRoutes } from 'app/modules/admin/apps/ecommerce/ecommerce.routing'; + +@NgModule({ + declarations: [ + InventoryComponent, + InventoryListComponent + ], + imports : [ + RouterModule.forChild(ecommerceRoutes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatPaginatorModule, + MatProgressBarModule, + MatRippleModule, + MatSortModule, + MatSelectModule, + MatSlideToggleModule, + MatTableModule, + MatTooltipModule, + SharedModule + ] +}) +export class ECommerceModule +{ +} diff --git a/src/app/modules/admin/apps/ecommerce/ecommerce.routing.ts b/src/app/modules/admin/apps/ecommerce/ecommerce.routing.ts new file mode 100644 index 00000000..a749332d --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/ecommerce.routing.ts @@ -0,0 +1,50 @@ +import { Route } from '@angular/router'; +import { InventoryComponent } from 'app/modules/admin/apps/ecommerce/inventory/inventory.component'; +import { InventoryListComponent } from 'app/modules/admin/apps/ecommerce/inventory/list/inventory.component'; +import { InventoryBrandsResolver, InventoryCategoriesResolver, InventoryProductsResolver, InventoryTagsResolver, InventoryVendorsResolver } from 'app/modules/admin/apps/ecommerce/inventory/inventory.resolvers'; + +export const ecommerceRoutes: Route[] = [ + { + path : '', + pathMatch : 'full', + redirectTo: 'inventory' + }, + { + path : 'inventory', + component: InventoryComponent, + children : [ + { + path : '', + component: InventoryListComponent, + resolve : { + brands : InventoryBrandsResolver, + categories: InventoryCategoriesResolver, + products : InventoryProductsResolver, + tags : InventoryTagsResolver, + vendors : InventoryVendorsResolver + } + } + ] + /*children : [ + { + path : '', + component: ContactsListComponent, + resolve : { + tasks : ContactsResolver, + countries: ContactsCountriesResolver + }, + children : [ + { + path : ':id', + component : ContactsDetailsComponent, + resolve : { + task : ContactsContactResolver, + countries: ContactsCountriesResolver + }, + canDeactivate: [CanDeactivateContactsDetails] + } + ] + } + ]*/ + } +]; diff --git a/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.html b/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.html @@ -0,0 +1 @@ + diff --git a/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.ts b/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.ts new file mode 100644 index 00000000..209f1e4c --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/inventory.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'inventory', + templateUrl : './inventory.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class InventoryComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/apps/ecommerce/inventory/inventory.resolvers.ts b/src/app/modules/admin/apps/ecommerce/inventory/inventory.resolvers.ts new file mode 100644 index 00000000..47b83a18 --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/inventory.resolvers.ts @@ -0,0 +1,194 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { InventoryService } from 'app/modules/admin/apps/ecommerce/inventory/inventory.service'; +import { InventoryBrand, InventoryCategory, InventoryPagination, InventoryProduct, InventoryTag, InventoryVendor } from 'app/modules/admin/apps/ecommerce/inventory/inventory.types'; + +@Injectable({ + providedIn: 'root' +}) +export class InventoryBrandsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _inventoryService: InventoryService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._inventoryService.getBrands(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class InventoryCategoriesResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _inventoryService: InventoryService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._inventoryService.getCategories(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class InventoryProductResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _inventoryService: InventoryService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._inventoryService.getProductById(route.paramMap.get('id')) + .pipe( + // Error here means the requested product is not available + catchError((error) => { + + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class InventoryProductsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _inventoryService: InventoryService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<{ pagination: InventoryPagination, products: InventoryProduct[] }> + { + return this._inventoryService.getProducts(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class InventoryTagsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _inventoryService: InventoryService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._inventoryService.getTags(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class InventoryVendorsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _inventoryService: InventoryService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._inventoryService.getVendors(); + } +} diff --git a/src/app/modules/admin/apps/ecommerce/inventory/inventory.service.ts b/src/app/modules/admin/apps/ecommerce/inventory/inventory.service.ts new file mode 100644 index 00000000..50a13b68 --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/inventory.service.ts @@ -0,0 +1,441 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { filter, map, switchMap, take, tap } from 'rxjs/operators'; +import { InventoryBrand, InventoryCategory, InventoryPagination, InventoryProduct, InventoryTag, InventoryVendor } from 'app/modules/admin/apps/ecommerce/inventory/inventory.types'; + +@Injectable({ + providedIn: 'root' +}) +export class InventoryService +{ + // Private + private _brands: BehaviorSubject = new BehaviorSubject(null); + private _categories: BehaviorSubject = new BehaviorSubject(null); + private _pagination: BehaviorSubject = new BehaviorSubject(null); + private _product: BehaviorSubject = new BehaviorSubject(null); + private _products: BehaviorSubject = new BehaviorSubject(null); + private _tags: BehaviorSubject = new BehaviorSubject(null); + private _vendors: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for brands + */ + get brands$(): Observable + { + return this._brands.asObservable(); + } + + /** + * Getter for categories + */ + get categories$(): Observable + { + return this._categories.asObservable(); + } + + /** + * Getter for pagination + */ + get pagination$(): Observable + { + return this._pagination.asObservable(); + } + + /** + * Getter for product + */ + get product$(): Observable + { + return this._product.asObservable(); + } + + /** + * Getter for products + */ + get products$(): Observable + { + return this._products.asObservable(); + } + + /** + * Getter for tags + */ + get tags$(): Observable + { + return this._tags.asObservable(); + } + + /** + * Getter for vendors + */ + get vendors$(): Observable + { + return this._vendors.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get brands + */ + getBrands(): Observable + { + return this._httpClient.get('api/apps/ecommerce/inventory/brands').pipe( + tap((brands) => { + this._brands.next(brands); + }) + ); + } + + /** + * Get categories + */ + getCategories(): Observable + { + return this._httpClient.get('api/apps/ecommerce/inventory/categories').pipe( + tap((categories) => { + this._categories.next(categories); + }) + ); + } + + /** + * Get products + * + * + * @param page + * @param size + * @param sort + * @param order + * @param search + */ + getProducts(page: number = 0, size: number = 10, sort: string = 'name', order: 'asc' | 'desc' | '' = 'asc', search: string = ''): + Observable<{ pagination: InventoryPagination, products: InventoryProduct[] }> + { + return this._httpClient.get<{ pagination: InventoryPagination, products: InventoryProduct[] }>('api/apps/ecommerce/inventory/products', { + params: { + page: '' + page, + size: '' + size, + sort, + order, + search + } + }).pipe( + tap((response) => { + this._pagination.next(response.pagination); + this._products.next(response.products); + }) + ); + } + + /** + * Get product by id + */ + getProductById(id: string): Observable + { + return this._products.pipe( + take(1), + map((products) => { + + // Find the product + const product = products.find(item => item.id === id) || null; + + // Update the product + this._product.next(product); + + // Return the product + return product; + }), + switchMap((product) => { + + if ( !product ) + { + return throwError('Could not found product with id of ' + id + '!'); + } + + return of(product); + }) + ); + } + + /** + * Create product + */ + createProduct(): Observable + { + return this.products$.pipe( + take(1), + switchMap((products) => this._httpClient.post('api/apps/ecommerce/inventory/product', {}).pipe( + map((newProduct) => { + + // Update the products with the new product + this._products.next([newProduct, ...products]); + + // Return the new product + return newProduct; + }) + )) + ); + } + + /** + * Update product + * + * @param id + * @param product + */ + updateProduct(id: string, product: InventoryProduct): Observable + { + return this.products$.pipe( + take(1), + switchMap(products => this._httpClient.patch('api/apps/ecommerce/inventory/product', { + id, + product + }).pipe( + map((updatedProduct) => { + + // Find the index of the updated product + const index = products.findIndex(item => item.id === id); + + // Update the product + products[index] = updatedProduct; + + // Update the products + this._products.next(products); + + // Return the updated product + return updatedProduct; + }), + switchMap(updatedProduct => this.product$.pipe( + take(1), + filter(item => item && item.id === id), + tap(() => { + + // Update the product if it's selected + this._product.next(updatedProduct); + + // Return the updated product + return updatedProduct; + }) + )) + )) + ); + } + + /** + * Delete the product + * + * @param id + */ + deleteProduct(id: string): Observable + { + return this.products$.pipe( + take(1), + switchMap(products => this._httpClient.delete('api/apps/ecommerce/inventory/product', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted product + const index = products.findIndex(item => item.id === id); + + // Delete the product + products.splice(index, 1); + + // Update the products + this._products.next(products); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } + + /** + * Get tags + */ + getTags(): Observable + { + return this._httpClient.get('api/apps/ecommerce/inventory/tags').pipe( + tap((tags) => { + this._tags.next(tags); + }) + ); + } + + /** + * Create tag + * + * @param tag + */ + createTag(tag: InventoryTag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.post('api/apps/ecommerce/inventory/tag', {tag}).pipe( + map((newTag) => { + + // Update the tags with the new tag + this._tags.next([...tags, newTag]); + + // Return new tag from observable + return newTag; + }) + )) + ); + } + + /** + * Update the tag + * + * @param id + * @param tag + */ + updateTag(id: string, tag: InventoryTag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.patch('api/apps/ecommerce/inventory/tag', { + id, + tag + }).pipe( + map((updatedTag) => { + + // Find the index of the updated tag + const index = tags.findIndex(item => item.id === id); + + // Update the tag + tags[index] = updatedTag; + + // Update the tags + this._tags.next(tags); + + // Return the updated tag + return updatedTag; + }) + )) + ); + } + + /** + * Delete the tag + * + * @param id + */ + deleteTag(id: string): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.delete('api/apps/ecommerce/inventory/tag', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted tag + const index = tags.findIndex(item => item.id === id); + + // Delete the tag + tags.splice(index, 1); + + // Update the tags + this._tags.next(tags); + + // Return the deleted status + return isDeleted; + }), + filter(isDeleted => isDeleted), + switchMap(isDeleted => this.products$.pipe( + take(1), + map((products) => { + + // Iterate through the contacts + products.forEach((product) => { + + const tagIndex = product.tags.findIndex(tag => tag === id); + + // If the contact has the tag, remove it + if ( tagIndex > -1 ) + { + product.tags.splice(tagIndex, 1); + } + }); + + // Return the deleted status + return isDeleted; + }) + )) + )) + ); + } + + /** + * Get vendors + */ + getVendors(): Observable + { + return this._httpClient.get('api/apps/ecommerce/inventory/vendors').pipe( + tap((vendors) => { + this._vendors.next(vendors); + }) + ); + } + + /** + * Update the avatar of the given contact + * + * @param id + * @param avatar + */ + /*uploadAvatar(id: string, avatar: File): Observable + { + return this.contacts$.pipe( + take(1), + switchMap(contacts => this._httpClient.post('api/apps/contacts/avatar', { + id, + avatar + }, { + headers: { + 'Content-Type': avatar.type + } + }).pipe( + map((updatedContact) => { + + // Find the index of the updated contact + const index = contacts.findIndex(item => item.id === id); + + // Update the contact + contacts[index] = updatedContact; + + // Update the contacts + this._contacts.next(contacts); + + // Return the updated contact + return updatedContact; + }), + switchMap(updatedContact => this.contact$.pipe( + take(1), + filter(item => item && item.id === id), + tap(() => { + + // Update the contact if it's selected + this._contact.next(updatedContact); + + // Return the updated contact + return updatedContact; + }) + )) + )) + ); + }*/ +} diff --git a/src/app/modules/admin/apps/ecommerce/inventory/inventory.types.ts b/src/app/modules/admin/apps/ecommerce/inventory/inventory.types.ts new file mode 100644 index 00000000..5daed0ee --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/inventory.types.ts @@ -0,0 +1,60 @@ +export interface InventoryProduct +{ + id: string; + category?: string; + name: string; + description?: string; + tags?: string[]; + sku?: string | null; + barcode?: string | null; + brand?: string | null; + vendor: string | null; + stock: number; + reserved: number; + cost: number; + basePrice: number; + taxPercent: number; + price: number; + weight: number; + thumbnail: string; + images: string[]; + active: boolean; +} + +export interface InventoryPagination +{ + length: number; + size: number; + page: number; + lastPage: number; + startIndex: number; + endIndex: number; +} + +export interface InventoryCategory +{ + id: string; + parentId: string; + name: string; + slug: string; +} + +export interface InventoryBrand +{ + id: string; + name: string; + slug: string; +} + +export interface InventoryTag +{ + id?: string; + title?: string; +} + +export interface InventoryVendor +{ + id: string; + name: string; + slug: string; +} diff --git a/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.html b/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.html new file mode 100644 index 00000000..77927ab8 --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.html @@ -0,0 +1,567 @@ +
+ + +
+ +
+ +
+ +
Inventory
+ +
+ + + + + + + +
+
+ + +
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ SKU + +
+ + + + No Image + + + {{product.sku}} +
+
+ Name + + {{product.name}} + + Price + + {{product.price | currency:'USD':'symbol':'1.2-2'}} + + Stock + + + {{product.stock}} + + + + + + + + + + + + + + + Active + + + + + Details + + + +
+
+ +
+ +
+ + +
+
+
+ + + + + NO IMAGE + +
+
+ + + {{selectedProductForm.get('currentImageIndex').value + 1}} of {{selectedProductForm.get('images').value.length}} + + +
+
+
+ Product status + + {{selectedProductForm.get('active').value === true ? 'Active' : 'Disabled'}} + +
+
+ +
+
+ + + + Name + + + + +
+ + SKU + + + + Barcode + + +
+ + +
+ + Category + + + {{category.name}} + + + + + Brand + + + {{brand.name}} + + + + + Vendor + + + {{vendor.name}} + + + +
+ + +
+ + Stock + + + + Reserved + + +
+
+ + +
+ + Cost + $ + + + + Base Price + $ + + + + Tax + % + + + + Price + $ + + +
+ + +
+ + Weight + lbs. + + + + + + Tags +
+ +
+
+ + +
+ +
+ +
+ + + + + {{tag.title}} + + + + + +
+ + + + + + +
+
+
+
+ +
Create "{{newTagInput.value}}"
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ + + Product updated + + + + An error occurred, try again! + +
+ +
+
+ +
+
+
+
+ +
+ + + +
+ + +
There are no products!
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.ts b/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.ts new file mode 100644 index 00000000..5b35c2c1 --- /dev/null +++ b/src/app/modules/admin/apps/ecommerce/inventory/list/inventory.component.ts @@ -0,0 +1,552 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { MatCheckboxChange } from '@angular/material/checkbox'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { merge, Observable, Subject } from 'rxjs'; +import { debounceTime, map, switchMap, takeUntil } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations'; +import { InventoryBrand, InventoryCategory, InventoryPagination, InventoryProduct, InventoryTag, InventoryVendor } from 'app/modules/admin/apps/ecommerce/inventory/inventory.types'; +import { InventoryService } from 'app/modules/admin/apps/ecommerce/inventory/inventory.service'; + +@Component({ + selector : 'inventory-list', + templateUrl : './inventory.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush, + animations : FuseAnimations +}) +export class InventoryListComponent implements OnInit, AfterViewInit, OnDestroy +{ + @ViewChild(MatPaginator) private _paginator: MatPaginator; + @ViewChild(MatSort) private _sort: MatSort; + + products$: Observable; + + brands: InventoryBrand[]; + categories: InventoryCategory[]; + filteredTags: InventoryTag[]; + flashMessage: 'success' | 'error' | null = null; + isLoading: boolean = false; + pagination: InventoryPagination; + productsCount: number = 0; + productsTableColumns: string[] = ['sku', 'name', 'price', 'stock', 'active', 'details']; + searchInputControl: FormControl = new FormControl(); + selectedProduct: InventoryProduct | null = null; + selectedProductForm: FormGroup; + tags: InventoryTag[]; + tagsEditMode: boolean = false; + vendors: InventoryVendor[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _formBuilder: FormBuilder, + private _inventoryService: InventoryService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the selected product form + this.selectedProductForm = this._formBuilder.group({ + id : [''], + category : [''], + name : ['', [Validators.required]], + description : [''], + tags : [[]], + sku : [''], + barcode : [''], + brand : [''], + vendor : [''], + stock : [''], + reserved : [''], + cost : [''], + basePrice : [''], + taxPercent : [''], + price : [''], + weight : [''], + thumbnail : [''], + images : [[]], + currentImageIndex: [0], // Image index that is currently being viewed + active : [false] + }); + + // Get the brands + this._inventoryService.brands$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((brands: InventoryBrand[]) => { + + // Update the brands + this.brands = brands; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the categories + this._inventoryService.categories$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((categories: InventoryCategory[]) => { + + // Update the categories + this.categories = categories; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the pagination + this._inventoryService.pagination$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((pagination: InventoryPagination) => { + + // Update the pagination + this.pagination = pagination; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the products + this.products$ = this._inventoryService.products$; + this._inventoryService.products$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((products: InventoryProduct[]) => { + + // Update the counts + this.productsCount = products.length; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the tags + this._inventoryService.tags$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tags: InventoryTag[]) => { + + // Update the tags + this.tags = tags; + this.filteredTags = tags; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the vendors + this._inventoryService.vendors$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((vendors: InventoryVendor[]) => { + + // Update the vendors + this.vendors = vendors; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to search input field value changes + this.searchInputControl.valueChanges + .pipe( + takeUntil(this._unsubscribeAll), + debounceTime(300), + switchMap((query) => { + this.closeDetails(); + this.isLoading = true; + return this._inventoryService.getProducts(0, 10, 'name', 'asc', query); + }), + map(() => { + this.isLoading = false; + }) + ) + .subscribe(); + } + + /** + * After view init + */ + ngAfterViewInit(): void + { + // If the user changes the sort order... + this._sort.sortChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Reset back to the first page + this._paginator.pageIndex = 0; + + // Close the details + this.closeDetails(); + }); + + // Get products if sort or page changes + merge(this._sort.sortChange, this._paginator.page).pipe( + switchMap(() => { + this.closeDetails(); + this.isLoading = true; + return this._inventoryService.getProducts(this._paginator.pageIndex, this._paginator.pageSize, this._sort.active, this._sort.direction); + }), + map(() => { + this.isLoading = false; + }) + ).subscribe(); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle product details + * + * @param productId + */ + toggleDetails(productId: string): void + { + // If the product is already selected... + if ( this.selectedProduct && this.selectedProduct.id === productId ) + { + // Close the details + this.closeDetails(); + return; + } + + // Get the product by id + this._inventoryService.getProductById(productId) + .subscribe((product) => { + + // Set the selected product + this.selectedProduct = product; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Fill the form + this.selectedProductForm.patchValue(product); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * Close the details + */ + closeDetails(): void + { + this.selectedProduct = null; + } + + /** + * Cycle through images of selected product + */ + cycleImages(forward: boolean = true): void + { + // Get the image count and current image index + const count = this.selectedProductForm.get('images').value.length; + const currentIndex = this.selectedProductForm.get('currentImageIndex').value; + + // Calculate the next and previous index + const nextIndex = currentIndex + 1 === count ? 0 : currentIndex + 1; + const prevIndex = currentIndex - 1 < 0 ? count - 1 : currentIndex - 1; + + // If cycling forward... + if ( forward ) + { + this.selectedProductForm.get('currentImageIndex').setValue(nextIndex); + } + // If cycling backwards... + else + { + this.selectedProductForm.get('currentImageIndex').setValue(prevIndex); + } + } + + /** + * Toggle the tags edit mode + */ + toggleTagsEditMode(): void + { + this.tagsEditMode = !this.tagsEditMode; + } + + /** + * Filter tags + * + * @param event + */ + filterTags(event): void + { + // Get the value + const value = event.target.value.toLowerCase(); + + // Filter the tags + this.filteredTags = this.tags.filter(tag => tag.title.toLowerCase().includes(value)); + } + + /** + * Filter tags input key down event + * + * @param event + */ + filterTagsInputKeyDown(event): void + { + // Return if the pressed key is not 'Enter' + if ( event.key !== 'Enter' ) + { + return; + } + + // If there is no tag available... + if ( this.filteredTags.length === 0 ) + { + // Create the tag + this.createTag(event.target.value); + + // Clear the input + event.target.value = ''; + + // Return + return; + } + + // If there is a tag... + const tag = this.filteredTags[0]; + const isTagApplied = this.selectedProduct.tags.find((id) => id === tag.id); + + // If the found tag is already applied to the contact... + if ( isTagApplied ) + { + // Remove the tag from the contact + this.removeTagFromProduct(tag); + } + else + { + // Otherwise add the tag to the contact + this.addTagToProduct(tag); + } + } + + /** + * Create a new tag + * + * @param title + */ + createTag(title: string): void + { + const tag = { + title + }; + + // Create tag on the server + this._inventoryService.createTag(tag) + .subscribe((response) => { + + // Add the tag to the product + this.addTagToProduct(response); + }); + } + + /** + * Update the tag title + * + * @param tag + * @param event + */ + updateTagTitle(tag: InventoryTag, event): void + { + // Update the title on the tag + tag.title = event.target.value; + + // Update the tag on the server + this._inventoryService.updateTag(tag.id, tag) + .pipe(debounceTime(300)) + .subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Delete the tag + * + * @param tag + */ + deleteTag(tag: InventoryTag): void + { + // Delete the tag from the server + this._inventoryService.deleteTag(tag.id).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Add tag to the product + * + * @param tag + */ + addTagToProduct(tag: InventoryTag): void + { + // Add the tag + this.selectedProduct.tags.unshift(tag.id); + + // Update the selected product form + this.selectedProductForm.get('tags').patchValue(this.selectedProduct.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Remove tag from the product + * + * @param tag + */ + removeTagFromProduct(tag: InventoryTag): void + { + // Remove the tag + this.selectedProduct.tags.splice(this.selectedProduct.tags.findIndex(item => item === tag.id), 1); + + // Update the selected product form + this.selectedProductForm.get('tags').patchValue(this.selectedProduct.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle product tag + * + * @param tag + * @param change + */ + toggleProductTag(tag: InventoryTag, change: MatCheckboxChange): void + { + if ( change.checked ) + { + this.addTagToProduct(tag); + } + else + { + this.removeTagFromProduct(tag); + } + } + + /** + * Should the create tag button be visible + * + * @param inputValue + */ + shouldShowCreateTagButton(inputValue: string): boolean + { + return !!!(inputValue === '' || this.tags.findIndex(tag => tag.title.toLowerCase() === inputValue.toLowerCase()) > -1); + } + + /** + * Create product + */ + createProduct(): void + { + // Create the product + this._inventoryService.createProduct().subscribe((newProduct) => { + + // Go to new product + this.selectedProduct = newProduct; + + // Fill the form + this.selectedProductForm.patchValue(newProduct); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * Update the selected product using the form mock-api + */ + updateSelectedProduct(): void + { + // Get the product object + const product = this.selectedProductForm.getRawValue(); + + // Remove the currentImageIndex field + delete product.currentImageIndex; + + // Update the product on the server + this._inventoryService.updateProduct(product.id, product).subscribe(() => { + + // Show a success message + this.showFlashMessage('success'); + }); + } + + /** + * Delete the selected product using the form mock-api + */ + deleteSelectedProduct(): void + { + // Get the product object + const product = this.selectedProductForm.getRawValue(); + + // Delete the product on the server + this._inventoryService.deleteProduct(product.id).subscribe(() => { + + // Close the details + this.closeDetails(); + }); + } + + /** + * Show flash message + */ + showFlashMessage(type: 'success' | 'error'): void + { + // Show the message + this.flashMessage = type; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Hide it after 3 seconds + setTimeout(() => { + + this.flashMessage = null; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }, 3000); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/file-manager/details/details.component.html b/src/app/modules/admin/apps/file-manager/details/details.component.html new file mode 100644 index 00000000..55599ee8 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/details/details.component.html @@ -0,0 +1,105 @@ +
+ + +
+ +
+ + +
+
+ + + + + + +
+
+ + +
+
{{item.name}}
+
+ {{item.type.toUpperCase()}} +
+
+ + +
Information
+
+
+
Created By
+
{{item.createdBy}}
+
+
+
Created At
+
{{item.createdAt}}
+
+
+
Modified At
+
{{item.modifiedAt}}
+
+
+
Size
+
{{item.size}}
+
+ +
+
Contents
+
{{item.contents}}
+
+
+
+ + +
+
Description
+ +
+
+
+ +
{{item.description}}
+
+ +
Click here to add a description
+
+
+
+ + +
+ + +
+ +
diff --git a/src/app/modules/admin/apps/file-manager/details/details.component.ts b/src/app/modules/admin/apps/file-manager/details/details.component.ts new file mode 100644 index 00000000..da4751b0 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/details/details.component.ts @@ -0,0 +1,91 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { MatDrawerToggleResult } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FileManagerListComponent } from 'app/modules/admin/apps/file-manager/list/list.component'; +import { FileManagerService } from 'app/modules/admin/apps/file-manager/file-manager.service'; +import { Item } from 'app/modules/admin/apps/file-manager/file-manager.types'; + +@Component({ + selector : 'file-manager-details', + templateUrl : './details.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FileManagerDetailsComponent implements OnInit, OnDestroy +{ + item: Item; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fileManagerListComponent: FileManagerListComponent, + private _fileManagerService: FileManagerService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Open the drawer + this._fileManagerListComponent.matDrawer.open(); + + // Get the item + this._fileManagerService.item$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((item: Item) => { + + // Open the drawer in case it is closed + this._fileManagerListComponent.matDrawer.open(); + + // Get the item + this.item = item; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Close the drawer + */ + closeDrawer(): Promise + { + return this._fileManagerListComponent.matDrawer.close(); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.component.html b/src/app/modules/admin/apps/file-manager/file-manager.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.component.html @@ -0,0 +1 @@ + diff --git a/src/app/modules/admin/apps/file-manager/file-manager.component.ts b/src/app/modules/admin/apps/file-manager/file-manager.component.ts new file mode 100644 index 00000000..0fa2889b --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'file-manager', + templateUrl : './file-manager.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FileManagerComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.guards.ts b/src/app/modules/admin/apps/file-manager/file-manager.guards.ts new file mode 100644 index 00000000..68a9bbfb --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.guards.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { FileManagerDetailsComponent } from 'app/modules/admin/apps/file-manager/details/details.component'; + +@Injectable({ + providedIn: 'root' +}) +export class CanDeactivateFileManagerDetails implements CanDeactivate +{ + canDeactivate( + component: FileManagerDetailsComponent, + currentRoute: ActivatedRouteSnapshot, + currentState: RouterStateSnapshot, + nextState: RouterStateSnapshot + ): Observable | Promise | boolean | UrlTree + { + // Get the next route + let nextRoute: ActivatedRouteSnapshot = nextState.root; + while ( nextRoute.firstChild ) + { + nextRoute = nextRoute.firstChild; + } + + // If the next state doesn't contain '/files' + // it means we are navigating away from the + // tasks app + if ( !nextState.url.includes('/file-manager') ) + { + // Let it navigate + return true; + } + + // If we are navigating to another task... + if ( nextRoute.paramMap.get('id') ) + { + // Just navigate + return true; + } + // Otherwise... + else + { + // Close the drawer first, and then navigate + return component.closeDrawer().then(() => { + return true; + }); + } + } +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.module.ts b/src/app/modules/admin/apps/file-manager/file-manager.module.ts new file mode 100644 index 00000000..81582b8f --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.module.ts @@ -0,0 +1,30 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { SharedModule } from 'app/shared/shared.module'; +import { fileManagerRoutes } from 'app/modules/admin/apps/file-manager/file-manager.routing'; +import { FileManagerComponent } from 'app/modules/admin/apps/file-manager/file-manager.component'; +import { FileManagerDetailsComponent } from 'app/modules/admin/apps/file-manager/details/details.component'; +import { FileManagerListComponent } from 'app/modules/admin/apps/file-manager/list/list.component'; + +@NgModule({ + declarations: [ + FileManagerComponent, + FileManagerDetailsComponent, + FileManagerListComponent + ], + imports : [ + RouterModule.forChild(fileManagerRoutes), + MatButtonModule, + MatIconModule, + MatSidenavModule, + MatTooltipModule, + SharedModule + ] +}) +export class FileManagerModule +{ +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.resolvers.ts b/src/app/modules/admin/apps/file-manager/file-manager.resolvers.ts new file mode 100644 index 00000000..b1138b80 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.resolvers.ts @@ -0,0 +1,82 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { FileManagerService } from 'app/modules/admin/apps/file-manager/file-manager.service'; +import { Item } from 'app/modules/admin/apps/file-manager/file-manager.types'; + +@Injectable({ + providedIn: 'root' +}) +export class FileManagerItemsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _fileManagerService: FileManagerService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._fileManagerService.getItems(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class FileManagerItemResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _router: Router, + private _fileManagerService: FileManagerService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._fileManagerService.getItemById(route.paramMap.get('id')) + .pipe( + // Error here means the requested task is not available + catchError((error) => { + + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.routing.ts b/src/app/modules/admin/apps/file-manager/file-manager.routing.ts new file mode 100644 index 00000000..db36be9d --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.routing.ts @@ -0,0 +1,32 @@ +import { Route } from '@angular/router'; +import { CanDeactivateFileManagerDetails } from 'app/modules/admin/apps/file-manager/file-manager.guards'; +import { FileManagerComponent } from 'app/modules/admin/apps/file-manager/file-manager.component'; +import { FileManagerListComponent } from 'app/modules/admin/apps/file-manager/list/list.component'; +import { FileManagerDetailsComponent } from 'app/modules/admin/apps/file-manager/details/details.component'; +import { FileManagerItemResolver, FileManagerItemsResolver } from 'app/modules/admin/apps/file-manager/file-manager.resolvers'; + +export const fileManagerRoutes: Route[] = [ + { + path : '', + component: FileManagerComponent, + children : [ + { + path : '', + component: FileManagerListComponent, + resolve : { + items: FileManagerItemsResolver + }, + children : [ + { + path : ':id', + component : FileManagerDetailsComponent, + resolve : { + item: FileManagerItemResolver + }, + canDeactivate: [CanDeactivateFileManagerDetails] + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/apps/file-manager/file-manager.service.ts b/src/app/modules/admin/apps/file-manager/file-manager.service.ts new file mode 100644 index 00000000..0f89e9e5 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.service.ts @@ -0,0 +1,88 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { map, switchMap, take, tap } from 'rxjs/operators'; +import { Item, Items } from 'app/modules/admin/apps/file-manager/file-manager.types'; + +@Injectable({ + providedIn: 'root' +}) +export class FileManagerService +{ + // Private + private _item: BehaviorSubject = new BehaviorSubject(null); + private _items: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for items + */ + get items$(): Observable + { + return this._items.asObservable(); + } + + /** + * Getter for item + */ + get item$(): Observable + { + return this._item.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get items + */ + getItems(): Observable + { + return this._httpClient.get('api/apps/file-manager').pipe( + tap((response: any) => { + this._items.next(response); + }) + ); + } + + /** + * Get item by id + */ + getItemById(id: string): Observable + { + return this._items.pipe( + take(1), + map((items) => { + + // Find within the folders and files + const item = [...items.folders, ...items.files].find(value => value.id === id) || null; + + // Update the item + this._item.next(item); + + // Return the item + return item; + }), + switchMap((item) => { + + if ( !item ) + { + return throwError('Could not found the item with id of ' + id + '!'); + } + + return of(item); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/file-manager/file-manager.types.ts b/src/app/modules/admin/apps/file-manager/file-manager.types.ts new file mode 100644 index 00000000..c779ca9b --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/file-manager.types.ts @@ -0,0 +1,18 @@ +export interface Items +{ + folders: Item[]; + files: Item[]; +} + +export interface Item +{ + id?: string; + name?: string; + createdBy?: string; + createdAt?: string; + modifiedAt?: string; + size?: string; + type?: string; + contents?: string | null; + description?: string | null; +} diff --git a/src/app/modules/admin/apps/file-manager/list/list.component.html b/src/app/modules/admin/apps/file-manager/list/list.component.html new file mode 100644 index 00000000..83cc8b75 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/list/list.component.html @@ -0,0 +1,133 @@ +
+ + + + + + + + + + + +
+ + +
+ +
+
File Manager
+
+ {{items.folders.length}} folders, {{items.files.length}} files +
+
+ +
+ + +
+
+ + + +
+ +
Folders
+
+ + + +
+ + +
Files
+
+ + + +
+
+
+ + + +
+
+
+ + + + + + + + +
+ +
+ {{item.type.toUpperCase()}} +
+
+
+
+
+
+
+
{{item.name}}
+ +
{{item.contents}}
+
+
+
+
+ + + +
+ +
There are no items!
+
+
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/apps/file-manager/list/list.component.ts b/src/app/modules/admin/apps/file-manager/list/list.component.ts new file mode 100644 index 00000000..5c65d394 --- /dev/null +++ b/src/app/modules/admin/apps/file-manager/list/list.component.ts @@ -0,0 +1,147 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { MatDrawer } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { FileManagerService } from 'app/modules/admin/apps/file-manager/file-manager.service'; +import { Item, Items } from 'app/modules/admin/apps/file-manager/file-manager.types'; + +@Component({ + selector : 'file-manager-list', + templateUrl : './list.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FileManagerListComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + drawerMode: 'side' | 'over'; + selectedItem: Item; + items: Items; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + @Inject(DOCUMENT) private _document: any, + private _router: Router, + private _fileManagerService: FileManagerService, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the items + this._fileManagerService.items$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((items: Items) => { + this.items = items; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the item + this._fileManagerService.item$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((item: Item) => { + this.selectedItem = item; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to media query change + this._fuseMediaWatcherService.onMediaQueryChange$('(min-width: 1440px)') + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((state) => { + + // Calculate the drawer mode + this.drawerMode = state.matches ? 'side' : 'over'; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Go to item + * + * @param id + */ + goToItem(id: string): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go to item + this._router.navigate(['../', id], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * On backdrop clicked + */ + onBackdropClicked(): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go back to the parent route + this._router.navigate(['../'], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/faqs/faqs.component.html b/src/app/modules/admin/apps/help-center/faqs/faqs.component.html new file mode 100644 index 00000000..e50cd9c3 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/faqs/faqs.component.html @@ -0,0 +1,32 @@ +
+ + +
+
+
+ +
+
+ Frequently Asked Questions +
+ +
{{faqCategory.title}}
+ + + + {{faq.question}} + + {{faq.answer}} + + +
+
+
+ +
diff --git a/src/app/modules/admin/apps/help-center/faqs/faqs.component.ts b/src/app/modules/admin/apps/help-center/faqs/faqs.component.ts new file mode 100644 index 00000000..c820d2d3 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/faqs/faqs.component.ts @@ -0,0 +1,65 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { FaqCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Component({ + selector : 'help-center-faqs', + templateUrl : './faqs.component.html', + encapsulation: ViewEncapsulation.None +}) +export class HelpCenterFaqsComponent implements OnInit, OnDestroy +{ + faqCategories: FaqCategory[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the FAQs + this._helpCenterService.faqs$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((faqCategories) => { + this.faqCategories = faqCategories; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/guides/category/category.component.html b/src/app/modules/admin/apps/help-center/guides/category/category.component.html new file mode 100644 index 00000000..ded38c91 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/category/category.component.html @@ -0,0 +1,30 @@ +
+ + +
+
+
+ +
+
+ {{guideCategory.title}} +
+ + +
+
+
diff --git a/src/app/modules/admin/apps/help-center/guides/category/category.component.ts b/src/app/modules/admin/apps/help-center/guides/category/category.component.ts new file mode 100644 index 00000000..06a81863 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/category/category.component.ts @@ -0,0 +1,70 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { GuideCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Component({ + selector : 'help-center-guides-category', + templateUrl : './category.component.html', + encapsulation: ViewEncapsulation.None +}) +export class HelpCenterGuidesCategoryComponent implements OnInit, OnDestroy +{ + guideCategory: GuideCategory; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _helpCenterService: HelpCenterService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the Guides + this._helpCenterService.guides$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((guideCategories) => { + this.guideCategory = guideCategories[0]; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/guides/guide/guide.component.html b/src/app/modules/admin/apps/help-center/guides/guide/guide.component.html new file mode 100644 index 00000000..f5a02ab3 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/guide/guide.component.html @@ -0,0 +1,52 @@ +
+ + +
+
+
+ +
+
{{guideCategory.guides[0].title}}
+
{{guideCategory.guides[0].subtitle}}
+ + +
+ +
+
Last updated 2 months ago
+
+
Was this page helpful?
+
+ + +
+
+
+ + + +
+
Next
+
Removing a media from a project
+
+ +
+
+
+
diff --git a/src/app/modules/admin/apps/help-center/guides/guide/guide.component.ts b/src/app/modules/admin/apps/help-center/guides/guide/guide.component.ts new file mode 100644 index 00000000..c89c3cbb --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/guide/guide.component.ts @@ -0,0 +1,65 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { GuideCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Component({ + selector : 'help-center-guides-guide', + templateUrl : './guide.component.html', + encapsulation: ViewEncapsulation.None +}) +export class HelpCenterGuidesGuideComponent implements OnInit, OnDestroy +{ + guideCategory: GuideCategory; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the Guides + this._helpCenterService.guide$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((guideCategory) => { + this.guideCategory = guideCategory; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/guides/guides.component.html b/src/app/modules/admin/apps/help-center/guides/guides.component.html new file mode 100644 index 00000000..44ac0df5 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/guides.component.html @@ -0,0 +1,48 @@ +
+ + +
+
+
+ +
+
+ Guides & Resources +
+ + +
+
+
diff --git a/src/app/modules/admin/apps/help-center/guides/guides.component.ts b/src/app/modules/admin/apps/help-center/guides/guides.component.ts new file mode 100644 index 00000000..018e32e6 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/guides/guides.component.ts @@ -0,0 +1,65 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { GuideCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Component({ + selector : 'help-center-guides', + templateUrl : './guides.component.html', + encapsulation: ViewEncapsulation.None +}) +export class HelpCenterGuidesComponent implements OnInit, OnDestroy +{ + guideCategories: GuideCategory[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the Guide categories + this._helpCenterService.guides$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((guideCategories) => { + this.guideCategories = guideCategories; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/help-center.component.html b/src/app/modules/admin/apps/help-center/help-center.component.html new file mode 100644 index 00000000..eda3d4e4 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.component.html @@ -0,0 +1,104 @@ +
+ + +
+ + + + + + + + + +
+

HELP CENTER

+
+ How can we help you today? +
+
+ Search for a topic or question, check out our FAQs and guides, contact us for detailed support +
+ + + + +
+
+ +
+ +
+ +
+
+
FAQs
+
Frequently asked questions and answers
+
+ +
+ +
+
+
Guides
+
Articles and resources to guide you
+
+ +
+ +
+
+
Support
+
Contact us for more detailed support
+
+ +
+
+ +
Most frequently asked questions
+
Here are the most frequently asked questions you may check before getting started
+ + + + {{faq.question}} + + {{faq.answer}} + + +
+
diff --git a/src/app/modules/admin/apps/help-center/help-center.component.ts b/src/app/modules/admin/apps/help-center/help-center.component.ts new file mode 100644 index 00000000..a242e62b --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.component.ts @@ -0,0 +1,65 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { FaqCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Component({ + selector : 'help-center', + templateUrl : './help-center.component.html', + encapsulation: ViewEncapsulation.None +}) +export class HelpCenterComponent implements OnInit, OnDestroy +{ + faqCategory: FaqCategory; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the FAQs + this._helpCenterService.faqs$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((faqCategories) => { + this.faqCategory = faqCategories[0]; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/help-center/help-center.module.ts b/src/app/modules/admin/apps/help-center/help-center.module.ts new file mode 100644 index 00000000..eb22b864 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { HelpCenterComponent } from 'app/modules/admin/apps/help-center/help-center.component'; +import { HelpCenterFaqsComponent } from 'app/modules/admin/apps/help-center/faqs/faqs.component'; +import { HelpCenterGuidesComponent } from 'app/modules/admin/apps/help-center/guides/guides.component'; +import { HelpCenterGuidesCategoryComponent } from 'app/modules/admin/apps/help-center/guides/category/category.component'; +import { HelpCenterGuidesGuideComponent } from 'app/modules/admin/apps/help-center/guides/guide/guide.component'; +import { HelpCenterSupportComponent } from 'app/modules/admin/apps/help-center/support/support.component'; +import { helpCenterRoutes } from 'app/modules/admin/apps/help-center/help-center.routing'; + +@NgModule({ + declarations: [ + HelpCenterComponent, + HelpCenterFaqsComponent, + HelpCenterGuidesComponent, + HelpCenterGuidesCategoryComponent, + HelpCenterGuidesGuideComponent, + HelpCenterSupportComponent + ], + imports : [ + RouterModule.forChild(helpCenterRoutes), + MatButtonModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + FuseAlertModule, + SharedModule + ] +}) +export class HelpCenterModule +{ +} diff --git a/src/app/modules/admin/apps/help-center/help-center.resolvers.ts b/src/app/modules/admin/apps/help-center/help-center.resolvers.ts new file mode 100644 index 00000000..50d85fab --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.resolvers.ts @@ -0,0 +1,145 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; +import { FaqCategory, GuideCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterMostAskedFaqsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._helpCenterService.getFaqsByCategory('most-asked'); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterFaqsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._helpCenterService.getAllFaqs(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterGuidesResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._helpCenterService.getAllGuides(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterGuidesCategoryResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._helpCenterService.getGuidesByCategory(route.paramMap.get('categorySlug')); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterGuidesGuideResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _helpCenterService: HelpCenterService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._helpCenterService.getGuide(route.parent.paramMap.get('categorySlug'), route.paramMap.get('guideSlug')); + } +} diff --git a/src/app/modules/admin/apps/help-center/help-center.routing.ts b/src/app/modules/admin/apps/help-center/help-center.routing.ts new file mode 100644 index 00000000..98fb878c --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.routing.ts @@ -0,0 +1,60 @@ +import { Route } from '@angular/router'; +import { HelpCenterComponent } from 'app/modules/admin/apps/help-center/help-center.component'; +import { HelpCenterFaqsComponent } from 'app/modules/admin/apps/help-center/faqs/faqs.component'; +import { HelpCenterGuidesComponent } from 'app/modules/admin/apps/help-center/guides/guides.component'; +import { HelpCenterGuidesCategoryComponent } from 'app/modules/admin/apps/help-center/guides/category/category.component'; +import { HelpCenterGuidesGuideComponent } from 'app/modules/admin/apps/help-center/guides/guide/guide.component'; +import { HelpCenterSupportComponent } from 'app/modules/admin/apps/help-center/support/support.component'; +import { HelpCenterFaqsResolver, HelpCenterGuidesCategoryResolver, HelpCenterGuidesGuideResolver, HelpCenterGuidesResolver, HelpCenterMostAskedFaqsResolver } from 'app/modules/admin/apps/help-center/help-center.resolvers'; + +export const helpCenterRoutes: Route[] = [ + { + path : '', + component: HelpCenterComponent, + resolve : { + faqs: HelpCenterMostAskedFaqsResolver + } + }, + { + path : 'faqs', + component: HelpCenterFaqsComponent, + resolve : { + faqs: HelpCenterFaqsResolver + } + }, + { + path : 'guides', + children: [ + { + path : '', + component: HelpCenterGuidesComponent, + resolve : { + guides: HelpCenterGuidesResolver + } + }, + { + path : ':categorySlug', + children: [ + { + path : '', + component: HelpCenterGuidesCategoryComponent, + resolve : { + guides: HelpCenterGuidesCategoryResolver + } + }, + { + path : ':guideSlug', + component: HelpCenterGuidesGuideComponent, + resolve : { + guide: HelpCenterGuidesGuideResolver + } + } + ] + } + ] + }, + { + path : 'support', + component: HelpCenterSupportComponent + } +]; diff --git a/src/app/modules/admin/apps/help-center/help-center.service.ts b/src/app/modules/admin/apps/help-center/help-center.service.ts new file mode 100644 index 00000000..df9f03d9 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.service.ts @@ -0,0 +1,134 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, ReplaySubject } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { FaqCategory, Guide, GuideCategory } from 'app/modules/admin/apps/help-center/help-center.type'; + +@Injectable({ + providedIn: 'root' +}) +export class HelpCenterService +{ + private _faqs: ReplaySubject = new ReplaySubject(1); + private _guides: ReplaySubject = new ReplaySubject(1); + private _guide: ReplaySubject = new ReplaySubject(1); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for FAQs + */ + get faqs$(): Observable + { + return this._faqs.asObservable(); + } + + /** + * Getter for guides + */ + get guides$(): Observable + { + return this._guides.asObservable(); + } + + /** + * Getter for guide + */ + get guide$(): Observable + { + return this._guide.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get all FAQs + */ + getAllFaqs(): Observable + { + return this._httpClient.get('api/apps/help-center/faqs').pipe( + tap((response: any) => { + this._faqs.next(response); + }) + ); + } + + /** + * Get FAQs by category using category slug + * + * @param slug + */ + getFaqsByCategory(slug: string): Observable + { + return this._httpClient.get('api/apps/help-center/faqs', { + params: {slug} + }).pipe( + tap((response: any) => { + this._faqs.next(response); + }) + ); + } + + /** + * Get all guides limited per category by the given number + * + * @param limit + */ + getAllGuides(limit = '4'): Observable + { + return this._httpClient.get('api/apps/help-center/guides', { + params: {limit} + }).pipe( + tap((response: any) => { + this._guides.next(response); + }) + ); + } + + /** + * Get guides by category using category slug + * + * @param slug + */ + getGuidesByCategory(slug: string): Observable + { + return this._httpClient.get('api/apps/help-center/guides', { + params: {slug} + }).pipe( + tap((response: any) => { + this._guides.next(response); + }) + ); + } + + /** + * Get guide by category and guide slug + * + * @param categorySlug + * @param guideSlug + */ + getGuide(categorySlug: string, guideSlug: string): Observable + { + return this._httpClient.get('api/apps/help-center/guide', { + params: { + categorySlug, + guideSlug + } + }).pipe( + tap((response: any) => { + this._guide.next(response); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/help-center/help-center.type.ts b/src/app/modules/admin/apps/help-center/help-center.type.ts new file mode 100644 index 00000000..dd6328df --- /dev/null +++ b/src/app/modules/admin/apps/help-center/help-center.type.ts @@ -0,0 +1,35 @@ +export interface FaqCategory +{ + id: string; + slug: string; + title: string; + faqs?: Faq[]; +} + +export interface Faq +{ + id: string; + categoryId: string; + question: string; + answer: string; +} + +export interface GuideCategory +{ + id: string; + slug: string; + title: string; + totalGuides?: number; + visibleGuides?: number; + guides?: Guide[]; +} + +export interface Guide +{ + id: string; + categoryId: string; + slug: string; + title: string; + subtitle?: string; + content?: string; +} diff --git a/src/app/modules/admin/apps/help-center/support/support.component.html b/src/app/modules/admin/apps/help-center/support/support.component.html new file mode 100644 index 00000000..216153cf --- /dev/null +++ b/src/app/modules/admin/apps/help-center/support/support.component.html @@ -0,0 +1,109 @@ +
+ + +
+
+
+ +
+
+ Contact support +
+ +
+ + + {{alert.message}} + +
+
+
Submit your request
+
Your request will be processed and our support staff will get back to you in 24 hours.
+
+ + + + Name + + Required + + + + + + Email + + Required + + + Enter a valid email address + + + + + + Subject + + Required + + + + + + Message + + Required + + + +
+ + +
+
+
+
+
+
diff --git a/src/app/modules/admin/apps/help-center/support/support.component.ts b/src/app/modules/admin/apps/help-center/support/support.component.ts new file mode 100644 index 00000000..77714f31 --- /dev/null +++ b/src/app/modules/admin/apps/help-center/support/support.component.ts @@ -0,0 +1,82 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { HelpCenterService } from 'app/modules/admin/apps/help-center/help-center.service'; + +@Component({ + selector : 'help-center-support', + templateUrl : './support.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class HelpCenterSupportComponent implements OnInit +{ + @ViewChild('supportNgForm') supportNgForm: NgForm; + + alert: any; + supportForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder, + private _helpCenterService: HelpCenterService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the support form + this.supportForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + subject: ['', Validators.required], + message: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Clear the form + */ + clearForm(): void + { + // Reset the form + this.supportNgForm.resetForm(); + } + + /** + * Send the form + */ + sendForm(): void + { + // Send your form here using an http request + console.log('Your message has been sent!'); + + // Show a success message (it can also be an error message) + // and remove it after 5 seconds + this.alert = { + type : 'success', + message: 'Your request has been delivered! A member of our support staff will respond as soon as possible.' + }; + + setTimeout(() => { + this.alert = null; + }, 7000); + + // Clear the form + this.clearForm(); + } +} diff --git a/src/app/modules/admin/apps/mailbox/compose/compose.component.html b/src/app/modules/admin/apps/mailbox/compose/compose.component.html new file mode 100644 index 00000000..6179e661 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/compose/compose.component.html @@ -0,0 +1,132 @@ +
+ + +
+
New Message
+ +
+ + +
+ + + + To + +
+ + Cc + + + Bcc + +
+
+ + + + Cc + + + + + + Bcc + + + + + + Subject + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+
+
+
diff --git a/src/app/modules/admin/apps/mailbox/compose/compose.component.ts b/src/app/modules/admin/apps/mailbox/compose/compose.component.ts new file mode 100644 index 00000000..7b8dccf6 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/compose/compose.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector : 'mailbox-compose', + templateUrl : './compose.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MailboxComposeComponent implements OnInit +{ + composeForm: FormGroup; + copyFields: { cc: boolean, bcc: boolean } = { + cc : false, + bcc: false + }; + quillModules: any = { + toolbar: [ + ['bold', 'italic', 'underline'], + [{align: []}, {list: 'ordered'}, {list: 'bullet'}], + ['clean'] + ] + }; + + /** + * Constructor + */ + constructor( + public matDialogRef: MatDialogRef, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.composeForm = this._formBuilder.group({ + to : ['', [Validators.required, Validators.email]], + cc : ['', [Validators.email]], + bcc : ['', [Validators.email]], + subject: [''], + body : ['', [Validators.required]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Show the copy field with the given field name + * + * @param name + */ + showCopyField(name: string): void + { + // Return if the name is not one of the available names + if ( name !== 'cc' && name !== 'bcc' ) + { + return; + } + + // Show the field + this.copyFields[name] = true; + } + + /** + * Save and close + */ + saveAndClose(): void + { + // Save the message as a draft + this.saveAsDraft(); + + // Close the dialog + this.matDialogRef.close(); + } + + /** + * Discard the message + */ + discard(): void + { + + } + + /** + * Save the message as a draft + */ + saveAsDraft(): void + { + + } + + /** + * Send the message + */ + send(): void + { + + } +} diff --git a/src/app/modules/admin/apps/mailbox/details/details.component.html b/src/app/modules/admin/apps/mailbox/details/details.component.html new file mode 100644 index 00000000..755aad04 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/details/details.component.html @@ -0,0 +1,409 @@ +
+ + + + +
+ + +
+ + + + + + + + + + +
+ + {{label.title}} + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + +
+ +
{{mail.subject}}
+ + +
+ +
+ {{label.title}} +
+
+
+
+
+ +
+ + +
+ + +
+ +
+ + +
+ + +
+ User avatar +
+ + +
+ + +
{{mail.from.contact.split('<')[0].trim()}}
+ + +
+
to
+
me
+ +
+ and + {{mail.ccCount + mail.bccCount}} + + other + others + +
+
+ + + + + + +
+ +
+
from:
+
{{mail.from.contact}}
+
+ +
+
to:
+
{{mail.to}}
+
+ + +
+
cc:
+
{{mail.cc.join(',\n')}}
+
+
+ + +
+
bcc:
+
{{mail.bcc.join(',\n')}}
+
+
+ +
+
date:
+
{{mail.date | date:'EEEE, MMMM d, y - hh:mm a'}}
+
+ +
+
subject:
+
{{mail.subject}}
+
+
+
+
+ +
+ +
+ + +
+
+ + + +
+ +
+ +
{{mail.attachments.length}} Attachments
+
+ + +
+ +
+ + +
+
+ {{attachment.type.split('/')[1].trim().toUpperCase()}} +
+
+ +
+
+ {{attachment.name}} +
+
+ {{attachment.size / 1000 | number:'1.0-2'}} KB +
+
+
+
+
+
+
+ +
+ + +
+ + + +
+ + + + + + +
+
+ + + +
+ + + + + +
+
+ + + + + + + + +
+ +
+ + + + +
+
+
+
+ +
+ +
+ +
+ +
+ + + + +
+ +
Select a mail to read
+
+ +
+ +
diff --git a/src/app/modules/admin/apps/mailbox/details/details.component.ts b/src/app/modules/admin/apps/mailbox/details/details.component.ts new file mode 100644 index 00000000..e75dddfa --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/details/details.component.ts @@ -0,0 +1,375 @@ +import { Component, ElementRef, OnDestroy, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { MatButton } from '@angular/material/button'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { MailboxService } from 'app/modules/admin/apps/mailbox/mailbox.service'; +import { Mail, MailFolder, MailLabel } from 'app/modules/admin/apps/mailbox/mailbox.types'; +import { labelColorDefs } from 'app/modules/admin/apps/mailbox/mailbox.constants'; + +@Component({ + selector : 'mailbox-details', + templateUrl : './details.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MailboxDetailsComponent implements OnInit, OnDestroy +{ + @ViewChild('infoDetailsPanelOrigin') private _infoDetailsPanelOrigin: MatButton; + @ViewChild('infoDetailsPanel') private _infoDetailsPanel: TemplateRef; + + folders: MailFolder[]; + labelColors: any; + labels: MailLabel[]; + mail: Mail; + replyFormActive: boolean = false; + private _overlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _elementRef: ElementRef, + private _mailboxService: MailboxService, + private _overlay: Overlay, + private _router: Router, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the label colors + this.labelColors = labelColorDefs; + + // Folders + this._mailboxService.folders$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((folders: MailFolder[]) => { + this.folders = folders; + }); + + // Labels + this._mailboxService.labels$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((labels: MailLabel[]) => { + this.labels = labels; + }); + + // Mail + this._mailboxService.mail$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((mail: Mail) => { + this.mail = mail; + }); + + // Selected mail changed + this._mailboxService.selectedMailChanged + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + + // De-activate the reply form + this.replyFormActive = false; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get the current folder + */ + getCurrentFolder(): any + { + return this._activatedRoute.snapshot.paramMap.get('folder'); + } + + /** + * Move to folder + * + * @param folderSlug + */ + moveToFolder(folderSlug: string): void + { + // Find the folder details + const folder = this.folders.find((item) => { + return item.slug === folderSlug; + }); + + // Return if the current folder of the mail + // is already equals to the given folder + if ( this.mail.folder === folder.id ) + { + return; + } + + // Update the mail object + this.mail.folder = folder.id; + + // Update the mail on the server + this._mailboxService.updateMail(this.mail.id, {folder: this.mail.folder}).subscribe(); + + // Navigate to the parent + this._router.navigate(['./'], {relativeTo: this._activatedRoute.parent}); + } + + /** + * Toggle label + * + * @param label + */ + toggleLabel(label: MailLabel): void + { + let deleted = false; + + // Update the mail object + if ( this.mail.labels.includes(label.id) ) + { + // Set the deleted + deleted = true; + + // Delete the label + this.mail.labels.splice(this.mail.labels.indexOf(label.id), 1); + } + else + { + // Add the label + this.mail.labels.push(label.id); + } + + // Update the mail on the server + this._mailboxService.updateMail(this.mail.id, {labels: this.mail.labels}).subscribe(); + + // If the label was deleted... + if ( deleted ) + { + // If the current activated route has a label parameter and it equals to the one we are removing... + if ( this._activatedRoute.snapshot.paramMap.get('label') && this._activatedRoute.snapshot.paramMap.get('label') === label.slug ) + { + // Navigate to the parent + this._router.navigate(['./'], {relativeTo: this._activatedRoute.parent}); + } + } + } + + /** + * Toggle important + */ + toggleImportant(): void + { + // Update the mail object + this.mail.important = !this.mail.important; + + // Update the mail on the server + this._mailboxService.updateMail(this.mail.id, {important: this.mail.important}).subscribe(); + + // If the important was removed... + if ( !this.mail.important ) + { + // If the current activated route has a filter parameter and it equals to the 'important'... + if ( this._activatedRoute.snapshot.paramMap.get('filter') && this._activatedRoute.snapshot.paramMap.get('filter') === 'important' ) + { + // Navigate to the parent + this._router.navigate(['./'], {relativeTo: this._activatedRoute.parent}); + } + } + } + + /** + * Toggle star + */ + toggleStar(): void + { + // Update the mail object + this.mail.starred = !this.mail.starred; + + // Update the mail on the server + this._mailboxService.updateMail(this.mail.id, {starred: this.mail.starred}).subscribe(); + + // If the star was removed... + if ( !this.mail.starred ) + { + // If the current activated route has a filter parameter and it equals to the 'starred'... + if ( this._activatedRoute.snapshot.paramMap.get('filter') && this._activatedRoute.snapshot.paramMap.get('filter') === 'starred' ) + { + // Navigate to the parent + this._router.navigate(['./'], {relativeTo: this._activatedRoute.parent}); + } + } + } + + /** + * Toggle unread + * + * @param unread + */ + toggleUnread(unread: boolean): void + { + // Update the mail object + this.mail.unread = unread; + + // Update the mail on the server + this._mailboxService.updateMail(this.mail.id, {unread: this.mail.unread}).subscribe(); + } + + /** + * Reply + */ + reply(): void + { + // Activate the reply form + this.replyFormActive = true; + + // Scroll to the bottom of the details pane + setTimeout(() => { + this._elementRef.nativeElement.scrollTop = this._elementRef.nativeElement.scrollHeight; + }); + } + + /** + * Reply all + */ + replyAll(): void + { + // Activate the reply form + this.replyFormActive = true; + + // Scroll to the bottom of the details pane + setTimeout(() => { + this._elementRef.nativeElement.scrollTop = this._elementRef.nativeElement.scrollHeight; + }); + } + + /** + * Forward + */ + forward(): void + { + // Activate the reply form + this.replyFormActive = true; + + // Scroll to the bottom of the details pane + setTimeout(() => { + this._elementRef.nativeElement.scrollTop = this._elementRef.nativeElement.scrollHeight; + }); + } + + /** + * Discard + */ + discard(): void + { + // Deactivate the reply form + this.replyFormActive = false; + } + + /** + * Send + */ + send(): void + { + // Deactivate the reply form + this.replyFormActive = false; + } + + /** + * Open info details panel + */ + openInfoDetailsPanel(): void + { + // Create the overlay + this._overlayRef = this._overlay.create({ + backdropClass : '', + hasBackdrop : true, + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._infoDetailsPanelOrigin._elementRef.nativeElement) + .withFlexibleDimensions() + .withViewportMargin(16) + .withLockedPosition() + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + }, + { + originX : 'start', + originY : 'top', + overlayX: 'start', + overlayY: 'bottom' + }, + { + originX : 'end', + originY : 'bottom', + overlayX: 'end', + overlayY: 'top' + }, + { + originX : 'end', + originY : 'top', + overlayX: 'end', + overlayY: 'bottom' + } + ]) + }); + + // Create a portal from the template + const templatePortal = new TemplatePortal(this._infoDetailsPanel, this._viewContainerRef); + + // Attach the portal to the overlay + this._overlayRef.attach(templatePortal); + + // Subscribe to the backdrop click + this._overlayRef.backdropClick().subscribe(() => { + + // If overlay exists and attached... + if ( this._overlayRef && this._overlayRef.hasAttached() ) + { + // Detach it + this._overlayRef.detach(); + } + + // If template portal exists and attached... + if ( templatePortal && templatePortal.isAttached ) + { + // Detach it + templatePortal.detach(); + } + }); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/mailbox/list/list.component.html b/src/app/modules/admin/apps/mailbox/list/list.component.html new file mode 100644 index 00000000..de579c6b --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/list/list.component.html @@ -0,0 +1,154 @@ +
+ + + +
+ + +
+ +
+ + + +
{{category.name}}
+
+ + +
+ +
+ {{pagination.startIndex + 1}} + - + {{pagination.endIndex + 1}} + of + {{pagination.totalResults}} +
+ + + + + + + + +
+ + + +
+ + + + +
+ +
+ + + +
+ +
There are no e-mails
+
+
+ + + +
+ +
+
+ +
diff --git a/src/app/modules/admin/apps/mailbox/list/list.component.ts b/src/app/modules/admin/apps/mailbox/list/list.component.ts new file mode 100644 index 00000000..00b89ed2 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/list/list.component.ts @@ -0,0 +1,203 @@ +import { Component, ElementRef, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import * as moment from 'moment'; +import { MailboxService } from 'app/modules/admin/apps/mailbox/mailbox.service'; +import { MailboxComponent } from 'app/modules/admin/apps/mailbox/mailbox.component'; +import { Mail, MailCategory } from 'app/modules/admin/apps/mailbox/mailbox.types'; + +@Component({ + selector : 'mailbox-list', + templateUrl : './list.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MailboxListComponent implements OnInit, OnDestroy +{ + @ViewChild('mailList') mailList: ElementRef; + + category: MailCategory; + mails: Mail[]; + mailsLoading: boolean = false; + pagination: any; + selectedMail: Mail; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + public mailboxComponent: MailboxComponent, + private _mailboxService: MailboxService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Category + this._mailboxService.category$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((category: MailCategory) => { + this.category = category; + }); + + // Mails + this._mailboxService.mails$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((mails: Mail[]) => { + this.mails = mails; + }); + + // Mails loading + this._mailboxService.mailsLoading$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((mailsLoading: boolean) => { + this.mailsLoading = mailsLoading; + + // If the mail list element is available & the mails are loaded... + if ( this.mailList && !mailsLoading ) + { + // Reset the mail list element scroll position to top + this.mailList.nativeElement.scrollTo(0, 0); + } + }); + + // Pagination + this._mailboxService.pagination$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((pagination) => { + this.pagination = pagination; + }); + + // Selected mail + this._mailboxService.mail$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((mail: Mail) => { + this.selectedMail = mail; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On mail selected + * + * @param mail + */ + onMailSelected(mail: Mail): void + { + // If the mail is unread... + if ( mail.unread ) + { + // Update the mail object + mail.unread = false; + + // Update the mail on the server + this._mailboxService.updateMail(mail.id, {unread: false}).subscribe(); + } + + // Execute the mailSelected observable + this._mailboxService.selectedMailChanged.next(mail); + } + + /** + * Generate and return mail list group label if necessary or return false + * + * @param index + */ + mailListGroupLabel(index: number): string | false + { + const previousMail = this.mails[index - 1]; + const currentMail = this.mails[index]; + + // Generate and return label, if there is no previous mail + if ( !previousMail ) + { + return this._generateMailListGroupLabel(this.mails[index].date); + } + + // Return false, if the two dates are equal by day + if ( moment(previousMail.date, moment.ISO_8601).isSame(moment(currentMail.date, moment.ISO_8601), 'day') ) + { + return false; + } + + // Generate and return label + return this._generateMailListGroupLabel(this.mails[index].date); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Generate a mail list group label based on the date + * + * @param mailDate + * @private + */ + private _generateMailListGroupLabel(mailDate: string): string + { + const date = moment(mailDate, moment.ISO_8601); + const today = moment(); + const yesterday = moment().subtract(1, 'day'); + + // Check if the mail date is today + if ( date.isSame(today, 'day') ) + { + // Return 'Today' + return 'Today'; + } + + // Check if the mail date is yesterday + if ( date.isSame(yesterday, 'day') ) + { + // Return 'Yesterday' + return 'Yesterday'; + } + + // Check if we are in the same year with the mail date... + if ( date.isSame(today, 'year') ) + { + // Return a date without a year + return date.format('MMMM DD'); + } + + // Return a date + return date.format('LL'); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/mailbox/mailbox.component.html b/src/app/modules/admin/apps/mailbox/mailbox.component.html new file mode 100644 index 00000000..40c2fd1e --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.component.html @@ -0,0 +1,29 @@ +
+ + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/apps/mailbox/mailbox.component.ts b/src/app/modules/admin/apps/mailbox/mailbox.component.ts new file mode 100644 index 00000000..b5136710 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.component.ts @@ -0,0 +1,64 @@ +import { Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { MatDrawer } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'mailbox', + templateUrl : './mailbox.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MailboxComponent implements OnInit, OnDestroy +{ + @ViewChild('drawer') drawer: MatDrawer; + + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if the given breakpoint is active + if ( matchingAliases.includes('md') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/apps/mailbox/mailbox.constants.ts b/src/app/modules/admin/apps/mailbox/mailbox.constants.ts new file mode 100644 index 00000000..edb3c749 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.constants.ts @@ -0,0 +1,65 @@ +export const labelColors = [ + 'gray', + 'red', + 'orange', + 'yellow', + 'green', + 'teal', + 'blue', + 'indigo', + 'purple', + 'pink' +]; + +export const labelColorDefs = { + gray : { + text : 'text-gray-500', + bg : 'bg-gray-500', + combined: 'text-gray-800 bg-gray-100' + }, + red : { + text : 'text-red-500', + bg : 'bg-red-500', + combined: 'text-red-800 bg-red-100' + }, + orange: { + text : 'text-orange-500', + bg : 'bg-orange-500', + combined: 'text-orange-800 bg-orange-100' + }, + yellow: { + text : 'text-yellow-500', + bg : 'bg-yellow-500', + combined: 'text-yellow-800 bg-yellow-100' + }, + green : { + text : 'text-green-500', + bg : 'bg-green-500', + combined: 'text-green-800 bg-green-100' + }, + teal : { + text : 'text-teal-500', + bg : 'bg-teal-500', + combined: 'text-teal-800 bg-teal-100' + }, + blue : { + text : 'text-blue-500', + bg : 'bg-blue-500', + combined: 'text-blue-800 bg-blue-100' + }, + indigo: { + text : 'text-indigo-500', + bg : 'bg-indigo-500', + combined: 'text-indigo-800 bg-indigo-100' + }, + purple: { + text : 'text-purple-500', + bg : 'bg-purple-500', + combined: 'text-purple-800 bg-purple-100' + }, + pink : { + text : 'text-pink-500', + bg : 'bg-pink-500', + combined: 'text-pink-800 bg-pink-100' + } +}; diff --git a/src/app/modules/admin/apps/mailbox/mailbox.module.ts b/src/app/modules/admin/apps/mailbox/mailbox.module.ts new file mode 100644 index 00000000..ae5e20a1 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.module.ts @@ -0,0 +1,60 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { QuillModule } from 'ngx-quill'; +import { FuseFindByKeyPipeModule } from '@fuse/pipes/find-by-key'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { FuseScrollbarModule } from '@fuse/directives/scrollbar'; +import { FuseScrollResetModule } from '@fuse/directives/scroll-reset'; +import { SharedModule } from 'app/shared/shared.module'; +import { MailboxComponent } from 'app/modules/admin/apps/mailbox/mailbox.component'; +import { MailboxComposeComponent } from 'app/modules/admin/apps/mailbox/compose/compose.component'; +import { MailboxDetailsComponent } from 'app/modules/admin/apps/mailbox/details/details.component'; +import { MailboxListComponent } from 'app/modules/admin/apps/mailbox/list/list.component'; +import { MailboxSettingsComponent } from 'app/modules/admin/apps/mailbox/settings/settings.component'; +import { MailboxSidebarComponent } from 'app/modules/admin/apps/mailbox/sidebar/sidebar.component'; +import { mailboxRoutes } from 'app/modules/admin/apps/mailbox/mailbox.routing'; + +@NgModule({ + declarations: [ + MailboxComponent, + MailboxComposeComponent, + MailboxDetailsComponent, + MailboxListComponent, + MailboxSettingsComponent, + MailboxSidebarComponent + ], + imports : [ + RouterModule.forChild(mailboxRoutes), + MatButtonModule, + MatCheckboxModule, + MatDialogModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatProgressBarModule, + MatSelectModule, + MatSidenavModule, + QuillModule.forRoot(), + FuseFindByKeyPipeModule, + FuseNavigationModule, + FuseScrollbarModule, + FuseScrollResetModule, + SharedModule + ] +}) +export class MailboxModule +{ +} diff --git a/src/app/modules/admin/apps/mailbox/mailbox.resolvers.ts b/src/app/modules/admin/apps/mailbox/mailbox.resolvers.ts new file mode 100644 index 00000000..b91dd0e3 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.resolvers.ts @@ -0,0 +1,246 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { forkJoin, Observable, throwError } from 'rxjs'; +import { catchError, finalize } from 'rxjs/operators'; +import { MailboxService } from 'app/modules/admin/apps/mailbox/mailbox.service'; +import { Mail, MailFilter, MailFolder, MailLabel } from 'app/modules/admin/apps/mailbox/mailbox.types'; + +@Injectable({ + providedIn: 'root' +}) +export class MailboxFoldersResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _mailboxService: MailboxService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._mailboxService.getFolders(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class MailboxFiltersResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _mailboxService: MailboxService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._mailboxService.getFilters(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class MailboxLabelsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _mailboxService: MailboxService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._mailboxService.getLabels(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class MailboxMailsResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _mailboxService: MailboxService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | any + { + // Don't allow page param to go below 1 + if ( route.paramMap.get('page') && parseInt(route.paramMap.get('page'), 10) <= 0 ) + { + // Get the parent url + const url = state.url.split('/').slice(0, -1).join('/') + '/1'; + + // Navigate to there + this._router.navigateByUrl(url); + + // Don't allow request to go through + return false; + } + + // Create and build the sources array + const sources = []; + + // If folder is set on the parameters... + if ( route.paramMap.get('folder') ) + { + sources.push(this._mailboxService.getMailsByFolder(route.paramMap.get('folder'), route.paramMap.get('page'))); + } + + // If filter is set on the parameters... + if ( route.paramMap.get('filter') ) + { + sources.push(this._mailboxService.getMailsByFilter(route.paramMap.get('filter'), route.paramMap.get('page'))); + } + + // If label is set on the parameters... + if ( route.paramMap.get('label') ) + { + sources.push(this._mailboxService.getMailsByLabel(route.paramMap.get('label'), route.paramMap.get('page'))); + } + + // Fork join all the sources + return forkJoin(sources) + .pipe( + finalize(() => { + + // Reset the mail every time mails list changes, + // if there is no selected mail. This will ensure + // that the mail will be reset while navigating + // between the folders/filters/labels but it won't + // reset on page reload if we are reading a mail. + + // Try to get the current activated route + let currentRoute = route; + while ( currentRoute.firstChild ) + { + currentRoute = currentRoute.firstChild; + } + + // Make sure there is no 'id' parameter on the current route + if ( !currentRoute.paramMap.get('id') ) + { + // Reset the mail + this._mailboxService.resetMail().subscribe(); + } + }), + + // Error here means the requested page is not available + catchError((error) => { + + // Log the error + console.error(error.message); + + // Get the parent url and append the last possible page number to the parent url + const url = state.url.split('/').slice(0, -1).join('/') + '/' + error.pagination.lastPage; + + // Navigate to there + this._router.navigateByUrl(url); + + // Throw an error + return throwError(error); + }) + ); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class MailboxMailResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _mailboxService: MailboxService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._mailboxService.getMailById(route.paramMap.get('id')) + .pipe( + // Error here means the requested mail is either + // not available on the requested page or not + // available at all + catchError((error) => { + + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/mailbox/mailbox.routing.ts b/src/app/modules/admin/apps/mailbox/mailbox.routing.ts new file mode 100644 index 00000000..d836c7a0 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.routing.ts @@ -0,0 +1,162 @@ +import { ActivatedRouteSnapshot, Route, UrlMatchResult, UrlSegment } from '@angular/router'; +import { isEqual } from 'lodash-es'; +import { MailboxComponent } from 'app/modules/admin/apps/mailbox/mailbox.component'; +import { MailboxFiltersResolver, MailboxFoldersResolver, MailboxLabelsResolver, MailboxMailResolver, MailboxMailsResolver } from 'app/modules/admin/apps/mailbox/mailbox.resolvers'; +import { MailboxListComponent } from 'app/modules/admin/apps/mailbox/list/list.component'; +import { MailboxDetailsComponent } from 'app/modules/admin/apps/mailbox/details/details.component'; +import { MailboxSettingsComponent } from 'app/modules/admin/apps/mailbox/settings/settings.component'; + +/** + * Mailbox custom route matcher + * + * @param url + */ +export function mailboxRouteMatcher(url: UrlSegment[]): UrlMatchResult +{ + // Prepare consumed url and positional parameters + let consumed = url; + const posParams = {}; + + // Settings + if ( url[0].path === 'settings' ) + { + // Do not match + return null; + } + // Filter or label + else if ( url[0].path === 'filter' || url[0].path === 'label' ) + { + posParams[url[0].path] = url[1]; + posParams['page'] = url[2]; + + // Remove the id if exists + if ( url[3] ) + { + consumed = url.slice(0, -1); + } + } + // Folder + else + { + posParams['folder'] = url[0]; + posParams['page'] = url[1]; + + // Remove the id if exists + if ( url[2] ) + { + consumed = url.slice(0, -1); + } + } + + return { + consumed, + posParams + }; +} + +export function mailboxRunGuardsAndResolvers(from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot): boolean +{ + // If we are navigating from mail to mails, meaning there is an id in + // from's deepest first child and there isn't one in the to's, we will + // trigger the resolver + + // Get the current activated route of the 'from' + let fromCurrentRoute = from; + while ( fromCurrentRoute.firstChild ) + { + fromCurrentRoute = fromCurrentRoute.firstChild; + } + + // Get the current activated route of the 'to' + let toCurrentRoute = to; + while ( toCurrentRoute.firstChild ) + { + toCurrentRoute = toCurrentRoute.firstChild; + } + + // Trigger the resolver if the condition met + if ( fromCurrentRoute.paramMap.get('id') && !toCurrentRoute.paramMap.get('id') ) + { + return true; + } + + // If the from and to params are equal, don't trigger the resolver + const fromParams = {}; + const toParams = {}; + + from.paramMap.keys.forEach((key) => { + fromParams[key] = from.paramMap.get(key); + }); + + to.paramMap.keys.forEach((key) => { + toParams[key] = to.paramMap.get(key); + }); + + if ( isEqual(fromParams, toParams) ) + { + return false; + } + + // Trigger the resolver on other cases + return true; +} + +export const mailboxRoutes: Route[] = [ + { + path : '', + redirectTo: 'inbox/1', + pathMatch : 'full' + }, + { + path : 'filter/:filter', + redirectTo: 'filter/:filter/1', + pathMatch : 'full' + }, + { + path : 'label/:label', + redirectTo: 'label/:label/1', + pathMatch : 'full' + }, + { + path : ':folder', + redirectTo: ':folder/1', + pathMatch : 'full' + }, + { + path : '', + component: MailboxComponent, + resolve : { + filters: MailboxFiltersResolver, + folders: MailboxFoldersResolver, + labels : MailboxLabelsResolver + }, + children : [ + { + component : MailboxListComponent, + matcher : mailboxRouteMatcher, + runGuardsAndResolvers: mailboxRunGuardsAndResolvers, + resolve : { + mails: MailboxMailsResolver + }, + children : [ + { + path : '', + component: MailboxDetailsComponent, + children : [ + { + path : ':id', + resolve: { + mail: MailboxMailResolver + } + } + ] + } + ] + }, + { + path : 'settings', + component: MailboxSettingsComponent + } + ] + } +]; diff --git a/src/app/modules/admin/apps/mailbox/mailbox.service.ts b/src/app/modules/admin/apps/mailbox/mailbox.service.ts new file mode 100644 index 00000000..7fddeae9 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.service.ts @@ -0,0 +1,396 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { map, switchMap, take, tap } from 'rxjs/operators'; +import { Mail, MailCategory, MailFilter, MailFolder, MailLabel } from 'app/modules/admin/apps/mailbox/mailbox.types'; + +@Injectable({ + providedIn: 'root' +}) +export class MailboxService +{ + selectedMailChanged: BehaviorSubject = new BehaviorSubject(null); + private _category: BehaviorSubject = new BehaviorSubject(null); + private _filters: BehaviorSubject = new BehaviorSubject(null); + private _folders: BehaviorSubject = new BehaviorSubject(null); + private _labels: BehaviorSubject = new BehaviorSubject(null); + private _mails: BehaviorSubject = new BehaviorSubject(null); + private _mailsLoading: BehaviorSubject = new BehaviorSubject(false); + private _mail: BehaviorSubject = new BehaviorSubject(null); + private _pagination: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for category + */ + get category$(): Observable + { + return this._category.asObservable(); + } + + /** + * Getter for filters + */ + get filters$(): Observable + { + return this._filters.asObservable(); + } + + /** + * Getter for folders + */ + get folders$(): Observable + { + return this._folders.asObservable(); + } + + /** + * Getter for labels + */ + get labels$(): Observable + { + return this._labels.asObservable(); + } + + /** + * Getter for mails + */ + get mails$(): Observable + { + return this._mails.asObservable(); + } + + /** + * Getter for mails loading + */ + get mailsLoading$(): Observable + { + return this._mailsLoading.asObservable(); + } + + /** + * Getter for mail + */ + get mail$(): Observable + { + return this._mail.asObservable(); + } + + /** + * Getter for pagination + */ + get pagination$(): Observable + { + return this._pagination.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get filters + */ + getFilters(): Observable + { + return this._httpClient.get('api/apps/mailbox/filters').pipe( + tap((response: any) => { + this._filters.next(response); + }) + ); + } + + /** + * Get folders + */ + getFolders(): Observable + { + return this._httpClient.get('api/apps/mailbox/folders').pipe( + tap((response: any) => { + this._folders.next(response); + }) + ); + } + + /** + * Get labels + */ + getLabels(): Observable + { + return this._httpClient.get('api/apps/mailbox/labels').pipe( + tap((response: any) => { + this._labels.next(response); + }) + ); + } + + /** + * Get mails by filter + */ + getMailsByFilter(filter: string, page: string = '1'): Observable + { + // Execute the mails loading with true + this._mailsLoading.next(true); + + return this._httpClient.get('api/apps/mailbox/mails', { + params: { + filter, + page + } + }).pipe( + tap((response: any) => { + this._category.next({ + type: 'filter', + name: filter + }); + this._mails.next(response.mails); + this._pagination.next(response.pagination); + this._mailsLoading.next(false); + }), + switchMap((response) => { + + if ( response.mails === null ) + { + return throwError({ + message : 'Requested page is not available!', + pagination: response.pagination + }); + } + + return of(response); + }) + ); + } + + /** + * Get mails by folder + */ + getMailsByFolder(folder: string, page: string = '1'): Observable + { + // Execute the mails loading with true + this._mailsLoading.next(true); + + return this._httpClient.get('api/apps/mailbox/mails', { + params: { + folder, + page + } + }).pipe( + tap((response: any) => { + this._category.next({ + type: 'folder', + name: folder + }); + this._mails.next(response.mails); + this._pagination.next(response.pagination); + this._mailsLoading.next(false); + }), + switchMap((response) => { + + if ( response.mails === null ) + { + return throwError({ + message : 'Requested page is not available!', + pagination: response.pagination + }); + } + + return of(response); + }) + ); + } + + /** + * Get mails by label + */ + getMailsByLabel(label: string, page: string = '1'): Observable + { + // Execute the mails loading with true + this._mailsLoading.next(true); + + return this._httpClient.get('api/apps/mailbox/mails', { + params: { + label, + page + } + }).pipe( + tap((response: any) => { + this._category.next({ + type: 'label', + name: label + }); + this._mails.next(response.mails); + this._pagination.next(response.pagination); + this._mailsLoading.next(false); + }), + switchMap((response) => { + + if ( response.mails === null ) + { + return throwError({ + message : 'Requested page is not available!', + pagination: response.pagination + }); + } + + return of(response); + }) + ); + } + + /** + * Get mail by id + */ + getMailById(id: string): Observable + { + return this._mails.pipe( + take(1), + map((mails) => { + + // Find the mail + const mail = mails.find(item => item.id === id) || null; + + // Update the mail + this._mail.next(mail); + + // Return the mail + return mail; + }), + switchMap((mail) => { + + if ( !mail ) + { + return throwError('Could not found mail with id of ' + id + '!'); + } + + return of(mail); + }) + ); + } + + /** + * Update mail + * + * @param id + * @param mail + */ + updateMail(id: string, mail: Mail): Observable + { + return this._httpClient.patch('api/apps/mailbox/mail', { + id, + mail + }).pipe( + tap(() => { + + // Re-fetch the folders on mail update + // to get the updated counts on the sidebar + this.getFolders().subscribe(); + }) + ); + } + + /** + * Reset the current mail + */ + resetMail(): Observable + { + return of(true).pipe( + take(1), + tap(() => { + this._mail.next(null); + }) + ); + } + + /** + * Add label + * + * @param label + */ + addLabel(label: MailLabel): Observable + { + return this.labels$.pipe( + take(1), + switchMap(labels => this._httpClient.post('api/apps/mailbox/label', {label}).pipe( + map((newLabel) => { + + // Update the labels with the new label + this._labels.next([...labels, newLabel]); + + // Return the new label + return newLabel; + }) + )) + ); + } + + /** + * Update label + * + * @param id + * @param label + */ + updateLabel(id: string, label: MailLabel): Observable + { + return this.labels$.pipe( + take(1), + switchMap(labels => this._httpClient.patch('api/apps/mailbox/label', { + id, + label + }).pipe( + map((updatedLabel: any) => { + + // Find the index of the updated label within the labels + const index = labels.findIndex(item => item.id === id); + + // Update the label + labels[index] = updatedLabel; + + // Update the labels + this._labels.next(labels); + + // Return the updated label + return updatedLabel; + }) + )) + ); + } + + /** + * Delete label + * + * @param id + */ + deleteLabel(id: string): Observable + { + return this.labels$.pipe( + take(1), + switchMap(labels => this._httpClient.delete('api/apps/mailbox/label', {params: {id}}).pipe( + map((isDeleted: any) => { + + // Find the index of the deleted label within the labels + const index = labels.findIndex(item => item.id === id); + + // Delete the label + labels.splice(index, 1); + + // Update the labels + this._labels.next(labels); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } +} diff --git a/src/app/modules/admin/apps/mailbox/mailbox.types.ts b/src/app/modules/admin/apps/mailbox/mailbox.types.ts new file mode 100644 index 00000000..323fd04f --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/mailbox.types.ts @@ -0,0 +1,60 @@ +export interface Mail +{ + id?: string; + type?: string; + from?: { + avatar?: string; + contact?: string; + }; + to?: string; + cc?: string[]; + ccCount?: number; + bcc?: string[]; + bccCount?: number; + date?: string; + subject?: string; + content?: string; + attachments?: { + type?: string; + name?: string; + size?: number; + preview?: string; + downloadUrl?: string; + }[]; + starred?: boolean; + important?: boolean; + unread?: boolean; + folder?: string; + labels?: string[]; +} + +export interface MailCategory +{ + type: 'folder' | 'filter' | 'label'; + name: string; +} + +export interface MailFolder +{ + id: string; + title: string; + slug: string; + icon: string; + count?: number; +} + +export interface MailFilter +{ + id: string; + title: string; + slug: string; + icon: string; +} + +export interface MailLabel +{ + id: string; + title: string; + slug: string; + color: string; +} diff --git a/src/app/modules/admin/apps/mailbox/settings/settings.component.html b/src/app/modules/admin/apps/mailbox/settings/settings.component.html new file mode 100644 index 00000000..30e3e3ec --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/settings/settings.component.html @@ -0,0 +1,121 @@ +
+ +
+ +
+ +
+ +
+
Manage Labels
+
Create, update and delete labels
+
+
+ + +
+ + +
+ + New Label + + + + + +
Label color
+
+ + + + +
+
+ +
+
+ + +
+ + + + + + + + +
Label color
+
+ + + + +
+
+ +
+
+
+ +
+
diff --git a/src/app/modules/admin/apps/mailbox/settings/settings.component.ts b/src/app/modules/admin/apps/mailbox/settings/settings.component.ts new file mode 100644 index 00000000..fe967690 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/settings/settings.component.ts @@ -0,0 +1,146 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { debounceTime, take } from 'rxjs/operators'; +import { MailboxComponent } from 'app/modules/admin/apps/mailbox/mailbox.component'; +import { MailboxService } from 'app/modules/admin/apps/mailbox/mailbox.service'; +import { MailLabel } from 'app/modules/admin/apps/mailbox/mailbox.types'; +import { labelColorDefs, labelColors } from 'app/modules/admin/apps/mailbox/mailbox.constants'; + +@Component({ + selector : 'mailbox-settings', + templateUrl : './settings.component.html', + encapsulation: ViewEncapsulation.None +}) +export class MailboxSettingsComponent implements OnInit +{ + labelColors: any = labelColors; + labelColorDefs: any = labelColorDefs; + labels: MailLabel[]; + labelsForm: FormGroup; + + /** + * Constructor + */ + constructor( + public mailboxComponent: MailboxComponent, + private _formBuilder: FormBuilder, + private _mailboxService: MailboxService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the labels form + this.labelsForm = this._formBuilder.group({ + labels : this._formBuilder.array([]), + newLabel: this._formBuilder.group({ + title: ['', Validators.required], + color: ['orange'] + }) + }); + + // Labels + this._mailboxService.labels$ + .pipe(take(1)) + .subscribe((labels: MailLabel[]) => { + + // Get the labels + this.labels = labels; + + // Iterate through the labels + labels.forEach((label) => { + + // Create a label form group + const labelFormGroup = this._formBuilder.group({ + id : [label.id], + title: [label.title, Validators.required], + slug : [label.slug], + color: [label.color] + }); + + // Add the label form group to the labels form array + (this.labelsForm.get('labels') as FormArray).push(labelFormGroup); + }); + }); + + // Update labels when there is a value change + this.labelsForm.get('labels').valueChanges + .pipe(debounceTime(500)) + .subscribe(() => { + this.updateLabels(); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Add a label + */ + addLabel(): void + { + // Add label to the server + this._mailboxService.addLabel(this.labelsForm.get('newLabel').value).subscribe((addedLabel) => { + + // Push the new label to the labels form array + (this.labelsForm.get('labels') as FormArray).push(this._formBuilder.group({ + id : [addedLabel.id], + title: [addedLabel.title, Validators.required], + slug : [addedLabel.slug], + color: [addedLabel.color] + })); + + // Reset the new label form + this.labelsForm.get('newLabel').markAsPristine(); + this.labelsForm.get('newLabel').markAsUntouched(); + this.labelsForm.get('newLabel.title').reset(); + this.labelsForm.get('newLabel.title').clearValidators(); + this.labelsForm.get('newLabel.title').updateValueAndValidity(); + }); + } + + /** + * Delete a label + */ + deleteLabel(id: string): void + { + // Get the labels form array + const labelsFormArray = this.labelsForm.get('labels') as FormArray; + + // Remove the label from the labels form array + labelsFormArray.removeAt(labelsFormArray.value.findIndex((label) => label.id === id)); + + // Delete label on the server + this._mailboxService.deleteLabel(id).subscribe(); + } + + /** + * Update labels + */ + updateLabels(): void + { + // Iterate through the labels form array controls + (this.labelsForm.get('labels') as FormArray).controls.forEach((labelFormGroup) => { + + // If the label has been edited... + if ( labelFormGroup.dirty ) + { + // Update the label on the server + this._mailboxService.updateLabel(labelFormGroup.value.id, labelFormGroup.value).subscribe(); + } + }); + + // Reset the labels form array + this.labelsForm.get('labels').markAsPristine(); + this.labelsForm.get('labels').markAsUntouched(); + } +} diff --git a/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.html b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.html new file mode 100644 index 00000000..93eb5b02 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.html @@ -0,0 +1,21 @@ +
+ +
Mailbox
+ + + + + + +
diff --git a/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.scss b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.scss new file mode 100644 index 00000000..2cb182d1 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.scss @@ -0,0 +1,9 @@ +mailbox-sidebar { + + fuse-vertical-navigation { + + .fuse-vertical-navigation-wrapper { + box-shadow: none !important; + } + } +} diff --git a/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.ts b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.ts new file mode 100644 index 00000000..c7fff6b5 --- /dev/null +++ b/src/app/modules/admin/apps/mailbox/sidebar/sidebar.component.ts @@ -0,0 +1,297 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseNavigationItem, FuseNavigationService } from '@fuse/components/navigation'; +import { MailboxService } from 'app/modules/admin/apps/mailbox/mailbox.service'; +import { MailboxComposeComponent } from 'app/modules/admin/apps/mailbox/compose/compose.component'; +import { labelColorDefs } from 'app/modules/admin/apps/mailbox/mailbox.constants'; +import { MailFilter, MailFolder, MailLabel } from 'app/modules/admin/apps/mailbox/mailbox.types'; + +@Component({ + selector : 'mailbox-sidebar', + templateUrl : './sidebar.component.html', + styleUrls : ['./sidebar.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class MailboxSidebarComponent implements OnInit, OnDestroy +{ + filters: MailFilter[]; + folders: MailFolder[]; + labels: MailLabel[]; + menuData: FuseNavigationItem[] = []; + private _filtersMenuData: FuseNavigationItem[] = []; + private _foldersMenuData: FuseNavigationItem[] = []; + private _labelsMenuData: FuseNavigationItem[] = []; + private _otherMenuData: FuseNavigationItem[] = []; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _mailboxService: MailboxService, + private _matDialog: MatDialog, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Filters + this._mailboxService.filters$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((filters: MailFilter[]) => { + this.filters = filters; + + // Generate menu links + this._generateFiltersMenuLinks(); + }); + + // Folders + this._mailboxService.folders$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((folders: MailFolder[]) => { + this.folders = folders; + + // Generate menu links + this._generateFoldersMenuLinks(); + + // Update navigation badge + this._updateNavigationBadge(folders); + }); + + // Labels + this._mailboxService.labels$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((labels: MailLabel[]) => { + this.labels = labels; + + // Generate menu links + this._generateLabelsMenuLinks(); + }); + + // Generate other menu links + this._generateOtherMenuLinks(); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open compose dialog + */ + openComposeDialog(): void + { + // Open the dialog + const dialogRef = this._matDialog.open(MailboxComposeComponent); + + dialogRef.afterClosed() + .subscribe(result => { + console.log('Compose dialog was closed!'); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Generate menus for folders + * + * @private + */ + private _generateFoldersMenuLinks(): void + { + // Reset the folders menu mock-api + this._foldersMenuData = []; + + // Iterate through the folders + this.folders.forEach((folder) => { + + // Generate menu item for the folder + const menuItem: FuseNavigationItem = { + id : folder.id, + title: folder.title, + type : 'basic', + icon : folder.icon, + link : '/apps/mailbox/' + folder.slug + }; + + // If the count is available and is bigger than zero... + if ( folder.count && folder.count > 0 ) + { + // Add the count as a badge + menuItem['badge'] = { + title: folder.count + '' + }; + } + + // Push the menu item to the folders menu mock-api + this._foldersMenuData.push(menuItem); + }); + + // Update the menu mock-api + this._updateMenuData(); + } + + /** + * Generate menus for filters + * + * @private + */ + private _generateFiltersMenuLinks(): void + { + // Reset the filters menu + this._filtersMenuData = []; + + // Iterate through the filters + this.filters.forEach((filter) => { + + // Generate menu item for the filter + this._filtersMenuData.push({ + id : filter.id, + title: filter.title, + type : 'basic', + icon : filter.icon, + link : '/apps/mailbox/filter/' + filter.slug + }); + }); + + // Update the menu mock-api + this._updateMenuData(); + } + + /** + * Generate menus for labels + * + * @private + */ + private _generateLabelsMenuLinks(): void + { + // Reset the labels menu + this._labelsMenuData = []; + + // Iterate through the labels + this.labels.forEach((label) => { + + // Generate menu item for the label + this._labelsMenuData.push({ + id : label.id, + title : label.title, + type : 'basic', + icon : 'heroicons_outline:tag', + classes: { + icon: labelColorDefs[label.color].text + }, + link : '/apps/mailbox/label/' + label.slug + }); + }); + + // Update the menu mock-api + this._updateMenuData(); + } + + /** + * Generate other menus + * + * @private + */ + private _generateOtherMenuLinks(): void + { + // Settings menu + this._otherMenuData.push({ + title: 'Settings', + type : 'basic', + icon : 'heroicons_outline:cog', + link : '/apps/mailbox/settings' + }); + + // Update the menu mock-api + this._updateMenuData(); + } + + /** + * Update the menu mock-api + * + * @private + */ + private _updateMenuData(): void + { + this.menuData = [ + { + title : 'MAILBOXES', + type : 'group', + children: [ + ...this._foldersMenuData + ] + }, + { + title : 'FILTERS', + type : 'group', + children: [ + ...this._filtersMenuData + ] + }, + { + title : 'LABELS', + type : 'group', + children: [ + ...this._labelsMenuData + ] + }, + { + type: 'spacer' + }, + ...this._otherMenuData + ]; + } + + /** + * Update the navigation badge using the + * unread count of the inbox folder + * + * @param folders + * @private + */ + private _updateNavigationBadge(folders: MailFolder[]): void + { + // Get the inbox folder + const inboxFolder = this.folders.find((folder) => folder.slug === 'inbox'); + + // Get the component -> navigation mock-api -> item + const mainNavigationComponent = this._fuseNavigationService.getComponent('mainNavigation'); + + // If the main navigation component exists... + if ( mainNavigationComponent ) + { + const mainNavigation = mainNavigationComponent.navigation; + const menuItem = this._fuseNavigationService.getItem('apps.mailbox', mainNavigation); + + // Update the badge title of the item + menuItem.badge.title = inboxFolder.count + ''; + + // Refresh the navigation + mainNavigationComponent.refresh(); + } + } +} diff --git a/src/app/modules/admin/apps/tasks/details/details.component.html b/src/app/modules/admin/apps/tasks/details/details.component.html new file mode 100644 index 00000000..20c8cbc0 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/details/details.component.html @@ -0,0 +1,335 @@ +
+ +
+ + +
+ + + + +
+ + + + + + + + +
+ +
+ + + + +
+ + {{task.type === 'task' ? 'Task title' : 'Section title'}} + + +
+ + +
+
Tags
+
+ + + +
+ {{tag.title}} +
+
+
+
+ + + + Edit + + + + + Add + + + + +
+ +
+
+ +
+ +
+
+ +
+
+ + +
+ + +
{{tag.title}}
+
+
+ + +
+
+ + + + +
+
+
+ +
+ +
Create "{{newTagInput.value}}"
+
+
+
+
+
+
+
+ + +
+ + +
+
Priority
+
+ + + + + Low + + + + + + Normal + + + + + + High + +
+ + + + + + + + + + +
+ + +
+
Due date
+
+ + + {{task.dueDate | date:'longDate'}} + Not set + + +
+
+ +
+ + +
+ + Notes + + +
+ +
+ +
diff --git a/src/app/modules/admin/apps/tasks/details/details.component.ts b/src/app/modules/admin/apps/tasks/details/details.component.ts new file mode 100644 index 00000000..c4756fc0 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/details/details.component.ts @@ -0,0 +1,526 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, Renderer2, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { TemplatePortal } from '@angular/cdk/portal'; +import { Overlay, OverlayRef } from '@angular/cdk/overlay'; +import { MatDrawerToggleResult } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { debounceTime, filter, takeUntil, tap } from 'rxjs/operators'; +import { assign } from 'lodash-es'; +import * as moment from 'moment'; +import { Tag, Task } from 'app/modules/admin/apps/tasks/tasks.types'; +import { TasksListComponent } from 'app/modules/admin/apps/tasks/list/list.component'; +import { TasksService } from 'app/modules/admin/apps/tasks/tasks.service'; + +@Component({ + selector : 'tasks-details', + templateUrl : './details.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TasksDetailsComponent implements OnInit, AfterViewInit, OnDestroy +{ + @ViewChild('tagsPanelOrigin') private _tagsPanelOrigin: ElementRef; + @ViewChild('tagsPanel') private _tagsPanel: TemplateRef; + @ViewChild('titleField') private _titleField: ElementRef; + + tags: Tag[]; + tagsEditMode: boolean = false; + filteredTags: Tag[]; + task: Task; + taskForm: FormGroup; + tasks: Task[]; + private _tagsPanelOverlayRef: OverlayRef; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + private _formBuilder: FormBuilder, + private _renderer2: Renderer2, + private _router: Router, + private _tasksListComponent: TasksListComponent, + private _tasksService: TasksService, + private _overlay: Overlay, + private _viewContainerRef: ViewContainerRef + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Open the drawer + this._tasksListComponent.matDrawer.open(); + + // Create the task form + this.taskForm = this._formBuilder.group({ + id : [''], + type : [''], + title : [''], + notes : [''], + completed: [false], + dueDate : [null], + priority : [0], + tags : [[]], + order : [0] + }); + + // Get the tags + this._tasksService.tags$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tags: Tag[]) => { + this.tags = tags; + this.filteredTags = tags; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the tasks + this._tasksService.tasks$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tasks: Task[]) => { + this.tasks = tasks; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the task + this._tasksService.task$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((task: Task) => { + + // Open the drawer in case it is closed + this._tasksListComponent.matDrawer.open(); + + // Get the task + this.task = task; + + // Patch values to the form from the task + this.taskForm.patchValue(task, {emitEvent: false}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Update task when there is a value change on the task form + this.taskForm.valueChanges + .pipe( + tap((value) => { + + // Update the task object + this.task = assign(this.task, value); + }), + debounceTime(300), + takeUntil(this._unsubscribeAll) + ) + .subscribe((value) => { + + // Update the task on the server + this._tasksService.updateTask(value.id, value).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Listen for NavigationEnd event to focus on the title field + this._router.events + .pipe( + takeUntil(this._unsubscribeAll), + filter(event => event instanceof NavigationEnd) + ) + .subscribe(() => { + + // Focus on the title field + this._titleField.nativeElement.focus(); + }); + } + + /** + * After view init + */ + ngAfterViewInit(): void + { + // Listen for matDrawer opened change + this._tasksListComponent.matDrawer.openedChange + .pipe( + takeUntil(this._unsubscribeAll), + filter(opened => opened) + ) + .subscribe(() => { + + // Focus on the title element + this._titleField.nativeElement.focus(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Dispose the overlay + if ( this._tagsPanelOverlayRef ) + { + this._tagsPanelOverlayRef.dispose(); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Close the drawer + */ + closeDrawer(): Promise + { + return this._tasksListComponent.matDrawer.close(); + } + + /** + * Toggle the completed status + */ + toggleCompleted(): void + { + // Get the form control for 'completed' + const completedFormControl = this.taskForm.get('completed'); + + // Toggle the completed status + completedFormControl.setValue(!completedFormControl.value); + } + + /** + * Open tags panel + */ + openTagsPanel(): void + { + // Create the overlay + this._tagsPanelOverlayRef = this._overlay.create({ + backdropClass : '', + hasBackdrop : true, + scrollStrategy : this._overlay.scrollStrategies.block(), + positionStrategy: this._overlay.position() + .flexibleConnectedTo(this._tagsPanelOrigin.nativeElement) + .withFlexibleDimensions() + .withViewportMargin(64) + .withLockedPosition() + .withPositions([ + { + originX : 'start', + originY : 'bottom', + overlayX: 'start', + overlayY: 'top' + } + ]) + }); + + // Subscribe to the attachments observable + this._tagsPanelOverlayRef.attachments().subscribe(() => { + + // Focus to the search input once the overlay has been attached + this._tagsPanelOverlayRef.overlayElement.querySelector('input').focus(); + }); + + // Create a portal from the template + const templatePortal = new TemplatePortal(this._tagsPanel, this._viewContainerRef); + + // Attach the portal to the overlay + this._tagsPanelOverlayRef.attach(templatePortal); + + // Subscribe to the backdrop click + this._tagsPanelOverlayRef.backdropClick().subscribe(() => { + + // If overlay exists and attached... + if ( this._tagsPanelOverlayRef && this._tagsPanelOverlayRef.hasAttached() ) + { + // Detach it + this._tagsPanelOverlayRef.detach(); + + // Reset the tag filter + this.filteredTags = this.tags; + + // Toggle the edit mode off + this.tagsEditMode = false; + } + + // If template portal exists and attached... + if ( templatePortal && templatePortal.isAttached ) + { + // Detach it + templatePortal.detach(); + } + }); + } + + /** + * Toggle the tags edit mode + */ + toggleTagsEditMode(): void + { + this.tagsEditMode = !this.tagsEditMode; + } + + /** + * Filter tags + * + * @param event + */ + filterTags(event): void + { + // Get the value + const value = event.target.value.toLowerCase(); + + // Filter the tags + this.filteredTags = this.tags.filter(tag => tag.title.toLowerCase().includes(value)); + } + + /** + * Filter tags input key down event + * + * @param event + */ + filterTagsInputKeyDown(event): void + { + // Return if the pressed key is not 'Enter' + if ( event.key !== 'Enter' ) + { + return; + } + + // If there is no tag available... + if ( this.filteredTags.length === 0 ) + { + // Create the tag + this.createTag(event.target.value); + + // Clear the input + event.target.value = ''; + + // Return + return; + } + + // If there is a tag... + const tag = this.filteredTags[0]; + const isTagApplied = this.task.tags.find((id) => id === tag.id); + + // If the found tag is already applied to the task... + if ( isTagApplied ) + { + // Remove the tag from the task + this.deleteTagFromTask(tag); + } + else + { + // Otherwise add the tag to the task + this.addTagToTask(tag); + } + } + + /** + * Create a new tag + * + * @param title + */ + createTag(title: string): void + { + const tag = { + title + }; + + // Create tag on the server + this._tasksService.createTag(tag) + .subscribe((response) => { + + // Add the tag to the task + this.addTagToTask(response); + }); + } + + /** + * Update the tag title + * + * @param tag + * @param event + */ + updateTagTitle(tag: Tag, event): void + { + // Update the title on the tag + tag.title = event.target.value; + + // Update the tag on the server + this._tasksService.updateTag(tag.id, tag) + .pipe(debounceTime(300)) + .subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Delete the tag + * + * @param tag + */ + deleteTag(tag: Tag): void + { + // Delete the tag from the server + this._tasksService.deleteTag(tag.id).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Add tag to the task + * + * @param tag + */ + addTagToTask(tag: Tag): void + { + // Add the tag + this.task.tags.unshift(tag.id); + + // Update the task form + this.taskForm.get('tags').patchValue(this.task.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Delete tag from the task + * + * @param tag + */ + deleteTagFromTask(tag: Tag): void + { + // Remove the tag + this.task.tags.splice(this.task.tags.findIndex(item => item === tag.id), 1); + + // Update the task form + this.taskForm.get('tags').patchValue(this.task.tags); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle task tag + * + * @param tag + */ + toggleTaskTag(tag: Tag): void + { + if ( this.task.tags.includes(tag.id) ) + { + this.deleteTagFromTask(tag); + } + else + { + this.addTagToTask(tag); + } + } + + /** + * Should the create tag button be visible + * + * @param inputValue + */ + shouldShowCreateTagButton(inputValue: string): boolean + { + return !!!(inputValue === '' || this.tags.findIndex(tag => tag.title.toLowerCase() === inputValue.toLowerCase()) > -1); + } + + /** + * Set the task priority + * + * @param priority + */ + setTaskPriority(priority): void + { + // Set the value + this.taskForm.get('priority').setValue(priority); + } + + /** + * Check if the task is overdue or not + */ + isOverdue(): boolean + { + return moment(this.task.dueDate, moment.ISO_8601).isBefore(moment(), 'days'); + } + + /** + * Delete the task + */ + deleteTask(): void + { + // Get the current task's id + const id = this.task.id; + + // Get the next/previous task's id + const currentTaskIndex = this.tasks.findIndex(item => item.id === id); + const nextTaskIndex = currentTaskIndex + ((currentTaskIndex === (this.tasks.length - 1)) ? -1 : 1); + const nextTaskId = (this.tasks.length === 1 && this.tasks[0].id === id) ? null : this.tasks[nextTaskIndex].id; + + // Delete the task + this._tasksService.deleteTask(id) + .subscribe((isDeleted) => { + + // Return if the task wasn't deleted... + if ( !isDeleted ) + { + return; + } + + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Navigate to the next task if available + if ( nextTaskId ) + { + this._router.navigate(['../', nextTaskId], {relativeTo: route}); + } + // Otherwise, navigate to the parent + else + { + this._router.navigate(['../'], {relativeTo: route}); + } + }); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/tasks/list/list.component.html b/src/app/modules/admin/apps/tasks/list/list.component.html new file mode 100644 index 00000000..58996f66 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/list/list.component.html @@ -0,0 +1,180 @@ +
+ + + + + + + + + + + +
+ + +
+ +
+
Tasks
+
+ All tasks completed! + {{tasksCount.incomplete}} remaining tasks +
+
+ +
+ + + + +
+
+ + + + + + + + +
+ +
Add a task to start planning!
+
+
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/apps/tasks/list/list.component.ts b/src/app/modules/admin/apps/tasks/list/list.component.ts new file mode 100644 index 00000000..38e159d1 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/list/list.component.ts @@ -0,0 +1,264 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { MatDrawer } from '@angular/material/sidenav'; +import { fromEvent, Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { FuseNavigationService } from '@fuse/components/navigation'; +import { Tag, Task } from 'app/modules/admin/apps/tasks/tasks.types'; +import { TasksService } from 'app/modules/admin/apps/tasks/tasks.service'; + +@Component({ + selector : 'tasks-list', + templateUrl : './list.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TasksListComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + + drawerMode: 'side' | 'over'; + selectedTask: Task; + tags: Tag[]; + tasks: Task[]; + tasksCount: any = { + completed : 0, + incomplete: 0, + total : 0 + }; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + @Inject(DOCUMENT) private _document: any, + private _router: Router, + private _tasksService: TasksService, + private _fuseMediaWatcherService: FuseMediaWatcherService, + private _fuseNavigationService: FuseNavigationService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the tags + this._tasksService.tags$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tags: Tag[]) => { + this.tags = tags; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Get the tasks + this._tasksService.tasks$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((tasks: Task[]) => { + this.tasks = tasks; + + // Update the counts + this.tasksCount.total = this.tasks.filter(task => task.type === 'task').length; + this.tasksCount.completed = this.tasks.filter(task => task.type === 'task' && task.completed).length; + this.tasksCount.incomplete = this.tasksCount.total - this.tasksCount.completed; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + // Update the count on the navigation + setTimeout(() => { + + // Get the component -> navigation data -> item + const mainNavigationComponent = this._fuseNavigationService.getComponent('mainNavigation'); + + // If the main navigation component exists... + if ( mainNavigationComponent ) + { + const mainNavigation = mainNavigationComponent.navigation; + const menuItem = this._fuseNavigationService.getItem('apps.tasks', mainNavigation); + + // Update the subtitle of the item + menuItem.subtitle = this.tasksCount.incomplete + ' remaining tasks'; + + // Refresh the navigation + mainNavigationComponent.refresh(); + } + }); + }); + + // Get the task + this._tasksService.task$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((task: Task) => { + this.selectedTask = task; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to media query change + this._fuseMediaWatcherService.onMediaQueryChange$('(min-width: 1440px)') + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((state) => { + + // Calculate the drawer mode + this.drawerMode = state.matches ? 'side' : 'over'; + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Listen for shortcuts + fromEvent(this._document, 'keydown') + .pipe( + takeUntil(this._unsubscribeAll), + filter((event) => { + return (event.ctrlKey === true || event.metaKey) // Ctrl or Cmd + && (event.key === '/' || event.key === '.'); // '/' or '.' key + }) + ) + .subscribe((event: KeyboardEvent) => { + + // If the '/' pressed + if ( event.key === '/' ) + { + this.createTask('task'); + } + + // If the '.' pressed + if ( event.key === '.' ) + { + this.createTask('section'); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Go to task + * + * @param id + */ + goToTask(id: string): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go to task + this._router.navigate(['../', id], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * On backdrop clicked + */ + onBackdropClicked(): void + { + // Get the current activated route + let route = this._activatedRoute; + while ( route.firstChild ) + { + route = route.firstChild; + } + + // Go to the parent route + this._router.navigate(['../'], {relativeTo: route}); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Create task + * + * @param type + */ + createTask(type: 'task' | 'section'): void + { + // Create the task + this._tasksService.createTask(type).subscribe((newTask) => { + + // Go to new task + this.goToTask(newTask.id); + }); + } + + /** + * Toggle the completed status + * of the given task + * + * @param task + */ + toggleCompleted(task: Task): void + { + // Toggle the completed status + task.completed = !task.completed; + + // Update the task on the server + this._tasksService.updateTask(task.id, task).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Task dropped + * + * @param event + */ + dropped(event: CdkDragDrop): void + { + // Move the item in the array + moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); + + // Save the new order + this._tasksService.updateTasksOrders(event.container.data).subscribe(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/apps/tasks/tasks.component.html b/src/app/modules/admin/apps/tasks/tasks.component.html new file mode 100644 index 00000000..0680b43f --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.component.html @@ -0,0 +1 @@ + diff --git a/src/app/modules/admin/apps/tasks/tasks.component.ts b/src/app/modules/admin/apps/tasks/tasks.component.ts new file mode 100644 index 00000000..71908160 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'tasks', + templateUrl : './tasks.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TasksComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/apps/tasks/tasks.guards.ts b/src/app/modules/admin/apps/tasks/tasks.guards.ts new file mode 100644 index 00000000..382fac9f --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.guards.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { TasksDetailsComponent } from 'app/modules/admin/apps/tasks/details/details.component'; + +@Injectable({ + providedIn: 'root' +}) +export class CanDeactivateTasksDetails implements CanDeactivate +{ + canDeactivate( + component: TasksDetailsComponent, + currentRoute: ActivatedRouteSnapshot, + currentState: RouterStateSnapshot, + nextState: RouterStateSnapshot + ): Observable | Promise | boolean | UrlTree + { + // Get the next route + let nextRoute: ActivatedRouteSnapshot = nextState.root; + while ( nextRoute.firstChild ) + { + nextRoute = nextRoute.firstChild; + } + + // If the next state doesn't contain '/tasks' + // it means we are navigating away from the + // tasks app + if ( !nextState.url.includes('/tasks') ) + { + // Let it navigate + return true; + } + + // If we are navigating to another task... + if ( nextRoute.paramMap.get('id') ) + { + // Just navigate + return true; + } + // Otherwise... + else + { + // Close the drawer first, and then navigate + return component.closeDrawer().then(() => { + return true; + }); + } + } +} diff --git a/src/app/modules/admin/apps/tasks/tasks.module.ts b/src/app/modules/admin/apps/tasks/tasks.module.ts new file mode 100644 index 00000000..b6a8e939 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.module.ts @@ -0,0 +1,77 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MAT_DATE_FORMATS, MatRippleModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import * as moment from 'moment'; +import { FuseAutogrowModule } from '@fuse/directives/autogrow'; +import { FuseFindByKeyPipeModule } from '@fuse/pipes/find-by-key'; +import { SharedModule } from 'app/shared/shared.module'; +import { tasksRoutes } from 'app/modules/admin/apps/tasks/tasks.routing'; +import { TasksComponent } from 'app/modules/admin/apps/tasks/tasks.component'; +import { TasksDetailsComponent } from 'app/modules/admin/apps/tasks/details/details.component'; +import { TasksListComponent } from 'app/modules/admin/apps/tasks/list/list.component'; + +@NgModule({ + declarations: [ + TasksComponent, + TasksDetailsComponent, + TasksListComponent + ], + imports : [ + RouterModule.forChild(tasksRoutes), + DragDropModule, + MatAutocompleteModule, + MatButtonModule, + MatCheckboxModule, + MatDatepickerModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatMomentDateModule, + MatProgressBarModule, + MatRadioModule, + MatRippleModule, + MatSelectModule, + MatSidenavModule, + MatTooltipModule, + FuseAutogrowModule, + FuseFindByKeyPipeModule, + SharedModule + ], + providers : [ + { + provide : MAT_DATE_FORMATS, + useValue: { + parse : { + dateInput: moment.ISO_8601 + }, + display: { + dateInput : 'll', + monthYearLabel : 'MMM YYYY', + dateA11yLabel : 'LL', + monthYearA11yLabel: 'MMMM YYYY' + } + } + } + ] +}) +export class TasksModule +{ +} diff --git a/src/app/modules/admin/apps/tasks/tasks.resolvers.ts b/src/app/modules/admin/apps/tasks/tasks.resolvers.ts new file mode 100644 index 00000000..088110b9 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.resolvers.ts @@ -0,0 +1,110 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { TasksService } from 'app/modules/admin/apps/tasks/tasks.service'; +import { Tag, Task } from 'app/modules/admin/apps/tasks/tasks.types'; + +@Injectable({ + providedIn: 'root' +}) +export class TasksTagsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _tasksService: TasksService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._tasksService.getTags(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class TasksResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _tasksService: TasksService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._tasksService.getTasks(); + } +} + +@Injectable({ + providedIn: 'root' +}) +export class TasksTaskResolver implements Resolve +{ + /** + * Constructor + */ + constructor( + private _router: Router, + private _tasksService: TasksService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._tasksService.getTaskById(route.paramMap.get('id')) + .pipe( + // Error here means the requested task is not available + catchError((error) => { + + // Log the error + console.error(error); + + // Get the parent url + const parentUrl = state.url.split('/').slice(0, -1).join('/'); + + // Navigate to there + this._router.navigateByUrl(parentUrl); + + // Throw an error + return throwError(error); + }) + ); + } +} diff --git a/src/app/modules/admin/apps/tasks/tasks.routing.ts b/src/app/modules/admin/apps/tasks/tasks.routing.ts new file mode 100644 index 00000000..ead2c636 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.routing.ts @@ -0,0 +1,35 @@ +import { Route } from '@angular/router'; +import { CanDeactivateTasksDetails } from 'app/modules/admin/apps/tasks/tasks.guards'; +import { TasksResolver, TasksTagsResolver, TasksTaskResolver } from 'app/modules/admin/apps/tasks/tasks.resolvers'; +import { TasksComponent } from 'app/modules/admin/apps/tasks/tasks.component'; +import { TasksListComponent } from 'app/modules/admin/apps/tasks/list/list.component'; +import { TasksDetailsComponent } from 'app/modules/admin/apps/tasks/details/details.component'; + +export const tasksRoutes: Route[] = [ + { + path : '', + component: TasksComponent, + resolve : { + tags: TasksTagsResolver + }, + children : [ + { + path : '', + component: TasksListComponent, + resolve : { + tasks: TasksResolver + }, + children : [ + { + path : ':id', + component : TasksDetailsComponent, + resolve : { + task: TasksTaskResolver + }, + canDeactivate: [CanDeactivateTasksDetails] + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/apps/tasks/tasks.service.ts b/src/app/modules/admin/apps/tasks/tasks.service.ts new file mode 100644 index 00000000..633eac64 --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.service.ts @@ -0,0 +1,327 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable, of, throwError } from 'rxjs'; +import { filter, map, switchMap, take, tap } from 'rxjs/operators'; +import { Tag, Task } from 'app/modules/admin/apps/tasks/tasks.types'; + +@Injectable({ + providedIn: 'root' +}) +export class TasksService +{ + // Private + private _tags: BehaviorSubject = new BehaviorSubject(null); + private _task: BehaviorSubject = new BehaviorSubject(null); + private _tasks: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for tags + */ + get tags$(): Observable + { + return this._tags.asObservable(); + } + + /** + * Getter for task + */ + get task$(): Observable + { + return this._task.asObservable(); + } + + /** + * Getter for tasks + */ + get tasks$(): Observable + { + return this._tasks.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get tags + */ + getTags(): Observable + { + return this._httpClient.get('api/apps/tasks/tags').pipe( + tap((response: any) => { + this._tags.next(response); + }) + ); + } + + /** + * Crate tag + * + * @param tag + */ + createTag(tag: Tag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.post('api/apps/tasks/tag', {tag}).pipe( + map((newTag) => { + + // Update the tags with the new tag + this._tags.next([...tags, newTag]); + + // Return new tag from observable + return newTag; + }) + )) + ); + } + + /** + * Update the tag + * + * @param id + * @param tag + */ + updateTag(id: string, tag: Tag): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.patch('api/apps/tasks/tag', { + id, + tag + }).pipe( + map((updatedTag) => { + + // Find the index of the updated tag + const index = tags.findIndex(item => item.id === id); + + // Update the tag + tags[index] = updatedTag; + + // Update the tags + this._tags.next(tags); + + // Return the updated tag + return updatedTag; + }) + )) + ); + } + + /** + * Delete the tag + * + * @param id + */ + deleteTag(id: string): Observable + { + return this.tags$.pipe( + take(1), + switchMap(tags => this._httpClient.delete('api/apps/tasks/tag', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted tag + const index = tags.findIndex(item => item.id === id); + + // Delete the tag + tags.splice(index, 1); + + // Update the tags + this._tags.next(tags); + + // Return the deleted status + return isDeleted; + }), + filter(isDeleted => isDeleted), + switchMap(isDeleted => this.tasks$.pipe( + take(1), + map((tasks) => { + + // Iterate through the tasks + tasks.forEach((task) => { + + const tagIndex = task.tags.findIndex(tag => tag === id); + + // If the task has a tag, remove it + if ( tagIndex > -1 ) + { + task.tags.splice(tagIndex, 1); + } + }); + + // Return the deleted status + return isDeleted; + }) + )) + )) + ); + } + + /** + * Get tasks + */ + getTasks(): Observable + { + return this._httpClient.get('api/apps/tasks/all').pipe( + tap((response) => { + this._tasks.next(response); + }) + ); + } + + /** + * Update tasks orders + * + * @param tasks + */ + updateTasksOrders(tasks: Task[]): Observable + { + return this._httpClient.patch('api/apps/tasks/order', {tasks}); + } + + /** + * Search tasks with given query + * + * @param query + */ + searchTasks(query: string): Observable + { + return this._httpClient.get('api/apps/tasks/search', {params: {query}}); + } + + /** + * Get task by id + */ + getTaskById(id: string): Observable + { + return this._tasks.pipe( + take(1), + map((tasks) => { + + // Find the task + const task = tasks.find(item => item.id === id) || null; + + // Update the task + this._task.next(task); + + // Return the task + return task; + }), + switchMap((task) => { + + if ( !task ) + { + return throwError('Could not found task with id of ' + id + '!'); + } + + return of(task); + }) + ); + } + + /** + * Create task + * + * @param type + */ + createTask(type: string): Observable + { + return this.tasks$.pipe( + take(1), + switchMap((tasks) => this._httpClient.post('api/apps/tasks/task', {type}).pipe( + map((newTask) => { + + // Update the tasks with the new task + this._tasks.next([newTask, ...tasks]); + + // Return the new task + return newTask; + }) + )) + ); + } + + /** + * Update task + * + * @param id + * @param task + */ + updateTask(id: string, task: Task): Observable + { + return this.tasks$ + .pipe( + take(1), + switchMap(tasks => this._httpClient.patch('api/apps/tasks/task', { + id, + task + }).pipe( + map((updatedTask) => { + + // Find the index of the updated task + const index = tasks.findIndex(item => item.id === id); + + // Update the task + tasks[index] = updatedTask; + + // Update the tasks + this._tasks.next(tasks); + + // Return the updated task + return updatedTask; + }), + switchMap(updatedTask => this.task$.pipe( + take(1), + filter(item => item && item.id === id), + tap(() => { + + // Update the task if it's selected + this._task.next(updatedTask); + + // Return the updated task + return updatedTask; + }) + )) + )) + ); + } + + /** + * Delete the task + * + * @param id + */ + deleteTask(id: string): Observable + { + return this.tasks$.pipe( + take(1), + switchMap(tasks => this._httpClient.delete('api/apps/tasks/task', {params: {id}}).pipe( + map((isDeleted: boolean) => { + + // Find the index of the deleted task + const index = tasks.findIndex(item => item.id === id); + + // Delete the task + tasks.splice(index, 1); + + // Update the tasks + this._tasks.next(tasks); + + // Return the deleted status + return isDeleted; + }) + )) + ); + } +} diff --git a/src/app/modules/admin/apps/tasks/tasks.types.ts b/src/app/modules/admin/apps/tasks/tasks.types.ts new file mode 100644 index 00000000..d66b6b0d --- /dev/null +++ b/src/app/modules/admin/apps/tasks/tasks.types.ts @@ -0,0 +1,18 @@ +export interface Tag +{ + id?: string; + title?: string; +} + +export interface Task +{ + id: string; + type: 'task' | 'section'; + title: string; + notes: string; + completed: boolean; + dueDate: string | null; + priority: 0 | 1 | 2; + tags: string[]; + order: number; +} diff --git a/src/app/modules/admin/dashboards/analytics/analytics.component.html b/src/app/modules/admin/dashboards/analytics/analytics.component.html new file mode 100644 index 00000000..584e0426 --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.component.html @@ -0,0 +1,509 @@ +
+ +
+ + +
+
+
Analytics dashboard
+
Monitor metrics, check reports and review performance
+
+
+ + + + +
+ + + + + +
+
+
+ +
+ +
+
+
+
Visitors Overview
+
Number of unique visitors
+
+
+ +
+ + + + + +
+
+
+
+ +
+
+ +
+
+
Conversions
+
+ + + + + + +
+
+
+
{{data.conversions.amount | number:'1.0-0'}}
+
+ +
+ 2% + below target +
+
+
+
+ +
+
+ +
+
+
Impressions
+
+ + + + + + +
+
+
+
{{data.impressions.amount | number:'1.0-0'}}
+
+ +
+ 4% + below target +
+
+
+
+ +
+
+ +
+
+
Visits
+
+ + + + + + +
+
+
+
{{data.visits.amount | number:'1.0-0'}}
+
+ +
+ 4% + below target +
+
+
+
+ +
+
+
+ + +
+
+
Visitors vs. Page Views
+
+ + + + + + +
+
+
+
+
+
+
Overall Score
+ +
+
+
{{data.visitorsVsPageViews.overallScore}}
+
+ +
42.9%
+
+
+
+
+
+
Average Ratio
+ +
+
+
{{data.visitorsVsPageViews.averageRatio | number:'1.0-0'}}%
+
+ +
13.1%
+
+
+
+
+
+
Predicted Ratio
+ +
+
+
{{data.visitorsVsPageViews.predictedRatio | number:'1.0-0'}}%
+
+ +
22.2%
+
+
+
+
+
+
+ +
+
+ + +
+
Your Audience
+
Demographic properties of your users
+
+
+ +
+
+
New vs. Returning
+
+ + + + + + +
+
+
+ +
+
+
+ +
+
+
+
{{data.newVsReturning.labels[i]}}
+
+
{{data.newVsReturning.uniqueVisitors * dataset / 100 | number:'1.0-0'}}
+
{{dataset}}%
+
+
+
+
+
+ +
+
+
Gender
+
+ + + + + + +
+
+
+ +
+
+
+ +
+
+
+
{{data.gender.labels[i]}}
+
+
{{data.gender.uniqueVisitors * dataset / 100 | number:'1.0-0'}}
+
{{dataset}}%
+
+
+
+
+
+ +
+
+
Age
+
+ + + + + + +
+
+
+ +
+
+
+ +
+
+
+
{{data.age.labels[i]}}
+
+
{{data.age.uniqueVisitors * dataset / 100 | number:'1.0-0'}}
+
{{dataset}}%
+
+
+
+
+
+ +
+
+
Language
+
+ + + + + + +
+
+
+ +
+
+
+ +
+
+
+
{{data.language.labels[i]}}
+
+
{{data.language.uniqueVisitors * dataset / 100 | number:'1.0-0'}}
+
{{dataset}}%
+
+
+
+
+
+
+ +
+ +
diff --git a/src/app/modules/admin/dashboards/analytics/analytics.component.ts b/src/app/modules/admin/dashboards/analytics/analytics.component.ts new file mode 100644 index 00000000..e8e6d52c --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.component.ts @@ -0,0 +1,676 @@ +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { ApexOptions } from 'ng-apexcharts'; +import { AnalyticsService } from 'app/modules/admin/dashboards/analytics/analytics.service'; + +@Component({ + selector : 'analytics', + templateUrl : './analytics.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AnalyticsComponent implements OnInit, OnDestroy +{ + chartVisitors: ApexOptions; + chartConversions: ApexOptions; + chartImpressions: ApexOptions; + chartVisits: ApexOptions; + chartVisitorsVsPageViews: ApexOptions; + data: any; + private _unsubscribeAll: Subject = new Subject(); + + chartAge: ApexOptions; + averagePurchaseValueOptions: ApexOptions; + browsersOptions: ApexOptions; + channelsOptions: ApexOptions; + devicesOptions: ApexOptions; + chartGender: ApexOptions; + chartLanguage: ApexOptions; + chartNewVsReturning: ApexOptions; + refundsOptions: ApexOptions; + totalVisitsOptions: ApexOptions; + uniqueVisitorsOptions: ApexOptions; + uniquePurchasesOptions: ApexOptions; + + /** + * Constructor + */ + constructor( + private _analyticsService: AnalyticsService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the data + this._analyticsService.data$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((data) => { + + // Store the data + this.data = data; + + // Prepare the chart data + this._prepareChartData(); + }); + + // Attach SVG fill fixer to all ApexCharts + window['Apex'] = { + chart: { + events: { + mounted: (chart: any, options?: any) => { + this._fixSvgFill(chart.el); + }, + updated: (chart: any, options?: any) => { + this._fixSvgFill(chart.el); + } + } + } + }; + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Fix the SVG fill references. This fix must be applied to all ApexCharts + * charts in order to fix 'black color on gradient fills on certain browsers' + * issue caused by the '' tag. + * + * Fix based on https://gist.github.com/Kamshak/c84cdc175209d1a30f711abd6a81d472 + * + * @param element + * @private + */ + private _fixSvgFill(element: Element): void + { + // Current URL + const currentURL = this._router.url; + + // 1. Find all elements with 'fill' attribute within the element + // 2. Filter out the ones that doesn't have cross reference so we only left with the ones that use the 'url(#id)' syntax + // 3. Insert the 'currentURL' at the front of the 'fill' attribute value + Array.from(element.querySelectorAll('*[fill]')) + .filter((el) => el.getAttribute('fill').indexOf('url(') !== -1) + .forEach((el) => { + const attrVal = el.getAttribute('fill'); + el.setAttribute('fill', `url(${currentURL}${attrVal.slice(attrVal.indexOf('#'))}`); + }); + } + + /** + * Prepare the chart data from the data + * + * @private + */ + private _prepareChartData(): void + { + // Visitors + this.chartVisitors = { + chart : { + animations: { + speed : 400, + animateGradually: { + enabled: false + } + }, + fontFamily: 'inherit', + foreColor : 'inherit', + width : '100%', + height : '100%', + type : 'area', + toolbar : { + show: false + }, + zoom : { + enabled: false + } + }, + colors : ['#818CF8'], + dataLabels: { + enabled: false + }, + fill : { + colors: ['#312E81'] + }, + grid : { + show : true, + borderColor: '#334155', + padding : { + top : 10, + bottom: -40, + left : 0, + right : 0 + }, + position : 'back', + xaxis : { + lines: { + show: true + } + } + }, + series : this.data.visitors.series, + stroke : { + width: 2 + }, + tooltip : { + followCursor: true, + theme : 'dark', + x : { + format: 'MMM dd, yyyy' + }, + y : { + formatter(value: number): string + { + return `${value}`; + } + } + }, + xaxis : { + axisBorder: { + show: false + }, + axisTicks : { + show: false + }, + crosshairs: { + stroke: { + color : '#475569', + dashArray: 0, + width : 2 + } + }, + labels : { + offsetY: -20, + style : { + colors: '#CBD5E1' + } + }, + tickAmount: 20, + tooltip : { + enabled: false + }, + type : 'datetime' + }, + yaxis : { + axisTicks : { + show: false + }, + axisBorder: { + show: false + }, + min : min => min - 750, + max : max => max + 250, + tickAmount: 5, + show : false + } + }; + + // Conversions + this.chartConversions = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'area', + sparkline : { + enabled: true + } + }, + colors : ['#38BDF8'], + fill : { + colors : ['#38BDF8'], + opacity: 0.5 + }, + series : this.data.conversions.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + followCursor: true, + theme : 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.conversions.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return val.toString(); + } + } + } + }; + + // Impressions + this.chartImpressions = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'area', + sparkline : { + enabled: true + } + }, + colors : ['#34D399'], + fill : { + colors : ['#34D399'], + opacity: 0.5 + }, + series : this.data.impressions.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + followCursor: true, + theme : 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.impressions.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return val.toString(); + } + } + } + }; + + // Visits + this.chartVisits = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'area', + sparkline : { + enabled: true + } + }, + colors : ['#FB7185'], + fill : { + colors : ['#FB7185'], + opacity: 0.5 + }, + series : this.data.visits.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + followCursor: true, + theme : 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.visits.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return val.toString(); + } + } + } + }; + + // Visitors vs Page Views + this.chartVisitorsVsPageViews = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'area', + toolbar : { + show: false + }, + zoom : { + enabled: false + } + }, + colors : ['#64748B', '#94A3B8'], + dataLabels: { + enabled: false + }, + fill : { + colors : ['#64748B', '#94A3B8'], + opacity: 0.5 + }, + grid : { + show : false, + padding: { + bottom: -40, + left : 0, + right : 0 + } + }, + legend : { + show: false + }, + series : this.data.visitorsVsPageViews.series, + stroke : { + curve: 'smooth', + width: 2 + }, + tooltip : { + followCursor: true, + theme : 'dark', + x : { + format: 'MMM dd, yyyy' + } + }, + xaxis : { + axisBorder: { + show: false + }, + labels : { + offsetY: -20, + rotate : 0, + style : { + colors: 'var(--fuse-text-secondary)' + } + }, + tickAmount: 3, + tooltip : { + enabled: false + }, + type : 'datetime' + }, + yaxis : { + labels : { + style: { + colors: 'var(--fuse-text-secondary)' + } + }, + max : max => max + 250, + min : min => min - 250, + show : false, + tickAmount: 5 + } + }; + + // New vs. returning + this.chartNewVsReturning = { + chart : { + animations: { + speed : 400, + animateGradually: { + enabled: false + } + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'donut', + sparkline : { + enabled: true + } + }, + colors : ['#3182CE', '#63B3ED'], + labels : this.data.newVsReturning.labels, + plotOptions: { + pie: { + customScale : 0.9, + expandOnClick: false, + donut : { + size: '70%' + } + } + }, + series : this.data.newVsReturning.series, + states : { + hover : { + filter: { + type: 'none' + } + }, + active: { + filter: { + type: 'none' + } + } + }, + tooltip : { + enabled : true, + fillSeriesColor: false, + theme : 'dark', + custom : ({ + seriesIndex, + w + }) => { + return `
+
+
${w.config.labels[seriesIndex]}:
+
${w.config.series[seriesIndex]}%
+
`; + } + } + }; + + // Gender + this.chartGender = { + chart : { + animations: { + speed : 400, + animateGradually: { + enabled: false + } + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'donut', + sparkline : { + enabled: true + } + }, + colors : ['#319795', '#4FD1C5'], + labels : this.data.gender.labels, + plotOptions: { + pie: { + customScale : 0.9, + expandOnClick: false, + donut : { + size: '70%' + } + } + }, + series : this.data.gender.series, + states : { + hover : { + filter: { + type: 'none' + } + }, + active: { + filter: { + type: 'none' + } + } + }, + tooltip : { + enabled : true, + fillSeriesColor: false, + theme : 'dark', + custom : ({ + seriesIndex, + w + }) => { + return `
+
+
${w.config.labels[seriesIndex]}:
+
${w.config.series[seriesIndex]}%
+
`; + } + } + }; + + // Age + this.chartAge = { + chart : { + animations: { + speed : 400, + animateGradually: { + enabled: false + } + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'donut', + sparkline : { + enabled: true + } + }, + colors : ['#DD6B20', '#F6AD55'], + labels : this.data.age.labels, + plotOptions: { + pie: { + customScale : 0.9, + expandOnClick: false, + donut : { + size: '70%' + } + } + }, + series : this.data.age.series, + states : { + hover : { + filter: { + type: 'none' + } + }, + active: { + filter: { + type: 'none' + } + } + }, + tooltip : { + enabled : true, + fillSeriesColor: false, + theme : 'dark', + custom : ({ + seriesIndex, + w + }) => { + return `
+
+
${w.config.labels[seriesIndex]}:
+
${w.config.series[seriesIndex]}%
+
`; + } + } + }; + + // Language + this.chartLanguage = { + chart : { + animations: { + speed : 400, + animateGradually: { + enabled: false + } + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'donut', + sparkline : { + enabled: true + } + }, + colors : ['#805AD5', '#B794F4'], + labels : this.data.language.labels, + plotOptions: { + pie: { + customScale : 0.9, + expandOnClick: false, + donut : { + size: '70%' + } + } + }, + series : this.data.language.series, + states : { + hover : { + filter: { + type: 'none' + } + }, + active: { + filter: { + type: 'none' + } + } + }, + tooltip : { + enabled : true, + fillSeriesColor: false, + theme : 'dark', + custom : ({ + seriesIndex, + w + }) => { + return `
+
+
${w.config.labels[seriesIndex]}:
+
${w.config.series[seriesIndex]}%
+
`; + } + } + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/dashboards/analytics/analytics.module.ts b/src/app/modules/admin/dashboards/analytics/analytics.module.ts new file mode 100644 index 00000000..eceae951 --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { NgApexchartsModule } from 'ng-apexcharts'; +import { SharedModule } from 'app/shared/shared.module'; +import { AnalyticsComponent } from 'app/modules/admin/dashboards/analytics/analytics.component'; +import { analyticsRoutes } from 'app/modules/admin/dashboards/analytics/analytics.routing'; + +@NgModule({ + declarations: [ + AnalyticsComponent + ], + imports : [ + RouterModule.forChild(analyticsRoutes), + MatButtonModule, + MatButtonToggleModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + MatProgressBarModule, + MatSortModule, + MatTableModule, + MatTooltipModule, + NgApexchartsModule, + SharedModule + ] +}) +export class AnalyticsModule +{ +} diff --git a/src/app/modules/admin/dashboards/analytics/analytics.resolvers.ts b/src/app/modules/admin/dashboards/analytics/analytics.resolvers.ts new file mode 100644 index 00000000..46b9a613 --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.resolvers.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { AnalyticsService } from 'app/modules/admin/dashboards/analytics/analytics.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AnalyticsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _analyticsService: AnalyticsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._analyticsService.getData(); + } +} diff --git a/src/app/modules/admin/dashboards/analytics/analytics.routing.ts b/src/app/modules/admin/dashboards/analytics/analytics.routing.ts new file mode 100644 index 00000000..a912b8f2 --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.routing.ts @@ -0,0 +1,13 @@ +import { Route } from '@angular/router'; +import { AnalyticsComponent } from 'app/modules/admin/dashboards/analytics/analytics.component'; +import { AnalyticsResolver } from 'app/modules/admin/dashboards/analytics/analytics.resolvers'; + +export const analyticsRoutes: Route[] = [ + { + path : '', + component: AnalyticsComponent, + resolve : { + data: AnalyticsResolver + } + } +]; diff --git a/src/app/modules/admin/dashboards/analytics/analytics.service.ts b/src/app/modules/admin/dashboards/analytics/analytics.service.ts new file mode 100644 index 00000000..17d8b1d6 --- /dev/null +++ b/src/app/modules/admin/dashboards/analytics/analytics.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class AnalyticsService +{ + private _data: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for data + */ + get data$(): Observable + { + return this._data.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get data + */ + getData(): Observable + { + return this._httpClient.get('api/dashboards/analytics').pipe( + tap((response: any) => { + this._data.next(response); + }) + ); + } +} diff --git a/src/app/modules/admin/dashboards/project/project.component.html b/src/app/modules/admin/dashboards/project/project.component.html new file mode 100644 index 00000000..e60d866a --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.component.html @@ -0,0 +1,734 @@ +
+ + +
+
+
+ +
+
+ +
+
+
Welcome back, Brian!
+
+ +
You have 2 new messages and 15 new tasks
+
+
+
+ +
+ + +
+
+ +
+
+
{{selectedProject}}
+
+
+ + + + + + + +
+
+
+
+ + +
+
+ + + + + + + +
+ +
+
+
Summary
+
+ + + + + + +
+
+
+
21
+
Due Tasks
+
+
Completed:
+
13
+
+
+
+ +
+
+
Overdue
+
+ + + + + + +
+
+
+
17
+
Tasks
+
+
From yesterday:
+
9
+
+
+
+ +
+
+
Issues
+
+ + + + + + +
+
+
+
24
+
Open
+
+
Closed today:
+
19
+
+
+
+ +
+
+
Features
+
+ + + + + + +
+
+
+
38
+
Proposals
+
+
Implemented:
+
16
+
+
+
+ +
+
+
Github Issues Summary
+
+ + Last Week + This Week + +
+
+
+ +
+
New vs. Closed
+
+ +
+
+ +
+
Overview
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['new-issues']}} +
+
New Issues
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['closed-issues']}} +
+
Closed
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['fixed']}} +
+
Fixed
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['wont-fix']}} +
+
Won't Fix
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['re-opened']}} +
+
Re-opened
+
+ +
+
+ {{data.githubIssues.overview[githubIssuesWeekSelector.value]['needs-triage']}} +
+
Needs Triage
+
+
+
+
+
+ +
+
+
Task Distribution
+
+ + Last Week + This Week + +
+
+
+ +
+
+
+
+ {{data.taskDistribution.overview[taskDistributionWeekSelector.value]['new']}} +
+
New tasks
+
+
+
+ {{data.taskDistribution.overview[taskDistributionWeekSelector.value]['completed']}} +
+
Completed tasks
+
+
+
+ +
+
+
Schedule
+
+ + Today + Tomorrow + +
+
+
+ +
+
+
{{scheduleItem.title}}
+
+ +
+ +
{{scheduleItem.time}}
+
+
+ +
+ +
{{scheduleItem.location}}
+
+
+
+
+ +
+
+
+
+
+
+
+ + + + +
+ +
+
Budget Distribution
+
+ +
+
+ +
+ +
+
+
Weekly Expenses
+
+ + + + + + +
+
+
+
+
+ {{data.weeklyExpenses.amount | currency:'USD'}} +
+
+ +
+ 2% + below projected +
+
+
+
+ +
+
+
+ +
+
+
Monthly Expenses
+
+ + + + + + +
+
+
+
+
+ {{data.monthlyExpenses.amount | currency:'USD'}} +
+
+ +
+ 4% + above projected +
+
+
+
+ +
+
+
+ +
+
+
Yearly Expenses
+
+ + + + + + +
+
+
+
+
+ {{data.yearlyExpenses.amount | currency:'USD'}} +
+
+ +
+ 3% + above projected +
+
+
+
+ +
+
+
+
+ +
+
Budget Details
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Type + + + + {{budget.type}} + + + Total Budget + + + {{budget.total | currency:'USD'}} + + + Expenses (USD) + + {{budget.expensesAmount | currency:'USD'}} + + Expenses (%) + + {{budget.expensesPercentage}}% + + Remaining (USD) + + {{budget.remainingAmount | currency:'USD'}} + + Remaining (%) + + + + + + + + + + + + + + + + + {{budget.remainingPercentage}}% + +
+ +
+
+
+
+
+ + + + +
+ +
+ +
+
+ +
+
{{member.name}}
+
{{member.title}}
+
+ + +
+
+
+
+
+ +
+ +
+
+ +
diff --git a/src/app/modules/admin/dashboards/project/project.component.ts b/src/app/modules/admin/dashboards/project/project.component.ts new file mode 100644 index 00000000..79c5b3cb --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.component.ts @@ -0,0 +1,448 @@ +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { ApexOptions } from 'ng-apexcharts'; +import { ProjectService } from 'app/modules/admin/dashboards/project/project.service'; + +@Component({ + selector : 'project', + templateUrl : './project.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProjectComponent implements OnInit, OnDestroy +{ + chartGithubIssues: ApexOptions = {}; + chartTaskDistribution: ApexOptions = {}; + chartBudgetDistribution: ApexOptions = {}; + chartWeeklyExpenses: ApexOptions = {}; + chartMonthlyExpenses: ApexOptions = {}; + chartYearlyExpenses: ApexOptions = {}; + data: any; + selectedProject: string = 'ACME Corp. Backend App'; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _projectService: ProjectService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the data + this._projectService.data$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((data) => { + + // Store the data + this.data = data; + + // Prepare the chart data + this._prepareChartData(); + }); + + // Attach SVG fill fixer to all ApexCharts + window['Apex'] = { + chart: { + events: { + mounted: (chart: any, options?: any) => { + this._fixSvgFill(chart.el); + }, + updated: (chart: any, options?: any) => { + this._fixSvgFill(chart.el); + } + } + } + }; + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Fix the SVG fill references. This fix must be applied to all ApexCharts + * charts in order to fix 'black color on gradient fills on certain browsers' + * issue caused by the '' tag. + * + * Fix based on https://gist.github.com/Kamshak/c84cdc175209d1a30f711abd6a81d472 + * + * @param element + * @private + */ + private _fixSvgFill(element: Element): void + { + // Current URL + const currentURL = this._router.url; + + // 1. Find all elements with 'fill' attribute within the element + // 2. Filter out the ones that doesn't have cross reference so we only left with the ones that use the 'url(#id)' syntax + // 3. Insert the 'currentURL' at the front of the 'fill' attribute value + Array.from(element.querySelectorAll('*[fill]')) + .filter((el) => el.getAttribute('fill').indexOf('url(') !== -1) + .forEach((el) => { + const attrVal = el.getAttribute('fill'); + el.setAttribute('fill', `url(${currentURL}${attrVal.slice(attrVal.indexOf('#'))}`); + }); + } + + /** + * Prepare the chart data from the data + * + * @private + */ + private _prepareChartData(): void + { + // Github issues + this.chartGithubIssues = { + chart : { + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'line', + toolbar : { + show: false + }, + zoom : { + enabled: false + } + }, + colors : ['#64748B', '#94A3B8'], + dataLabels : { + enabled : true, + enabledOnSeries: [0], + background : { + borderWidth: 0 + } + }, + grid : { + borderColor: 'var(--fuse-border)' + }, + labels : this.data.githubIssues.labels, + legend : { + show: false + }, + plotOptions: { + bar: { + columnWidth: '50%' + } + }, + series : this.data.githubIssues.series, + states : { + hover: { + filter: { + type : 'darken', + value: 0.75 + } + } + }, + stroke : { + width: [3, 0] + }, + tooltip : { + followCursor: true, + theme : 'dark' + }, + xaxis : { + axisBorder: { + show: false + }, + axisTicks : { + color: 'var(--fuse-border)' + }, + labels : { + style: { + colors: 'var(--fuse-text-secondary)' + } + }, + tooltip : { + enabled: false + } + }, + yaxis : { + labels: { + offsetX: -16, + style : { + colors: 'var(--fuse-text-secondary)' + } + } + } + }; + + // Task distribution + this.chartTaskDistribution = { + chart : { + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'polarArea', + toolbar : { + show: false + }, + zoom : { + enabled: false + } + }, + labels : this.data.taskDistribution.labels, + legend : { + position: 'bottom' + }, + plotOptions: { + polarArea: { + spokes: { + connectorColors: 'var(--fuse-border)' + }, + rings : { + strokeColor: 'var(--fuse-border)' + } + } + }, + series : this.data.taskDistribution.series, + states : { + hover: { + filter: { + type : 'darken', + value: 0.75 + } + } + }, + stroke : { + width: 2 + }, + theme : { + monochrome: { + enabled : true, + color : '#93C5FD', + shadeIntensity: 0.75, + shadeTo : 'dark' + } + }, + tooltip : { + followCursor: true, + theme : 'dark' + }, + yaxis : { + labels: { + style: { + colors: 'var(--fuse-text-secondary)' + } + } + } + }; + + // Budget distribution + this.chartBudgetDistribution = { + chart : { + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'radar', + sparkline : { + enabled: true + } + }, + colors : ['#818CF8'], + dataLabels : { + enabled: true, + formatter(val: number): string | number + { + return `${val}%`; + }, + textAnchor: 'start', + style : { + fontSize : '13px', + fontWeight: 500 + }, + background: { + borderWidth: 0, + padding : 4 + }, + offsetY : -15 + }, + markers : { + strokeColors: '#818CF8', + strokeWidth : 4 + }, + plotOptions: { + radar: { + polygons: { + strokeColors : 'var(--fuse-border)', + connectorColors: 'var(--fuse-border)' + } + } + }, + series : this.data.budgetDistribution.series, + stroke : { + width: 2 + }, + tooltip : { + theme: 'dark', + y : { + formatter(val: number): string + { + return `${val}%`; + } + } + }, + xaxis : { + labels : { + show : true, + style: { + fontSize : '12px', + fontWeight: '500' + } + }, + categories: this.data.budgetDistribution.categories + }, + yaxis : { + max : (max: number) => { + return parseInt((max + 10).toFixed(0), 10); + }, + tickAmount: 7 + } + }; + + // Weekly expenses + this.chartWeeklyExpenses = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'line', + sparkline : { + enabled: true + } + }, + colors : ['#22D3EE'], + series : this.data.weeklyExpenses.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + theme: 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.weeklyExpenses.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return `$${val}`; + } + } + } + }; + + // Monthly expenses + this.chartMonthlyExpenses = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'line', + sparkline : { + enabled: true + } + }, + colors : ['#4ADE80'], + series : this.data.monthlyExpenses.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + theme: 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.monthlyExpenses.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return `$${val}`; + } + } + } + }; + + // Yearly expenses + this.chartYearlyExpenses = { + chart : { + animations: { + enabled: false + }, + fontFamily: 'inherit', + foreColor : 'inherit', + height : '100%', + type : 'line', + sparkline : { + enabled: true + } + }, + colors : ['#FB7185'], + series : this.data.yearlyExpenses.series, + stroke : { + curve: 'smooth' + }, + tooltip: { + theme: 'dark' + }, + xaxis : { + type : 'category', + categories: this.data.yearlyExpenses.labels + }, + yaxis : { + labels: { + formatter: (val) => { + return `$${val}`; + } + } + } + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Track by function for ngFor loops + * + * @param index + * @param item + */ + trackByFn(index: number, item: any): any + { + return item.id || index; + } +} diff --git a/src/app/modules/admin/dashboards/project/project.module.ts b/src/app/modules/admin/dashboards/project/project.module.ts new file mode 100644 index 00000000..156bfd93 --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTabsModule } from '@angular/material/tabs'; +import { NgApexchartsModule } from 'ng-apexcharts'; +import { SharedModule } from 'app/shared/shared.module'; +import { ProjectComponent } from 'app/modules/admin/dashboards/project/project.component'; +import { projectRoutes } from 'app/modules/admin/dashboards/project/project.routing'; + +@NgModule({ + declarations: [ + ProjectComponent + ], + imports : [ + RouterModule.forChild(projectRoutes), + MatButtonModule, + MatButtonToggleModule, + MatDividerModule, + MatIconModule, + MatMenuModule, + MatProgressBarModule, + MatSidenavModule, + MatSortModule, + MatTableModule, + MatTabsModule, + NgApexchartsModule, + SharedModule + ] +}) +export class ProjectModule +{ +} diff --git a/src/app/modules/admin/dashboards/project/project.resolvers.ts b/src/app/modules/admin/dashboards/project/project.resolvers.ts new file mode 100644 index 00000000..e9203673 --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.resolvers.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ProjectService } from 'app/modules/admin/dashboards/project/project.service'; + +@Injectable({ + providedIn: 'root' +}) +export class ProjectResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _projectService: ProjectService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolver + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._projectService.getData(); + } +} diff --git a/src/app/modules/admin/dashboards/project/project.routing.ts b/src/app/modules/admin/dashboards/project/project.routing.ts new file mode 100644 index 00000000..21bfd12b --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.routing.ts @@ -0,0 +1,13 @@ +import { Route } from '@angular/router'; +import { ProjectComponent } from 'app/modules/admin/dashboards/project/project.component'; +import { ProjectResolver } from 'app/modules/admin/dashboards/project/project.resolvers'; + +export const projectRoutes: Route[] = [ + { + path : '', + component: ProjectComponent, + resolve : { + data: ProjectResolver + } + } +]; diff --git a/src/app/modules/admin/dashboards/project/project.service.ts b/src/app/modules/admin/dashboards/project/project.service.ts new file mode 100644 index 00000000..3cec81cc --- /dev/null +++ b/src/app/modules/admin/dashboards/project/project.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class ProjectService +{ + private _data: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for data + */ + get data$(): Observable + { + return this._data.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get data + */ + getData(): Observable + { + return this._httpClient.get('api/dashboards/project').pipe( + tap((response: any) => { + this._data.next(response); + }) + ); + } +} diff --git a/src/app/modules/admin/docs/changelog/changelog.html b/src/app/modules/admin/docs/changelog/changelog.html new file mode 100644 index 00000000..7eaee555 --- /dev/null +++ b/src/app/modules/admin/docs/changelog/changelog.html @@ -0,0 +1,41 @@ +
+ + +
+
+ + + +
+

+ Changelog +

+
+
+
+ +
+
+ +
+
+

{{item.version}}

+
{{item.releaseDate}}
+
+
+
+ {{change.type}} +
    +
  • {{listItem}}
  • +
+
+
+
+
+
+ +
diff --git a/src/app/modules/admin/docs/changelog/changelog.module.ts b/src/app/modules/admin/docs/changelog/changelog.module.ts new file mode 100644 index 00000000..eea49c4a --- /dev/null +++ b/src/app/modules/admin/docs/changelog/changelog.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; +import { ChangelogComponent } from 'app/modules/admin/docs/changelog/changelog'; +import { changelogRoutes } from 'app/modules/admin/docs/changelog/changelog.routing'; + +@NgModule({ + declarations: [ + ChangelogComponent + ], + imports : [ + RouterModule.forChild(changelogRoutes), + SharedModule + ] +}) +export class ChangelogModule +{ +} diff --git a/src/app/modules/admin/docs/changelog/changelog.routing.ts b/src/app/modules/admin/docs/changelog/changelog.routing.ts new file mode 100644 index 00000000..9f35d8c5 --- /dev/null +++ b/src/app/modules/admin/docs/changelog/changelog.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { ChangelogComponent } from 'app/modules/admin/docs/changelog/changelog'; + +export const changelogRoutes: Route[] = [ + { + path : '', + component: ChangelogComponent + } +]; diff --git a/src/app/modules/admin/docs/changelog/changelog.ts b/src/app/modules/admin/docs/changelog/changelog.ts new file mode 100644 index 00000000..35b6613f --- /dev/null +++ b/src/app/modules/admin/docs/changelog/changelog.ts @@ -0,0 +1,44 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector : 'changelog', + templateUrl : './changelog.html', + styles : [''], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ChangelogComponent +{ + changelog: any[] = [ + + // v12.0.0 + { + version : 'v12.0.0', + releaseDate: 'April 16, 2021', + changes : [ + { + type: 'Breaking Changes', + list: [ + 'This is the new major version of the Fuse and it\'s completely different from previous versions with no upgrade path', + 'This version requires a clean installation' + ] + }, + { + type: 'Features', + list: [ + 'Improved the look and feel', + 'Re-wrote the entire template from scratch using Tailwind', + 'Removed 99% of the SCSS styles in favor of Tailwind', + 'Integrated Angular Material theming with Tailwind' + ] + } + ] + } + ]; + + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/docs/core-features/components/alert/alert.component.html b/src/app/modules/admin/docs/core-features/components/alert/alert.component.html new file mode 100644 index 00000000..472e8574 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/alert/alert.component.html @@ -0,0 +1,1207 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Alert +

+
+
+ +
+ +
+ +

+ fuse-alert is a customizable component for displaying all kinds of alerts across your app. They can be controlled from your components as well + as from the FuseAlertService. +

+

+ Exported as: fuseAlert +

+ +

Module

+ + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
name: string
+
+ A unique name for the alert box to access it from FuseAlertService. + + Auto generated +
+
@Input()
+
appearance: FuseAlertAppearance
+
+ Appearance of the alert box. + + soft +
+
@Input()
+
dismissed: boolean
+
+ Whether the alert box is dismissed. + + false +
+
@Input()
+
dismissible: boolean
+
+ Whether the alert box is dismissible. This must be true for dismissed to work. + + false +
+
@Input()
+
showIcon: boolean
+
+ Whether the icon is shown. + + true +
+
@Input()
+
type: FuseAlertType
+
+ The type of the alert box. + + primary +
+
@Output()
+
afterDismissed: true
+
+ An event emitted after the alert box dismissed. + + - +
+
@Output()
+
afterShown: true
+
+ An event emitted after the alert box shown. + + - +
+
+ +

Type aliases

+ + + + + +

Appearance

+

+ Alert component comes with 3 different built-in appearances to choose from: +

+ +
+ + +
+
Soft (default)
+
+ + + + + + + + + + Primary alert + Thank you for joining our newsletter + + + + + Accent alert + Your changes has been saved + + + + + Warn alert + Fill all required fields to proceed next step + + + + + Basic alert + You have 3 new notifications + + + + + Info alert + This is a alert with an 'info' level severity + + + + + Success alert + This is a alert with a 'success' level severity + + + + + Warning alert + This is a alert with a 'warning' level severity + + + + + Error alert + This is a alert with an 'error' level severity + + + + + + + + + + + + + + + + +
+ +
+ + +
+
Outline
+
+ + + + + + + + + + Primary alert + Thank you for joining our newsletter + + + + + Accent alert + Your changes has been saved + + + + + Warn alert + Fill all required fields to proceed next step + + + + + Basic alert + You have 3 new notifications + + + + + Info alert + This is a alert with an 'info' level severity + + + + + Success alert + This is a alert with a 'success' level severity + + + + + Warning alert + This is a alert with a 'warning' level severity + + + + + Error alert + This is a alert with an 'error' level severity + + + + + + + + + + + + + + + + +
+ +
+ + +
+
Fill
+
+ + + + + + + + + + Primary alert + Thank you for joining our newsletter + + + + + Accent alert + Your changes has been saved + + + + + Warn alert + Fill all required fields to proceed next step + + + + + Basic alert + You have 3 new notifications + + + + + Info alert + This is a alert with an 'info' level severity + + + + + Success alert + This is a alert with a 'success' level severity + + + + + Warning alert + This is a alert with a 'warning' level severity + + + + + Error alert + This is a alert with an 'error' level severity + + + + + + + + + + + + + + + + +
+ +
+ + +
+
Border
+
+ + + + + + + + + + Primary alert + Thank you for joining our newsletter + + + + + Accent alert + Your changes has been saved + + + + + Warn alert + Fill all required fields to proceed next step + + + + + Basic alert + You have 3 new notifications + + + + + Info alert + This is a alert with an 'info' level severity + + + + + Success alert + This is a alert with a 'success' level severity + + + + + Warning alert + This is a alert with a 'warning' level severity + + + + + Error alert + This is a alert with an 'error' level severity + + + + + + + + + + + + + + + + +
+ +

Title and alert

+

+ All alert boxes have title and alert content that can be customized. +

+ +
+ +
+
Example
+
+ + + + + + + + + Alert title + This is the alert content + + + + Alert title without any content + + + + Simple alert without a title + + + + + + + + + + + + + + + + +
+ +

Icons

+

+ The info, success, warning and error type alert boxes have default icons and they are visible + by default. If you wish to hide those icons, use the [showIcon]="false" input. +

+ +
+ +
+
Example
+
+ + + + + + + + + Success alert with no icon + + + + + + + + + + + + + + + + +
+ +

Custom icons

+

+ All alert boxes come with custom icon support. To use a custom icon, simply use fuseAlertIcon attribute on an element you wish to use as the icon. + If there is a default icon for the alert box, custom icon will override it. +

+ +
+ +
+
Example
+
+ + + + + + + + + + Info alert with a custom icon + + + + + + + + + + + + + + + + +
+ +

Dismissible alerts

+

+ Dismissible alerts can be removed from the view by clicking their dismiss (x) button. In order to get the dismiss button visible, the + [dismissed] input must be explicitly set either to true or false. Setting the [dismissed] input to + null or simply removing it from the element will remove the dismiss button. +

+ +
+ +
+
Example
+ +
+ + + + + + + + + Your subscription model is successfully upgraded to the Lifetime Pro. + + + + This one has a lot of text so you can see how the text is going to be displayed. Also this is a dismissible alert box which can be dismissed by + clicking the dismiss button. + + + + + + + + + + + + + + + + +
+ +

Dismissible alerts controlled from the service

+

+ Alerts can be shown and dismissed via FuseAlertService. +

+ +
+ +
+
Example
+
+ + + + + + + + + + + + + Your subscription model is successfully upgraded to the Lifetime Pro. + + + + This one has a lot of text so you can see how the text is going to be displayed. Also this is a dismissible alert box which can be dismissed by + clicking the close button. + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/alert/alert.component.ts b/src/app/modules/admin/docs/core-features/components/alert/alert.component.ts new file mode 100644 index 00000000..ca61ba1a --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/alert/alert.component.ts @@ -0,0 +1,62 @@ +import { Component } from '@angular/core'; +import { FuseAlertService } from '@fuse/components/alert'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'alert', + templateUrl: './alert.component.html', + styles : [ + ` + fuse-alert { + margin: 16px 0; + } + ` + ] +}) +export class AlertComponent +{ + /** + * Constructor + */ + constructor( + private _fuseAlertService: FuseAlertService, + private _coreFeaturesComponent: CoreFeaturesComponent + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Dismiss the alert via the service + * + * @param name + */ + dismiss(name: string): void + { + // Dismiss + this._fuseAlertService.dismiss(name); + } + + /** + * Show the alert via the service + * + * @param name + */ + show(name: string): void + { + // Show + this._fuseAlertService.show(name); + } + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/components/card/card.component.html b/src/app/modules/admin/docs/core-features/components/card/card.component.html new file mode 100644 index 00000000..c6ec3ab3 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/card/card.component.html @@ -0,0 +1,413 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Card +

+
+
+ +
+ +
+ +

+ fuse-card is a basic card component to show any kind of information or content with features like flipping and expanding. +

+

+ Exported as: fuseCard +

+ +

Module

+ + +

Properties

+
+ + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
flippable: boolean
+
+ Whether the card is flippable. + + false +
+
+ +

Methods

+
+
+ expand(): void +
+
+ Expands the expansion of the card. +
+
+
+
+ collapse(): void +
+
+ Collapses the expansion of the card. +
+
+
+
+ toggleExpanded(): void +
+
+ Toggles the expanded status of the expansion. +
+
+
+
+ flip(): void +
+
+ Flip the card. +
+
+ +

Usage

+

+ Just wrap the content or the information with fuse-card to show them within the card. fuse-card doesn't apply any kind of style to its + content to make customization simpler: +

+ +
+ +
+
Example
+
+ + + + + + + +
+
+ + This content is in the card and it doesn't have any style applied to it! + +
+
+ +
+ +
+ + + + + + + + + +
+ +
+ +

Expandable

+

+ Expandable fuse-card holds an extra content or information hidden in its expandable area which can be toggled by accessing the component itself + via a template reference: +

+ +
+ +
+
Example
+
+ + + + + + + +
+
+ + +
Title of the card
+
+ A paragraph, an image, a form or simply anything can go here to create the content of the card. +
+
+ +
+ + + +
+ This is the expansion and holds an extra information! +
+
+
+ +
+
+ +
+ +
+ + + + + + + + + +
+ +
+ +

Flippable

+

+ Flippable card holds content or information on both sides and can be flipped by accessing the component itself via a template reference. The only limitation with + this type of cards is that the back of the card will share the same height as the front of the card. If the back side has more content, + scrollbar will appear. +

+ +
+ +
+
Example
+
+ + + + + + + +
+
+ + + + +
+
Title of the card
+
+ A paragraph, an image, a form or simply anything can go here to create the content of the card. +
+
+ +
+
+
+ + + +
+
+ +
+

+ This is the back of the card and holds an extra information! +

+

+ Also, the back side of the card holds more information than the front of the card which causes scrollbars to + appear. +

+
+
+
+ +
+
+ +
+ +
+ + + + + + + + + +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/card/card.component.ts b/src/app/modules/admin/docs/core-features/components/card/card.component.ts new file mode 100644 index 00000000..710b0b84 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/card/card.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'card', + templateUrl: './card.component.html', + styles : [''] +}) +export class CardComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.html b/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.html new file mode 100644 index 00000000..a4c4fbc7 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.html @@ -0,0 +1,171 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Date Range +

+
+
+ +
+ +
+ +

+ fuse-date-range is a date-time range selector component. It can be programmed to provide date or date-time ranges. It has full + ngModel and reactive form support and built to works with moment.js. +

+

+ Exported as: fuseDateRange +

+ +

Module

+ + + + +

Usage

+

+ Here's the basic usage of the fuse-date-range: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
dateFormat: string
+
+ Moment.js date format string to format output date. + + DD/MM/YYYY +
+
@Input()
+
timeFormat: string
+
+ 12 for 12-hour, 24 for 24-hour format. + + 12 +
+
@Input()
+
timeRange: boolean
+
+ Whether to enable time range. + + true +
+
@Input()
+
range: any
+
+ Date range input {{'{'}} start: string, end: string {{'}'}}. If you are using ngModel or Reactive + forms, you shouldn't use this input! + + true +
+
+ +

Range

+

+ The input of the range must be in the following format. The start and end date strings must be moment compatible strings as they + will be immediately parsed with MomentJS. + +

+ + + +

+ The outputted range object will be in the following format. The date and time fields will be formatted based on the + dateFormat and timeFormat inputs. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.ts b/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.ts new file mode 100644 index 00000000..c867db66 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/date-range/date-range.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'date-range', + templateUrl: './date-range.component.html', + styles : [''] +}) +export class DateRangeComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.html b/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.html new file mode 100644 index 00000000..79033040 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.html @@ -0,0 +1,358 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Drawer +

+
+
+ +
+ +
+ +

+ fuse-drawer is a simple drawer component that can be programmed in various ways. The main difference between Angular Material's + mat-drawer component is that the fuse-drawer can be placed anywhere on the DOM and it doesn't have to wrap the content like + mat-drawer. +

+ + Since fuse-drawer works with absolute positioning by default, the parent of the drawer must have + position: relative and overflow-x: hidden properties otherwise the drawer won't be able to work correctly. + +

+ Exported as: fuseDrawer +

+ +

Module

+ + +

Usage

+

+ Here's the basic usage of the fuse-drawer: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
fixed: boolean
+
+ Whether the position of the drawer is fixed or absolute. + + false +
+
@Input()
+
mode: FuseDrawerMode
+
+ over mode can be used to place the drawer on top of the content and side mode can be used to push the content and + place the drawer next to it. + + side +
+
REQUIRED
+
@Input()
+
name: string
+
+ Unique name of the drawer. Required for drawer to work correctly. + + - +
+
@Input()
+
opened: boolean
+
+ Whether the drawer is opened. Only works with over mode. + + false +
+
@Input()
+
position: FuseDrawerPosition
+
+ Position of the drawer. + + left +
+
@Input()
+
transparentOverlay: boolean
+
+ Whether the overlay of the drawer is transparent. Only works with over mode. + + false +
+
@Output()
+
modeChanged: FuseNavigationMode
+
+ An event emitted after the mode of the navigation changed. + + - +
+
@Output()
+
openedChanged: boolean
+
+ An event emitted after the opened status of the drawer changed. + + - +
+
@Output()
+
positionChanged: FuseNavigationPosition
+
+ An event emitted after the position of the drawer changed. + + - +
+
+ +

Type aliases

+ + + + + +

Service

+

+ The FuseDrawerService can be used to remotely accessing to drawers using their name properties to control them: +

+
+ +
+
Example
+
+ + + + + + + + + + + +
+ + +
+ Left drawer +
Current mode: {{drawer.mode}}
+
+
+ +
+ Some content +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.ts b/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.ts new file mode 100644 index 00000000..c9797d52 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/drawer/drawer.component.ts @@ -0,0 +1,68 @@ +import { Component } from '@angular/core'; +import { FuseDrawerMode, FuseDrawerService } from '@fuse/components/drawer'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'drawer', + templateUrl: './drawer.component.html', + styles : [''] +}) +export class DrawerComponent +{ + drawerMode: FuseDrawerMode; + + /** + * Constructor + */ + constructor( + private _fuseDrawerService: FuseDrawerService, + private _coreFeaturesComponent: CoreFeaturesComponent + ) + { + // Set the defaults + this.drawerMode = 'side'; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer mode + * + * @param name + */ + toggleDrawerMode(name: string): void + { + const drawer = this._fuseDrawerService.getComponent(name); + + if ( drawer ) + { + drawer.mode = drawer.mode === 'side' ? 'over' : 'side'; + } + } + + /** + * Toggle the drawer open + * + * @param name + */ + toggleDrawerOpen(name: string): void + { + const drawer = this._fuseDrawerService.getComponent(name); + + if ( drawer ) + { + drawer.toggle(); + } + } + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.html b/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.html new file mode 100644 index 00000000..957a7bb9 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.html @@ -0,0 +1,144 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Highlight +

+
+
+ +
+ +
+ +

+ fuse-highlight is a syntax highlighter component to display syntax highlighted codes within the content. Internally, it uses highlight.js. +

+

+ Exported as: fuseHighlight +

+ +

Module

+ + +

Usage

+

+ Here's the basic usage of the fuse-highlight: +

+ + + +

+ fuse-highlight doesn't have its own selector and cannot be used like any other components. It must be used with a <textarea>. +

+

+ The main reason of this is that the Angular parses the templates before binding and running components. Because of this mechanic, anything you place into templates + will be taken as a literal content and parsed by Angular. Only the contents of a <textarea> can be preserved as is. +

+ +

Properties

+
+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
code: string
+
+ Piece of code to highlight. If code input is not provided, the actual content of the textarea will be used. + + - +
+
@Input()
+
lang: string
+
+ Which language to highlight the code. See: + https://highlightjs.org/usage/ + + for full list of supported languages. + + - +
+
+ +

Service

+

+ The FuseHighlightService can also be used to format and highlight code: +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.ts b/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.ts new file mode 100644 index 00000000..990baa47 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/highlight/highlight.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'highlight', + templateUrl: './highlight.component.html', + styles : [''] +}) +export class HighlightComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.html b/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.html new file mode 100644 index 00000000..23abf861 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.html @@ -0,0 +1,1022 @@ +
+ + +
+
+ +
+ + +
+ + Components +
+
+ +
+

+ Navigation +

+
+
+ +
+ +
+ +

+ fuse-navigation is a set of components for creating navigations from data. It has two different variations; fuse-vertical-navigation + for creating vertical and fuse-horizontal-navigation for creating horizontal navigations. +

+

+ The vertical navigation comes with built-in drawer that can be programmed in various ways to show the navigation in different styles and to control the + mobile behavior. +

+

+ fuse-navigation also provides a service which can be used to store navigation data as well as accessing navigation items with their ids from the + navigation data. It's a utility service, you don't have to use it to make fuse-navigation work. +

+

+ Exported as: fuseVerticalNavigation and fuseHorizontalNavigation +

+ + + fuse-navigation designed to work with data and it must be supplied in certain format. If you want to create a navigation from an HTML structure, + this component is not for you. + + +

Module

+ + + + +

Navigation item

+

+ This is the type alias for the Navigation item. It's used to create the navigation and both vertical and horizontal variations use the + same item type: +

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+
id
+
+ Unique id of the navigation item. It's important to supply navigation items with ids if you want to access and modify them after generating the + navigation. +
+
title
+
+ Title of the navigation item. +
+
subtitle
+
+ Subtitle of the navigation item. +
+
type
+
+ Type of the navigation item. +
+
hidden
+
+ A function that returns a boolean. It gets one parameter which is the navigation item. Returning true from the function will hide the + item and false will show it. +
+
active
+
+ Whether to force the navigation item to be active. +
+
disabled
+
+ Whether the navigation item is disabled. +
+
link
+
+ String representation of the item link. It can be either a router link or a normal, outgoing link. +
+
externalLink
+
+ Whether the supplied link should be parsed as an external link. It must be true if you supply a normal, outgoing link in the + link property. +
+
exactMatch
+
+ Sets the exactMatch parameter on the router link active options. +
+
function
+
+ A function to run on navigation item click. It gets one parameter which is the navigation item. Supplying function will NOT + override the link functionality of the navigation item, they will run in parallel. +
+
classes
+
+ Custom class names for the navigation item's specific parts. Multiple class names can be added by separating them with whitespace: + 'class1 class2 class3' +
+
icon
+
+ Icon name for the navigation item. +
+
badge.title
+
+ Title of the badge. +
+
badge.classes
+
+ Classes to add to the badge. This can be used to customize the look of the badge. +
+
children
+
+ Array of navigation items to create child items. +
+
meta
+
+ An object to hold custom data for the navigation item. It can be used for anything such as storing the access role and authorization of the + navigation item. +
+
+ +

Vertical navigation

+

Usage

+

+ Here's the basic usage of the fuse-vertical-navigation: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
appearance: FuseVerticalNavigationAppearance
+
+ Appearance of the navigation and its drawer. This is a string type and can be used to override the style of the navigation. + + classic +
+
@Input()
+
autoCollapse: boolean
+
+ Whether expanding an expandable navigation item should close other expanded items excluding the active menu item's parent. + + true +
+
@Input()
+
inner: boolean
+
+ Whether the inner mode is active. This mode allows using navigation without its drawer. Suitable for using it inside mat-sidenav + or mat-drawer. + + false +
+
@Input()
+
mode: FuseVerticalNavigationMode
+
+ over mode can be used to place the drawer on top of the content and side mode can be used to push the content and + place the drawer next to it. + + side +
+
REQUIRED
+
@Input()
+
name: string
+
+ Unique name of the navigation. Required for navigation and its drawer to work correctly. + + - +
+
@Input()
+
navigation: FuseNavigationItem[]
+
+ Array of navigation items to build the navigation from. + + - +
+
@Input()
+
opened: boolean
+
+ Whether the navigation drawer is opened. Only works with over mode. + + false +
+
@Input()
+
position: FuseVerticalNavigationPosition
+
+ Position of the drawer. + + left +
+
@Input()
+
transparentOverlay: boolean
+
+ Whether the overlay of the drawer is transparent. Only works with over mode. + + false +
+
@Output()
+
appearanceChanged: FuseVerticalNavigationAppearance
+
+ An event emitted after the appearance of the navigation changed. + + - +
+
@Output()
+
modeChanged: FuseVerticalNavigationMode
+
+ An event emitted after the mode of the navigation changed. + + - +
+
@Output()
+
openedChanged: boolean
+
+ An event emitted after the opened status of the navigation changed. + + - +
+
@Output()
+
positionChanged: FuseVerticalNavigationPosition
+
+ An event emitted after the position of the navigation changed. + + - +
+
+ +

Custom content hooks

+

+ Since the entire navigation will be created from the supplied navigation data, it's only possible to attach custom content inside the navigation drawer using custom + content hooks. There are four of these hooks; +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
HookDescription
+
fuseVerticalNavigationHeader
+
+ Fixed header hook. Anything put inside this hook will not scroll with drawer content. +
+
fuseVerticalNavigationContentHeader
+
+ Header hook. Anything put inside this hook will be scrolled with the drawer content. +
+
fuseVerticalNavigationFooter
+
+ Fixed footer hook. Anything put inside this hook will not scroll with drawer content. +
+
fuseVerticalNavigationContentFooter
+
+ Footer hook. Anything put inside this hook will be scrolled with the drawer content. +
+
+ + + + +

Type aliases

+ + + + + + +

Horizontal navigation

+

Usage

+

+ Here's the basic usage of the fuse-horizontal-navigation: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
REQUIRED
+
@Input()
+
name: string
+
+ Unique name of the navigation. Required for navigation and its drawer to work correctly. + + - +
+
@Input()
+
navigation: FuseNavigationItem[]
+
+ Array of navigation items to build the navigation from. + + - +
+
+ +

Accessing navigation items

+

+ The FuseNavigationService provides couple helper methods to access navigation items from the navigation data using their ids. This is especially useful + if you want to change something from any item like updating its badge title, hiding or disabling it. +

+
+ +
+
Example
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Modifying navigation items

+

+ After accessing a navigation item, you can simply modify the object and then call the refresh() method on the Navigation component to + apply the changes. +

+
+ +
+
Change badge title
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
Disable/Enable navigation item
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Swapping entire navigation

+

+ Sometimes it's best to use more than one set of data and swap between them to provide correct navigation. An example use case would be user roles. Different roles + may require access to different areas and rather than showing/hiding individual navigation items, it's best to swap the entire navigation data to show a + personalized navigation for that role. +

+
+ +
+
Swap the entire navigation data
+
+ + + + + + + + + Reload the page to load the default navigation! + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.ts b/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.ts new file mode 100644 index 00000000..e8cda489 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/components/navigation/navigation.component.ts @@ -0,0 +1,185 @@ +import { Component } from '@angular/core'; +import { FuseNavigationItem, FuseNavigationService } from '@fuse/components/navigation'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'navigation', + templateUrl: './navigation.component.html', + styles : [''] +}) +export class NavigationComponent +{ + /** + * Constructor + */ + constructor( + private _fuseNavigationService: FuseNavigationService, + private _coreFeaturesComponent: CoreFeaturesComponent + ) + { + + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get navigation item + * + * @param itemId + * @param navigationName + */ + getNavItem(itemId, navigationName): FuseNavigationItem | null + { + // Get the component -> navigation mock-api -> item + const navComponent = this._fuseNavigationService.getComponent(navigationName); + + // Return if the navigation component does not exist + if ( !navComponent ) + { + return null; + } + + // Get the navigation item + const navigation = navComponent.navigation; + const item = this._fuseNavigationService.getItem(itemId, navigation); + console.log(item); + return item; + } + + /** + * Update badge title + * + * @param itemId + * @param navigationName + * @param title + */ + updateBadgeTitle(itemId, navigationName, title): void + { + // Get the component -> navigation mock-api -> item + const navComponent = this._fuseNavigationService.getComponent(navigationName); + + // Return if the navigation component does not exist + if ( !navComponent ) + { + return null; + } + + // Get the navigation item, update the badge and refresh the component + const navigation = navComponent.navigation; + const item = this._fuseNavigationService.getItem(itemId, navigation); + item.badge.title = title; + navComponent.refresh(); + } + + /** + * Toggle disabled status + * + * @param itemId + * @param navigationName + */ + toggleDisabled(itemId, navigationName): void + { + // Get the component -> navigation mock-api -> item + const navComponent = this._fuseNavigationService.getComponent(navigationName); + + // Return if the navigation component does not exist + if ( !navComponent ) + { + return null; + } + + // Get the navigation item, update the badge and refresh the component + const navigation = navComponent.navigation; + const item = this._fuseNavigationService.getItem(itemId, navigation); + item.disabled = !item.disabled; + navComponent.refresh(); + } + + /** + * Swap navigation mock-api + * + * @param navigationName + */ + swapNavigationData(navigationName): void + { + // Get the component -> navigation mock-api -> item + const navComponent = this._fuseNavigationService.getComponent(navigationName); + + // Return if the navigation component does not exist + if ( !navComponent ) + { + return null; + } + + // A navigation mock-api to replace with + const newNavigation = [ + { + id : 'supported-components', + title : 'Supported components', + subtitle: 'Compatible third party components', + type : 'group', + icon : 'memory', + children: [ + { + id : 'supported-components.apex-charts', + title: 'ApexCharts', + type : 'basic', + icon : 'insert_chart', + link : '/supported-components/apex-charts' + }, + { + id : 'supported-components.full-calendar', + title: 'FullCalendar', + type : 'basic', + icon : 'today', + link : '/supported-components/full-calendar' + }, + { + id : 'supported-components.google-maps', + title: 'Google Maps', + type : 'basic', + icon : 'map', + link : '/supported-components/google-maps' + }, + { + id : 'supported-components.ngx-markdown', + title: 'ngx-markdown', + type : 'basic', + icon : 'text_format', + link : '/supported-components/ngx-markdown' + }, + { + id : 'supported-components.quill-editor', + title: 'Quill editor', + type : 'basic', + icon : 'font_download', + link : '/supported-components/quill-editor' + }, + { + id : 'supported-components.youtube-player', + title: 'Youtube player', + type : 'basic', + icon : 'play_circle_filled', + link : '/supported-components/youtube-player' + } + ] + } + ]; + + // Replace the navigation mock-api + navComponent.navigation = newNavigation; + navComponent.refresh(); + } + + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/core-features.component.html b/src/app/modules/admin/docs/core-features/core-features.component.html new file mode 100644 index 00000000..d0fc3ab1 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/core-features.component.html @@ -0,0 +1,36 @@ +
+ + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ + diff --git a/src/app/modules/admin/docs/core-features/core-features.component.scss b/src/app/modules/admin/docs/core-features/core-features.component.scss new file mode 100644 index 00000000..95a51f33 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/core-features.component.scss @@ -0,0 +1,9 @@ +core-features { + + fuse-vertical-navigation { + + .fuse-vertical-navigation-wrapper { + box-shadow: none !important; + } + } +} diff --git a/src/app/modules/admin/docs/core-features/core-features.component.ts b/src/app/modules/admin/docs/core-features/core-features.component.ts new file mode 100644 index 00000000..23637cec --- /dev/null +++ b/src/app/modules/admin/docs/core-features/core-features.component.ts @@ -0,0 +1,207 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FuseNavigationItem } from '@fuse/components/navigation'; +import { MatDrawer } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector : 'core-features', + templateUrl : './core-features.component.html', + styleUrls : ['./core-features.component.scss'], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CoreFeaturesComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + drawerMode: 'side' | 'over'; + drawerOpened: boolean; + menuData: FuseNavigationItem[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseMediaWatcherService: FuseMediaWatcherService + ) + { + this.menuData = [ + { + id : 'core-features.libraries', + title : 'Libraries', + type : 'group', + children: [ + { + id : 'core-features.libraries.mock-api', + title: 'MockAPI', + type : 'basic', + link : '/docs/core-features/libraries/mock-api' + } + ] + }, + { + id : 'core-features.components', + title : 'Components', + type : 'group', + children: [ + { + id : 'core-features.components.alert', + title: 'Alert', + type : 'basic', + link : '/docs/core-features/components/alert' + }, + { + id : 'core-features.components.card', + title: 'Card', + type : 'basic', + link : '/docs/core-features/components/card' + }, + { + id : 'core-features.components.date-range', + title: 'DateRange', + type : 'basic', + link : '/docs/core-features/components/date-range' + }, + { + id : 'core-features.components.drawer', + title: 'Drawer', + type : 'basic', + link : '/docs/core-features/components/drawer' + }, + { + id : 'core-features.components.highlight', + title: 'Highlight', + type : 'basic', + link : '/docs/core-features/components/highlight' + }, + { + id : 'core-features.components.navigation', + title: 'Navigation', + type : 'basic', + link : '/docs/core-features/components/navigation' + } + ] + }, + { + id : 'core-features.directives', + title : 'Directives', + type : 'group', + children: [ + { + id : 'core-features.directives.autogrow', + title: 'Autogrow', + type : 'basic', + link : '/docs/core-features/directives/autogrow' + }, + { + id : 'core-features.directives.scrollbar', + title: 'Scrollbar', + type : 'basic', + link : '/docs/core-features/directives/scrollbar' + }, + { + id : 'core-features.directives.scroll-reset', + title: 'ScrollReset', + type : 'basic', + link : '/docs/core-features/directives/scroll-reset' + } + ] + }, + { + id : 'core-features.services', + title : 'Services', + type : 'group', + children: [ + { + id : 'core-features.services.config', + title: 'Config', + type : 'basic', + link : '/docs/core-features/services/config' + }, + { + id : 'core-features.services.splash-screen', + title: 'SplashScreen', + type : 'basic', + link : '/docs/core-features/services/splash-screen' + }, + { + id : 'core-features.services.media-watcher', + title: 'MediaWatcher', + type : 'basic', + link : '/docs/core-features/services/media-watcher' + } + ] + }, + { + id : 'core-features.pipes', + title : 'Pipes', + type : 'group', + children: [ + { + id : 'core-features.pipes.find-by-key', + title: 'FindByKey', + type : 'basic', + link : '/docs/core-features/pipes/find-by-key' + } + ] + }, + { + id : 'core-features.validators', + title : 'Validators', + type : 'group', + children: [ + { + id : 'core-features.validators.must-match', + title: 'MustMatch', + type : 'basic', + link : '/docs/core-features/validators/must-match' + } + ] + } + ]; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media query change + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('md') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/docs/core-features/core-features.module.ts b/src/app/modules/admin/docs/core-features/core-features.module.ts new file mode 100644 index 00000000..07a2801d --- /dev/null +++ b/src/app/modules/admin/docs/core-features/core-features.module.ts @@ -0,0 +1,72 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatTreeModule } from '@angular/material/tree'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseDateRangeModule } from '@fuse/components/date-range'; +import { FuseDrawerModule } from '@fuse/components/drawer'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { FuseScrollResetModule } from '@fuse/directives/scroll-reset'; +import { SharedModule } from 'app/shared/shared.module'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; +import { MockApiComponent } from 'app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component'; +import { AlertComponent } from 'app/modules/admin/docs/core-features/components/alert/alert.component'; +import { CardComponent } from 'app/modules/admin/docs/core-features/components/card/card.component'; +import { DateRangeComponent } from 'app/modules/admin/docs/core-features/components/date-range/date-range.component'; +import { DrawerComponent } from 'app/modules/admin/docs/core-features/components/drawer/drawer.component'; +import { HighlightComponent } from 'app/modules/admin/docs/core-features/components/highlight/highlight.component'; +import { NavigationComponent } from 'app/modules/admin/docs/core-features/components/navigation/navigation.component'; +import { AutogrowComponent } from 'app/modules/admin/docs/core-features/directives/autogrow/autogrow.component'; +import { ScrollbarComponent } from 'app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component'; +import { ScrollResetComponent } from 'app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component'; +import { ConfigComponent } from 'app/modules/admin/docs/core-features/services/config/config.component'; +import { MediaWatcherComponent } from 'app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component'; +import { SplashScreenComponent } from 'app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component'; +import { FindByKeyComponent } from 'app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component'; +import { MustMatchComponent } from 'app/modules/admin/docs/core-features/validators/must-match/must-match.component'; +import { coreFeaturesRoutes } from 'app/modules/admin/docs/core-features/core-features.routing'; + +@NgModule({ + declarations: [ + CoreFeaturesComponent, + MockApiComponent, + AlertComponent, + CardComponent, + DateRangeComponent, + DrawerComponent, + HighlightComponent, + NavigationComponent, + AutogrowComponent, + ScrollbarComponent, + ScrollResetComponent, + ConfigComponent, + SplashScreenComponent, + MediaWatcherComponent, + FindByKeyComponent, + MustMatchComponent + ], + imports : [ + RouterModule.forChild(coreFeaturesRoutes), + MatButtonModule, + MatIconModule, + MatSidenavModule, + MatTabsModule, + MatTreeModule, + FuseAlertModule, + FuseCardModule, + FuseDateRangeModule, + FuseDrawerModule, + FuseHighlightModule, + FuseNavigationModule, + FuseScrollResetModule, + SharedModule + ] +}) +export class CoreFeaturesModule +{ +} diff --git a/src/app/modules/admin/docs/core-features/core-features.routing.ts b/src/app/modules/admin/docs/core-features/core-features.routing.ts new file mode 100644 index 00000000..d7d39b35 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/core-features.routing.ts @@ -0,0 +1,146 @@ +import { Route } from '@angular/router'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; +import { MockApiComponent } from 'app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component'; +import { AlertComponent } from 'app/modules/admin/docs/core-features/components/alert/alert.component'; +import { CardComponent } from 'app/modules/admin/docs/core-features/components/card/card.component'; +import { DateRangeComponent } from 'app/modules/admin/docs/core-features/components/date-range/date-range.component'; +import { DrawerComponent } from 'app/modules/admin/docs/core-features/components/drawer/drawer.component'; +import { HighlightComponent } from 'app/modules/admin/docs/core-features/components/highlight/highlight.component'; +import { NavigationComponent } from 'app/modules/admin/docs/core-features/components/navigation/navigation.component'; +import { AutogrowComponent } from 'app/modules/admin/docs/core-features/directives/autogrow/autogrow.component'; +import { ScrollbarComponent } from 'app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component'; +import { ScrollResetComponent } from 'app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component'; +import { ConfigComponent } from 'app/modules/admin/docs/core-features/services/config/config.component'; +import { MediaWatcherComponent } from 'app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component'; +import { SplashScreenComponent } from 'app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component'; +import { FindByKeyComponent } from 'app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component'; +import { MustMatchComponent } from 'app/modules/admin/docs/core-features/validators/must-match/must-match.component'; + +export const coreFeaturesRoutes: Route[] = [ + { + path : '', + component: CoreFeaturesComponent, + children : [ + { + path : '', + pathMatch : 'full', + redirectTo: 'libraries/mock-api' + }, + { + path : 'libraries', + children: [ + { + path : 'mock-api', + component: MockApiComponent + } + ] + }, + { + path : 'components', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'alert' + }, + { + path : 'alert', + component: AlertComponent + }, + { + path : 'card', + component: CardComponent + }, + { + path : 'date-range', + component: DateRangeComponent + }, + { + path : 'drawer', + component: DrawerComponent + }, + { + path : 'highlight', + component: HighlightComponent + }, + { + path : 'navigation', + component: NavigationComponent + } + ] + }, + { + path : 'directives', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'autogrow' + }, + { + path : 'autogrow', + component: AutogrowComponent + }, + { + path : 'scrollbar', + component: ScrollbarComponent + }, + { + path : 'scroll-reset', + component: ScrollResetComponent + } + ] + }, + { + path : 'services', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'config' + }, + { + path : 'config', + component: ConfigComponent + }, + { + path : 'splash-screen', + component: SplashScreenComponent + }, + { + path : 'media-watcher', + component: MediaWatcherComponent + } + ] + }, + { + path : 'pipes', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'find-by-key' + }, + { + path : 'find-by-key', + component: FindByKeyComponent + } + ] + }, + { + path : 'validators', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'must-match' + }, + { + path : 'must-match', + component: MustMatchComponent + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.html b/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.html new file mode 100644 index 00000000..509dee8b --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.html @@ -0,0 +1,99 @@ +
+ + +
+
+ +
+ + +
+ + Directives +
+
+ +
+

+ Autogrow +

+
+
+ +
+ +
+ +

+ fuseAutogrow is a <textarea> directive to make them automatically grow depending on their content. It's an alternative for + Angular Material's cdkTextareaAutosize directive with a more native and lightweight approach. +

+

+ Exported as: fuseAutogrow +

+ +

Module

+ + +

Usage

+

+ Here's the basic usage of the fuseAutogrow: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
fuseAutogrowVerticalPadding: number
+
+ Padding of the textarea. Must be inline with textarea's padding style. + + 8 +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.ts b/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.ts new file mode 100644 index 00000000..bfa6d789 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/autogrow/autogrow.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'autogrow', + templateUrl: './autogrow.component.html', + styles : [''] +}) +export class AutogrowComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.html b/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.html new file mode 100644 index 00000000..2588b7f9 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.html @@ -0,0 +1,88 @@ +
+ + +
+
+ +
+ + +
+ + Directives +
+
+ +
+

+ ScrollReset +

+
+
+ +
+ +
+ +

+ fuseScrollReset is a helper directive to reset the given element's scroll position to the top on route changes. +

+

+ This directive is especially useful in situations like having a router-outlet inside a scrollable area such as + mat-drawer-content, mat-sidenav-content or a custom scrollable element. +

+

+ Exported as: fuseScrollReset +

+ +

Module

+ + +

Usage

+

+ Here are some of the basic usages of the fuseScrollReset: +

+ + + + + + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.ts b/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.ts new file mode 100644 index 00000000..ebcbb26c --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/scroll-reset/scroll-reset.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'scroll-reset', + templateUrl: './scroll-reset.component.html', + styles : [''] +}) +export class ScrollResetComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.html b/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.html new file mode 100644 index 00000000..56fb1166 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.html @@ -0,0 +1,255 @@ +
+ + +
+
+ +
+ + +
+ + Directives +
+
+ +
+

+ Scrollbar +

+
+
+ +
+ +
+ +

+ fuseScrollbar is a wrapper directive for + Perfect Scrollbar + + plugin. +

+

+ Exported as: fuseScrollbar +

+ +

Module

+ + +

Usage

+

+ Here's the basic usage of the fuseScrollbar: +

+ + + + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
fuseScrollbar: boolean
+
+ Whether to enable or disable the custom scrollbars. + + '' +
+
@Input()
+
fuseScrollbarOptions: any
+
+ Perfect Scrollbar options + + {{'{}'}} +
+
+ +

Methods

+

+ It's possible to access the methods of this directive using a @ViewChild or @ViewChildren: +

+ + + + + + + + +

+ Here's the list of all available methods: +

+
+
+ update(): void +
+
+ Updates the scrollbar. +
+
+
+
+ destroy(): void +
+
+ Destroy the custom scrollbar instance. +
+
+
+
+ geometry(prefix: string = 'scroll'): ScrollbarGeometry +
+
+ Returns the geometry of the scrollable element (scrollLeft, scrollTop, scrollHeight, scrollWidth etc.) +
+
+
+
+ position(absolute: boolean = false): ScrollbarPosition +
+
+ Returns the position of the scrollable element (scrollLeft, scrollTop) +
+
+
+
+ scrollTo(x: number, y?: number, speed?: number): void +
+
+ Scrolls to given position. +
+
+
+
+ scrollToX(x: number, speed?: number): void +
+
+ Scrolls to given position on X axis. +
+
+
+
+ scrollToY(y: number, speed?: number): void +
+
+ Scrolls to given position on Y axis. +
+
+
+
+ scrollToTop(offset: number = 0, speed?: number): void +
+
+ Scrolls to top. +
+
+
+
+ scrollToBottom(offset: number = 0, speed?: number): void +
+
+ Scrolls to bottom. +
+
+
+
+ scrollToLeft(offset: number = 0, speed?: number): void +
+
+ Scrolls to left. +
+
+
+
+ scrollToRight(offset: number = 0, speed?: number): void +
+
+ Scrolls to right. +
+
+
+
+ scrollToElement(qs: string, offset: number = 0, ignoreVisible: boolean = false, speed?: number): void +
+
+ Scrolls to found element based on the given QuerySelector. If ignoreVisible is true then scroll won't + be triggered if the element is already inside the current viewport. +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.ts b/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.ts new file mode 100644 index 00000000..c0e14efe --- /dev/null +++ b/src/app/modules/admin/docs/core-features/directives/scrollbar/scrollbar.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'scrollbar', + templateUrl: './scrollbar.component.html', + styles : [''] +}) +export class ScrollbarComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.html b/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.html new file mode 100644 index 00000000..de949a3e --- /dev/null +++ b/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.html @@ -0,0 +1,496 @@ +
+ + +
+
+ +
+ + +
+ + Libraries +
+
+ +
+

+ Mock API +

+
+
+ +
+ +
+ +

+ MockAPI is a helper library developed specifically for Fuse to mock API endpoints and provide data to your app without having to create an + actual backend application. This way, you can focus on your frontend app and once you finish with the frontend, you can create your backend application to provide + real API endpoints with real data. +

+

+ This not only makes you progress faster and put together your app very quickly but you will also know exactly what you will be needing from your API. +

+

+ While MockAPI is not suitable for every use case or for every project, there are some cases that using it would make your life easier. These cases + are but not limited to: +

+
    +
  • If you want to focus on the frontend first
  • +
  • If you want to create a mockup of your idea to see if it's going to work or not
  • +
  • If you want to create a small side project for yourself or for your colleagues/company
  • +
  • If you need to present your idea to your client or to your boss without spending many hours and resources
  • +
+ + MockAPI is NOT a database or a backend replacement! It works on memory. As soon as you reload your app, all the changes you have made using Mock + API endpoints will go away and replaced with defaults. + + +

How it works?

+

+ MockAPI module provides an HttpInterceptor which intercepts all outgoing http requests to return a mock response based on user provided + callback functions. While it intercepts all requests, if the MockAPI module cannot find a callback function for the request type and url, it will + let the request to pass through. This way, you can use the MockAPI along with your real API endpoints. +

+ +

FuseMockApiService

+

+ The FuseMockApiService is the core of the MockAPI module. This singleton service is used to register API endpoints and callbacks. This is the + only thing you will need to mock API endpoints. +

+ +

Methods

+

+ All methods return an instance of FuseMockApiHandler. +

+
+
+ .onGet(url: string, delay?: number): FuseMockApiHandler +
+
+ Registers a url for GET requests. Delay (milliseconds) can be set to delay the response. +
+
+
+
+ .onPatch(url: string, delay?: number): FuseMockApiHandler +
+
+ Registers a url for PATCH requests. Delay (milliseconds) can be set to delay the response. +
+
+
+
+ .onPost(url: string, delay?: number): FuseMockApiHandler +
+
+ Registers a url for POST requests. Delay (milliseconds) can be set to delay the response. +
+
+
+
+ .onPut(url: string, delay?: number): FuseMockApiHandler +
+
+ Registers a url for PUT requests. Delay (milliseconds) can be set to delay the response. +
+
+
+
+ .onDelete(url: string, delay?: number): FuseMockApiHandler +
+
+ Registers a url for DELETE requests. Delay (milliseconds) can be set to delay the response. +
+
+

FuseMockApiHandler

+

+ This is the return type of all methods from the service. This class instance is not directly accessible. It can only be accessed through the + FuseMockApiService allowing method chaining. It has 2 methods: +

+
+
+ .reply(callback: FuseMockApiReplyCallback): void +
+
+ .replyCount(count: number): void +
+
+

+ These methods can be used to register the callback function for the request. The callback has an access to the outgoing HttpRequest which + can be used to access anything from the request such as form data and headers. +

+

+ You can limit the reply by chaining the .replyCount and providing the number of times this request should be handled. After the + limit has reached, the request handler will throw an error and won't let the request to pass through. It can be useful for creating one-time-use + endpoints to test "Reset Password" links or testing an unreachable API endpoints and etc. +

+

+ The callbacks must return either an array [number, any | string] or an observable that returns the said array. The number + represents the + HTTP status code + + of the response while the any | string represents the actual response. +

+
+
+ +

Basic usage

+ + + + + + + +

Step by step guide to start using FuseMockApi

+

+ It's pretty easy and straightforward to setup the MockAPI module for mocking API endpoints and their responses. Once you understand the underlying + mechanic, you will be able to mock API endpoints in no time. +

+ + Please keep in mind that the following step-by-step guide assumes you are doing everything from scratch for the MockAPI like creating directories, adding + files, exporting via barrels etc. Majority of these already setup in both Demo and Starter apps for you so it's a bit easier to start working with the + MockAPI. + + +

1. Prepare the files

+

+ Choose a location to store your mocks. By default the Demo app uses src/app/mock-api/ directory. You can use the same directory or choose another one. + For this guide, we will assume you are going to use the default directory. +

+ + It's important to keep all mock related files in the same directory because we will create a barrel file that exports all the mock classes and provide that to the + FuseMockApiModule so it can register and use them. + +

+ After choosing the location, create a sub-directory relevant to your endpoint and create 2 files in it; one for the mock class and one for the data json: +

+ +

+ src/app/mock-api/
+  └─ navigation/
+     └─ data.ts
+     └─ api.ts +

+ + +

2. Create the class

+

+ Edit the api.ts file and inside create an injectable class. +

+

+ The FuseMockApi requires one public method called registerHandlers() and it must be implemented. It also needs to be called within the + constructor of your mock class: +

+ + + + +

3. Create the data

+

+ Edit the data.ts file and add your default data as an exported const value. You can have more than one const per file, + just remember to export all of them: +

+ + + + +

3. Import the data into the Mock class

+

+ Return back to api.ts file, import your data and set them as class properties so they can be accessible within the class: +

+ + + + +

4. Register the endpoints and callbacks

+

+ Inside the registerHandlers() method, define your endpoints and callbacks to provide data: +

+ + + + +

5. Create a barrel file and import FuseMockApiModule

+

+ Navigate back to the root of your mock data directory, by default it's the src/app/mock-api/ directory, and create an index.ts file. +

+ +

+ src/app/mock-api/
+  └─ auth/
+  └─ navigation/
+  └─ user/
+  └─ index.ts
+

+ +

+ Edit the index.ts file to create a barrel from the services. Only import the services and not the data files, create an array from them and then export + that array: +

+ + + +

+ After that, head to the app.module.ts file, import the FuseMockApiModule and supply the array of services you have exported: +

+ + + + +

6. (Optional) Set a global delay

+

+ You can also set a global delay (ms) to all of your Mock API endpoints to simulate a slow connection, a server that's under attack or failing, some kind + of service interruption and etc. +

+ + + + +

7. Consume the mock API endpoints

+

+ Now you can consume your mock API endpoints anywhere from your app using Angular's HttpClient and the MockAPI module will catch the + requests. If there is a matching url and a request type, the MockAPI will provide the response from the provided callback. If there isn't one, then + the MockAPI will let the request to pass through allowing you to use a real API endpoints along with the mocked ones. +

+ + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.ts b/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.ts new file mode 100644 index 00000000..3c13360e --- /dev/null +++ b/src/app/modules/admin/docs/core-features/libraries/mock-api/mock-api.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'mock-api', + templateUrl: './mock-api.component.html', + styles : [''] +}) +export class MockApiComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.html b/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.html new file mode 100644 index 00000000..3e530fcd --- /dev/null +++ b/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.html @@ -0,0 +1,197 @@ +
+ + +
+
+ +
+ + +
+ + Pipes +
+
+ +
+

+ findByKey +

+
+
+ +
+ +
+ +

+ fuseFindByKey is a helper pipe that finds entries from an object using given key-source set. +

+ +

Module

+ + +

Usage

+ +

+ Consider this array of objects representing the tags and tasks data stored on the backend: +

+ + + +

+ Normally, you would join these two data together in the backend before sending it to the frontend so you can access tags of a task right from the task + itself: +

+ + + +

+ But, let's say you cannot join them. You have no access to the backend app or you cannot make any changes to it and you have to work with what you have. In + this case, you can use the fuseFindByKey pipe to get the tags of a task without joining the two data using javascript: +

+ + + +

+ The above code will iterate through the tasks, and for each task, it will also iterate the task's tags. +

+

+ task.tags array normally holds the ids of the assigned tags. But using fuseFindByKey pipe, we can use those ids to + extract the actual tag object from the tags array. +

+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.ts b/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.ts new file mode 100644 index 00000000..58acf540 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/pipes/find-by-key/find-by-key.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'find-by-key', + templateUrl: './find-by-key.component.html', + styles : [''] +}) +export class FindByKeyComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/services/config/config.component.html b/src/app/modules/admin/docs/core-features/services/config/config.component.html new file mode 100644 index 00000000..07b0b6d8 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/config/config.component.html @@ -0,0 +1,153 @@ +
+ + +
+
+ +
+ + +
+ + Services +
+
+ +
+

+ Config +

+
+
+ +
+ +
+ +

+ FuseConfigService is a singleton service to store and access an application wide configuration object. It can be used to store any kind of data and + can be accessed from anywhere within your application. +

+ +

Module

+ + +

Default configuration

+

+ By default, the application wide configuration is stored in src/app/core/config/app.config.ts file and it includes the layout style as + well as the color theme configurations: +

+ + + +

+ The default configuration is supplied to the FuseConfigService using the FuseConfigModule.forRoot() in AppModule: +

+ + + + +

Methods

+

+ To set a configuration use config setter on FuseConfigService. The setter will intelligently merge the configuration by replacing only + the given options if they exist while preserving others. If the supplied option does not exist on the configuration, it will be added: +

+ + + +

+ To get the configuration use config$ getter on FuseConfigService which returns an Observable of the configuration object: +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/services/config/config.component.ts b/src/app/modules/admin/docs/core-features/services/config/config.component.ts new file mode 100644 index 00000000..a098146e --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/config/config.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'config', + templateUrl: './config.component.html', + styles : [''] +}) +export class ConfigComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.html b/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.html new file mode 100644 index 00000000..43990cea --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.html @@ -0,0 +1,103 @@ +
+ + +
+
+ +
+ + +
+ + Services +
+
+ +
+

+ Media Watcher +

+
+
+ +
+ +
+ +

+ FuseMediaWatcherService is a singleton service to watch media changes. It automatically registers the breakpoints from TailwindCSS configuration, so + you can use the service without needing to configure it first. +

+ +

Module

+ + +

Methods

+

+ To watch changes on registered breakpoints, you can use the onMediaChange$ getter: +

+ + + +

+ You can also listen for custom media queries using onMediaQueryChange$(query: string) method: +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.ts b/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.ts new file mode 100644 index 00000000..2b61334e --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/media-watcher/media-watcher.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'media-watcher', + templateUrl: './media-watcher.component.html', + styles : [''] +}) +export class MediaWatcherComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.html b/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.html new file mode 100644 index 00000000..a54b8fc3 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ + +
+ + Services +
+
+ +
+

+ Splash Screen +

+
+
+ +
+ +
+ +

+ FuseSplashScreenService is a singleton service to control the splash screen. By default, the splash screen goes away automatically as soon as + Angular loads for the first time but, you can still show or hide it using the service afterwards. +

+ +

Module

+ + +

Methods

+
+
+ show(): void +
+
+ Shows the splash screen. +
+
+
+
+ hide(): void +
+
+ Hides the splash screen. +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.ts b/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.ts new file mode 100644 index 00000000..1ef75df8 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/services/splash-screen/splash-screen.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'splash-screen', + templateUrl: './splash-screen.component.html', + styles : [''] +}) +export class SplashScreenComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.html b/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.html new file mode 100644 index 00000000..e948fab1 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.html @@ -0,0 +1,117 @@ +
+ + +
+
+ +
+ + +
+ + Validators +
+
+ +
+

+ mustMatch +

+
+
+ +
+ +
+ +

+ The mustMatch validator can be used to check if two different form fields has the same value. For example, a Confirm password should + have the same value with the Password field. To validate that, the mustMatch validator can be used. +

+ +

Usage

+ + + + +

Parameters

+
+ + + + + + + + + + + + + + + + + +
NameDescription
+
controlPath: string
+
+ A dot-delimited string values that define the path to the control. +
+
matchingControlPath: string
+
+ A dot-delimited string values that define the path to the matching control. +
+
+

+ Because the mustMatch validator requires parameters, it must be used within the validators option of the form builder: +

+ + + +

+ To show an error message on the field, the mat-error element can be used within the mat-form-field: +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.ts b/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.ts new file mode 100644 index 00000000..46e47f99 --- /dev/null +++ b/src/app/modules/admin/docs/core-features/validators/must-match/must-match.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { CoreFeaturesComponent } from 'app/modules/admin/docs/core-features/core-features.component'; + +@Component({ + selector : 'must-match', + templateUrl: './must-match.component.html', + styles : [''] +}) +export class MustMatchComponent +{ + /** + * Constructor + */ + constructor(private _coreFeaturesComponent: CoreFeaturesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._coreFeaturesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/authentication/jwt/jwt.html b/src/app/modules/admin/docs/guides/authentication/jwt/jwt.html new file mode 100644 index 00000000..859a6f78 --- /dev/null +++ b/src/app/modules/admin/docs/guides/authentication/jwt/jwt.html @@ -0,0 +1,131 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Authentication +
+
+ +
+

+ JWT +

+
+
+ +
+ +
+ +

+ Fuse provides an implementation for JWT authorization. You can immediately hook up your backend API where you generate a JWT token and send it back and start + using Fuse's JWT implementation. +

+

+ This implementation of JWT can be found within app/core/auth/ directory. Here's the quick overview of provided files: +

+
    +
  • +

    Guards:

    +

    auth and noAuth guards to protect the routes.

    +
  • +
  • +

    AuthInterceptor

    +

    An interceptor to attach the access_token to the header of the requests and catching 401 responses.

    +
  • +
  • +

    AuthService

    +

    A service for signing in and out as well as checking the authenticated status of the user.

    +
  • +
  • +

    AuthUtils

    +

    Set of utilities to decode the JWT token.

    +
  • +
+ +

Setting up

+

1. Set up your backend API

+

+ Before start doing anything within Fuse, prepare your backend API. You will need API endpoints for signing in, signing out and + refreshing the token. These will usually be provided with your choice of JWT backend implementation by default so you don't have to do too much + work. +

+ +

2. Configure the AuthService

+

+ AuthService includes methods for signing in and out as well as refreshing the token. Edit the AuthService file and change the API + endpoints so the requests can go through. +

+

+ And that's pretty much it! You can now sign in, sign out and refresh the access token. +

+ +

A note about storing the access token

+

+ Fuse stores the access token in the local storage. There are a lot of debates going on about whether it is safe or not to store it in the local + storage. We believe it doesn't matter. Javascript always going to be executed in the browser, it doesn't matter where you store the JWT token, whether in the local + storage or in the memory as a variable, it can always be accessed and read! +

+

+ The only thing you have to be careful about is to protect your app against attacks like XSS, CSRF or XSRF. Angular does an amazingly good job to protect you against + these attacks by default but still, you have to be careful what to include into your app. And if you happen to have a security hole that can cause these attacks and + allows attackers to run their own Javascript code on your app, local JWT token is going to be the least of your worries. +

+ +

Refresh token

+

+ Refresh token is another type of token that usually sent with the access token when you first login and it allows refreshing the access + token. +

+

+ We are not going to go into any details about it since you can do your own research, but the premise is, you store the refresh token in an + HTTPOnly cookie which will be automatically added into the header of any request and can be used to sending back a fresh access token + from your backend API if needed. +

+

+ Since Javascript cannot read or write HTTPOnly cookies, refresh tokens can only be accessed and set via the requests and responses by + your backend implementation. Basically, the refresh token implementation needs to be done in your backend, there is nothing that can be done in Fuse or + in Javascript. +

+ + + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/authentication/jwt/jwt.ts b/src/app/modules/admin/docs/guides/authentication/jwt/jwt.ts new file mode 100644 index 00000000..12492dc4 --- /dev/null +++ b/src/app/modules/admin/docs/guides/authentication/jwt/jwt.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'jwt', + templateUrl: './jwt.html', + styles : [''] +}) +export class JwtComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.html b/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.html new file mode 100644 index 00000000..d25a23d2 --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.html @@ -0,0 +1,188 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ Component Theming +

+
+
+ +
+ +
+ +

+ Normally, Angular Material requires a separate .scss file for theming and that file must be included into a mixin where the defined Angular Material themes can be + applied. This approach not only forces you to create another .scss file for component theming, but it also forces you to import that file from another place just so + you can use the Angular Material mixin to apply the theme. +

+

+ This brakes the modularity because now you have a reference to your component's theming file from who knows where and you also have to remember to do all this again + and again every time you want to use the theme colors from your components. +

+

+ Fuse, on the other hand, provides a way easier method to add theming to your components: Tailwind utilities! +

+ +

Color palette utilities

+

+ As mentioned before, Angular Material uses 3 main palettes to generate themes; "Primary", "Accent" and "Warn". Being able to access these palettes and use their colors + with your components is a must have feature, otherwise you wouldn't be able to create components, apps or pages that "belong" to your app. +

+

+ All palette colors are available as Tailwind utility classes, and since these palettes are no more than Tailwind color palettes, they are processed as one by Tailwind, + therefore, every single color related utility you have in Tailwind also have primary, accent and warn colors and you + can use them just like any other color utility: +

+ + + + + + + + + + + + + + + + +

Other color utilities

+

+ There are also other color utilities to quickly set the background or the text color of an element. These special utilities + have different values on different schemes. For example, "bg-card" will have different colors depending on the selected + scheme so you don't have to set the background color explicitly for "Dark" themes. +

+ + + + + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.ts b/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.ts new file mode 100644 index 00000000..9b40852c --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/component-theming/component-theming.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'component-theming', + templateUrl: './component-theming.html', + styles : [''] +}) +export class ComponentThemingComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.html b/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.html new file mode 100644 index 00000000..21c2e9de --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.html @@ -0,0 +1,82 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ Page Layouts +

+
+
+ +
+ +
+ +

+ Like Theme layouts, Fuse also provides examples for variety of different page layouts. These layouts are designed for the content of the app and they provide + consistency. +

+

+ Unlike Theme layouts, Page layouts are NOT components, they are basically pre-made pages for you to reference and use + it as the shell for your pages. +

+

+ All page layouts can be found within the Demo app, you can try them over there and choose one that fits your needs. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.ts b/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.ts new file mode 100644 index 00000000..740efbeb --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/page-layouts/page-layouts.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'page-layouts', + templateUrl: './page-layouts.html', + styles : [''] +}) +export class PageLayoutsComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.html b/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.html new file mode 100644 index 00000000..ce19dc39 --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.html @@ -0,0 +1,141 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ Splash Screen +

+
+
+ +
+ +
+ +

+ The splash screen is the screen that shows up when your app is loading. It's NOT just a cosmetic screen or something that you can + make faster, it simply shows up while Angular loads and hides immediately after it finishes loading. +

+ +

How it works?

+

+ When you first arrive your app via its website address, the index.html loads first. It has all the required scripts injected in it by the + AngularCLI, so as soon as it loads, it also starts loading the required script files. +

+

+ After those required script files loaded, Angular starts the Bootstrapping progress and loads the first component (usually the AppComponent). Then + AppComponent takes over and loads other modules and components and your app starts running. +

+

+ While all of these happening, you will see nothing on the screen simply because the index.html file has nothing in it except the script injections + and the entry point for your AppComponent. That's where the splash screen comes into play and hides the white screen of loading. +

+ +

Customizing the screen

+

+ Splash screen content stays in the index.html file. The fuse-splash-screen dummy element holds everything related to the splash screen. + This element is not an actual Angular component, it's just a simple wrapper to hold everything you may want to show on the splash screen. +

+

+ Splash screen styles are located in src/assets/styles/splash-screen.css file. +

+

+ You can change the styles to modify the look of the splash screen and put anything you want into the fuse-splash-screen element to show on the + page. +

+ + Please note, you cannot run Angular components in here. Basically, by the time you can run Angular components, you won't be needing the + splash screen because everything would already be loaded! + +

+ If you don't want to show the splash screen and you are happy with the white screen of loading, then you can simply remove the + fuse-splash-screen dummy element and its content from the index.html file as well as the link + element that loads the splash-screen.css file: +

+ + + + + + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.ts b/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.ts new file mode 100644 index 00000000..b16e097d --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/splash-screen/splash-screen.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'splash-screen', + templateUrl: './splash-screen.html', + styles : [''] +}) +export class SplashScreenCustomizationComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.html b/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.html new file mode 100644 index 00000000..bd878816 --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.html @@ -0,0 +1,117 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ TailwindCSS +

+
+
+ +
+ +
+ +

+ As per the official page of Tailwind CSS, it is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke + designs without any annoying opinionated styles you have to fight to override. +

+

+ To simply put, Tailwind provides helper classes for almost every CSS rule available. +

+

+ Fuse includes and uses Tailwind whenever it's possible. There are no traditional styles available within the Fuse, Though there are edge cases that cannot be + styled using Tailwind, 99% of the Fuse is styled using Tailwind. +

+ +

Configuration

+

+ To use Tailwind, you don't need to do any setup as all Tailwind classes can be accessible from any HTML file you create by default. +

+

+ Tailwind configuration can be found in /src/tailwind.config.js file. This file is used to configure the generated classes by Tailwind. We already + configured the Tailwind using the config file to provide sensible defaults for a web app. +

+ +

Tailwind and Fuse

+

+ Fuse also uses Tailwind as its main configuration source for Angular Material components. Basically, some of the Tailwind configuration is exported during + the Tailwind's build process and made available for Fuse's internal use cases. This allows Fuse to use Tailwind's configuration as the single source of truth. +

+

+ To summarize; if you want to add/edit/remove any color, change the font families, modify the breakpoints or change any other visual configuration, you have to do + that via the Tailwind's config file and they will be carried over to the Angular Material components. +

+ +

Building Tailwind

+

+ Since Angular v11, Tailwind support has been added into the AngularCLI so you don't have to do anything to build Tailwind. +

+ +

Official docs

+

+ Official Tailwind CSS documentation: + https://tailwindcss.com/ + +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.ts b/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.ts new file mode 100644 index 00000000..00db40a8 --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'tailwindcss', + templateUrl: './tailwindcss.html', + styles : [''] +}) +export class TailwindCSSComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.html b/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.html new file mode 100644 index 00000000..e5c2fecb --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.html @@ -0,0 +1,138 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ Theme Layouts +

+
+
+ +
+ +
+ +

+ As previously mentioned, Fuse comes with variety of different layouts. These layouts are on the theme level, meaning that when changed, they can completely + alter the look of your app. +

+

+ By default, layouts are applied automatically via the LayoutComponent. The default layout is set by the app.config.ts file from + app/core/config/ directory. This configuration file is supplied as the default configuration to the FuseConfigService which is a custom + made configuration service to store, write and read application wide configurations. +

+ + More detailed information about FuseConfigService can be found in the + Core features > Services > + Config + + section of this documentation. + +

+ After the default layout is read and set from the configuration service, LayoutComponent will also read the current route tree, walk through it starting + from the root all the way to the current route and look for the layout key-value from the data object. If found, LayoutComponent + will switch to that layout. This is particularly useful if you want to have different layouts for different portions of your app. +

+

+ Here's an example from app.routing.ts file that loads the EmptyLayout for authentication pages: +

+ + + +

+ And here's another example that loads the classic layout: +

+ + + +

LayoutComponent

+

+ The LayoutComponent plays an important part for managing important things such as the current layout and the color theme. Because of it, + removing the LayoutComponent and using the individual layouts by themselves is not possible. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.ts b/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.ts new file mode 100644 index 00000000..181af81f --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'theme-layouts', + templateUrl: './theme-layouts.html', + styles : [''] +}) +export class ThemeLayoutsComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/customization/theming/theming.html b/src/app/modules/admin/docs/guides/customization/theming/theming.html new file mode 100644 index 00000000..0193acea --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/theming/theming.html @@ -0,0 +1,384 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Customization +
+
+ +
+

+ Theming +

+
+
+ +
+ +
+ +

+ Since Fuse uses Angular Material as its primary UI library, it also uses the + Angular Material Theming + + with a twist. +

+

+ Rather than using Angular Material's default theming process, Fuse incorporates that into the Tailwind's build process. This way, you can configure + your application using Tailwind's configuration file and things like colors, font families, breakpoints and etc. will be carried over and applied to + the Angular Material components. +

+

+ You can also create color themes using Tailwind's configuration and they will also be carried over and used for building Angular Material themes. + Here's an example theme configuration from Tailwind's configuration: +

+ + + +

+ Here's the general structure of a theme configuration: +

+ + + +
    +
  • +

    primary, accent, warn

    + These are the 3 main color palettes of the theme. They must be a Tailwind color palette. + If DEFAULT is provided, that will become the main color of that palette otherwise the 500 hue level from + the same palette will be used as the DEFAULT. +
  • +
  • +

    on-primary, on-accent, on-warn

    + These are the 3 main contrasting color palettes of the theme. They can be either a complete or a partial + Tailwind color palette. By default, Fuse will automatically generate contrasting colors using the colors + from "Primary", "Accent" and "Warn" palettes but for some reason, if you more control over the contrasting + colors, you can use these objects to customize them. +
  • +
+ + +
+

+ Angular Material library uses 3 main color palettes and their contrasting colors to theme their + components. Here we basically moved that configuration (in a customized and simplified way) into + the Tailwind. +

+

+ In order to have a complete understanding how Angular Material components are themed, you can check + their official guides here: + https://material.angular.io/guide/theming + +

+
+
+ +

+ Let's break down the 'default' theme configuration. This one is required for entire theming system and Fuse to work correctly: +

+ + + + +

+ Let's break down the rest of the theme configuration: +

+ + + + +

Color palettes

+

+ By default, Tailwind provides lots of color palettes so you can always use them to create themes. +

+

+ If you have a different color that you want to use, like a brand color or a custom hand picked one, you must + generate a Tailwind-like color palette in order to be able to generate themes with. There are couple ways + of creating such palettes; +

+
    +
  1. + You can create them by hand. Though this gives you complete freedom, it is by far the hardest one + especially if you don't have any experience with colors and their relations. +
  2. +
  3. + You can use online tools to generate Tailwind color palettes. They usually do a decent job for creating + palettes but they could be a little off in some cases. +
  4. +
  5. + You can use our custom generatePalette() helper method to create palettes either from a single + color, or from multiple colors. +
  6. +
+ +

generatePalette()

+

+ This custom helper method allows you to generate Tailwind-like palettes from either a single color or multiple colors: +

+ + + +

+ Usually, if you are working on an app by yourself, both designing and developing it, generating a complete + Tailwind-like palette from a single color is a great option. But that's not always the case and most palette + generators only give you an option to generate a palette using a single color. That becomes problematic if + you have more than one color because then you would have to go through the generated palette and try to fit + your remaining colors into it. +

+

+ This is exactly where the generatePalette() method shines! +

+

+ You can provide an object with multiple color levels and it will handle the rest for you. The best thing about + the generatePalette() method is that it will actually respect the colors you choose. It will adjust + the palette to make sure all the colors you provided will fit into it seamlessly. +

+

+ Once you generate the palettes, you can use them to create color themes for your app. +

+ +

Setting the default theme

+

+ By default, the "default" theme will be used as the default theme for your application. If for some reason, you want to have more than + one themes and choose something other than the "default", you can do so by setting the default theme via app/core/config/app.config.ts file. + You can also change the theme runtime using the FuseConfigService. +

+ +

Schemes

+

+ Every color theme you configure will automatically have 2 schemes; Light and Dark. This way you can immediately + change to a "dark" mode without losing your theme or setting up a separate "dark" theme. +

+

+ You can set the default scheme via app/core/config/app.config.ts file. You can also change the scheme runtime using the + FuseConfigService. +

+

+ While you can set the scheme to "light" or "dark" you can also set it to "auto". "auto" mode will automatically switch between the "light" and "dark" + schemes depending on the user's operating system's setting. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/customization/theming/theming.ts b/src/app/modules/admin/docs/guides/customization/theming/theming.ts new file mode 100644 index 00000000..82e7f1d6 --- /dev/null +++ b/src/app/modules/admin/docs/guides/customization/theming/theming.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'theming', + templateUrl: './theming.html', + styles : [''] +}) +export class ThemingComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/development/component-structure/component-structure.html b/src/app/modules/admin/docs/guides/development/component-structure/component-structure.html new file mode 100644 index 00000000..b11b5857 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/component-structure/component-structure.html @@ -0,0 +1,180 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Development +
+
+ +
+

+ Component Structure +

+
+
+ +
+ +
+ + + + Fuse uses route based component loading strategy. There are componentless and empty-path routes specifically structured to load components without hard + coding them into templates. This provides great extensibility and scalability to the app and we strongly suggest you to follow the same path. + + +

+ Here's the diagram of the Fuse's default component structure for the reference: +

+ + +
+ +
+ AppComponent + +
+ LayoutComponent + +
+ Layout + +
+ +
+ Navigation +
+ +
+ +
+ Header +
+ +
+ <router-outlet> +
+ +
+ Footer +
+
+
+
+
+
+
+ +

AppComponent

+

+ This is the entry point of the application. It imports all the necessary modules in order for Fuse and your app to work. All 3rd party modules also imported + and configured here. +

+ +

LayoutComponent

+

+ This component makes the layout switching easier. Fuse provides variety of different layouts like ClassicLayout or + EnterpriseLayout and this component can load or switch those layouts at any time. +

+

+ To understand how LayoutComponent works, look at this portion of the app.routing.ts file: +

+ + + +

+ As you can see, there is an empty-path route at the beginning of the Admin routes which essentially loads the LayoutComponent into the + <router-outlet> of the AppComponent. +

+

+ After that, LayoutComponent loads the selected layout. All layouts includes a <router-outlet> in their templates which then loads + the actual component that's being requested depending on the active route. +

+

+ More detailed information about layouts can be found in the + Customization > Theme layouts + section of this + documentation. +

+ +

Layout

+

+ This is the selected layout that's being loaded by the LayoutComponent. All layouts located at the app/layout/layouts/ directory and these + layouts include common components like Navigation, Header and Footer. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/development/component-structure/component-structure.ts b/src/app/modules/admin/docs/guides/development/component-structure/component-structure.ts new file mode 100644 index 00000000..961bc3a7 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/component-structure/component-structure.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'component-structure', + templateUrl: './component-structure.html', + styles : [''] +}) +export class ComponentStructureComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/development/deployment/deployment.html b/src/app/modules/admin/docs/guides/development/deployment/deployment.html new file mode 100644 index 00000000..93cd0c45 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/deployment/deployment.html @@ -0,0 +1,99 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Development +
+
+ +
+

+ Deployment +

+
+
+ +
+ +
+ +

+ To deploy your application, you have to compile it, and then host the JavaScript, CSS, and HTML on a web server. Built Angular applications are very portable and + can live in any environment or served by any technology, such as Node, Java, .NET, PHP, and many others. +

+

+ To build your application for production, run the following command: +

+ + +

Alternate command

+ +

+ Alias for ng build --prod. +

+ +

+ If you are getting error messages that includes keywords like HEAP, JS stack tree, + out of memory while trying to run ng build --prod or npm run build:prod commands, + you may have an older Node.js version, try updating your Node.js to the latest LTS version and then try again. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/development/deployment/deployment.ts b/src/app/modules/admin/docs/guides/development/deployment/deployment.ts new file mode 100644 index 00000000..f3fad75f --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/deployment/deployment.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'deployment', + templateUrl: './deployment.html', + styles : [''] +}) +export class DeploymentComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.html b/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.html new file mode 100644 index 00000000..3b976cbf --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.html @@ -0,0 +1,342 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Development +
+
+ +
+

+ Directory Structure +

+
+
+ +
+ +
+ + + Fuse's directory structure might look overwhelming and intimidating at first, but following this page and giving a bit time to understand it before jumping + right into code will help immensely. + +

+ Fuse built around the idea of multi-purpose and multi-layout. You can think of Fuse as a Starter kit and a guide rather than just a simple + template. The purpose of Fuse is not only provide a pre-made styles for visual elements but is also be a guide to follow while building an app. +

+

+ It's more of an answer to the questions like Where should I put this file? or Which file should I put this piece of code into? + rather than just a compilation of example pages and ready to use styles. +

+

+ Here's a simplified version of the entire directory structure of the Fuse: +

+
+ + + +
+
├─ +
+
└─ +
+ + {{node.name}} + +
+
+ + + + + {{node.name}} + + +
+
+ +

@fuse/

+

+ This is the core directory of the Fuse. It includes components, directives, services, pipes, custom validators, animations, base styles and much more. +

+

+ Modifications on this directory is NOT recommended. Since majority of changes happen within this directory on updates, any modifications to this + directory and its content will make the updating process complex and time consuming. +

+ +

app/

+

+ This directory contains all application related codes. This is where you put your code. +

+

+ Fuse provides a sensible default directory structure within the app directory. You can of course completely remove everything from it and + design your own structure but the provided structure is designed to handle applications from small to enterprise grade: +

+
+ + + +
+
├─ +
+
└─ +
+ + {{node.name}} + +
+
+ + + + + {{node.name}} + + +
+
+ +

app/core/

+

+ This directory is designed to contain your application's core; Singleton services, default configurations, default states and likes. It's + NOT recommended to put any components, directives, pipes or simply anything has a template or related to templates in here. +

+

+ Example files that can go into this directory includes, but not limited to: +

+
    +
  • +

    Singleton services:

    +

    Auth service

    +

    Logger service

    +

    SplashScreen service

    +
  • +
  • +

    Guards

    +

    Auth guard

    +

    NoAuth guard

    +
  • +
  • +

    Defaults

    +

    Default configurations

    +

    Default state

    +
  • +
  • +

    Custom validators

    +

    Phone number validator

    +

    Confirm validator

    +
  • +
+

and etc...

+ +

app/mock-api/

+

+ This directory is designed to contain data services for custom made MockAPI library. Detailed information about this directory and the MockAPI library can be found + in the + Core features > Libraries > MockAPI + section of this documentation. +

+ + Starter + version of Fuse doesn't include any mock-api services except for the Navigation. + + +

app/layout/

+

+ This directory designed to contain everything related to the layout of your app. By default, Fuse provides variety of different layout options for you to use. +

+

+ The LayoutComponent is an entry component and it provides an easy way of switching between different layouts. More information about how the + LayoutComponent works can be found in the + Customization > Theme layouts + section of this documentation. +

+

+ The app/layout/common/ folder includes common components for layouts such as: +

+
    +
  • Messages
  • +
  • Notifications
  • +
  • Search
  • +
  • Shortcuts
  • +
  • User Menu
  • +
+

+ These components are being used across different layouts, so if you use multiple layouts and want to create a component, directive or a pipe for using within your + layouts, you can put them inside the common folder. +

+ +

app/modules/

+

+ This directory is designed to contain your application's feature modules. +

+

+ For example; Authentication related pages such as Sign In, Sign Up, Lost Password and etc. can be grouped into auth/ directory while your + main admin components and modules grouped into admin/ directory. +

+

+ If you use SSR (Server Side Rendering) you can even include your landing page as one of the modules and keep everything in a single app. +

+ +

app/shared/

+

+ This directory is designed to contain anything re-usable such as components, directives and pipes. By default, it doesn't include any of them but when you create + one for your app, you can put it here. +

+

+ The only file here is the shared.module.ts file which simply imports and exports some of the common Angular modules so you don't have to import them + one by one. You can just import the shared.module.ts into your module whenever you need one of those common modules. +

+

+ Currently it imports and exports: +

+
    +
  • +

    CommonModule

    +

    Required for common directives such as *ngIf and *ngFor

    +
  • +
  • +

    FormsModule

    +

    Required for form directives

    +
  • +
  • +

    ReactiveFormsModule

    +

    Required for reactive form directives

    +
  • +
+

+ You can add/remove anything to/from the shared.module.ts file and use the module to import commonly used modules without needing to remember them + one by one. +

+ +

assets/

+

+ Default Angular assets folder. +

+ +

environments/

+

+ Default Angular environments folder. +

+ +

styles/

+

+ This folder contains 4 different scss files: +

+
    +
  • +

    styles.scss

    +

    This file is for adding/importing global styles to the app.

    +
  • +
  • +

    tailwind.scss

    +

    This is the main Tailwind file for Tailwind utilities.

    +
  • +
  • +

    vendors.scss

    +

    + This file is designed to import 3rd party library css/scss files into the project. Any style here can be overridden by styles.scss file + allowing you to overwrite/modify 3rd party library styles and make them visually compatible with your app. +

    +

    + For example, let's say you use FullCalendar 3rd party library. You use the vendors.scss file to import default styles + of the FullCalendar into your project so it looks and works correctly. Then, you can add custom styles to the styles.scss file to overwrite those + default styles to make FullCalendar compatible with your app's design. +

    +
  • +
+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.ts b/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.ts new file mode 100644 index 00000000..a3be64fb --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/directory-structure/directory-structure.ts @@ -0,0 +1,276 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { FlatTreeControl } from '@angular/cdk/tree'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +interface DirNode +{ + name: string; + expandable?: boolean; + level?: number; + last?: boolean; + children?: DirNode[]; +} + +interface FlatDirNode +{ + name: string; + expandable: boolean; + level: number; + last: boolean; +} + +@Component({ + selector : 'directory-structure', + templateUrl : './directory-structure.html', + styles : [ + ` + directory-structure .mat-tree { + font-family: "IBM Plex Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + } + + directory-structure .mat-tree-node { + min-height: 32px; + } + + directory-structure .mat-tree .mat-icon-button { + width: 32px; + height: 32px; + min-height: 32px; + line-height: 32px; + margin-right: 8px; + } + ` + ], + encapsulation: ViewEncapsulation.None +}) +export class DirectoryStructureComponent implements OnInit +{ + appDir: any; + appTree: any; + generalDir: any; + generalTree: any; + + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + // App dir + this.appDir = [ + { + name : 'app/', + children: [ + { + name : 'core/', + children: [ + {name: 'auth/'}, + {name: 'config/'}, + {name: 'user/'}, + {name: 'core.module.ts'} + ] + }, + { + name : 'layout/', + children: [ + {name: 'common/'}, + {name: 'layouts/'}, + {name: 'layout.component.html'}, + {name: 'layout.component.scss'}, + {name: 'layout.component.ts'}, + {name: 'layout.module.ts'}, + {name: 'layout.types.ts'} + ] + }, + { + name : 'mock-api/', + children: [ + {name: 'apps/'}, + {name: 'common/'}, + {name: 'dashboards/'}, + {name: 'pages/'}, + {name: 'ui/'}, + {name: 'index.ts'} + ] + }, + { + name : 'modules/', + children: [ + {name: 'admin/'}, + {name: 'auth/'}, + {name: 'landing/'} + ] + }, + { + name : 'shared/', + children: [ + {name: 'shared.module.ts'} + ] + }, + {name: 'app.component.html'}, + {name: 'app.component.scss'}, + {name: 'app.component.ts'}, + {name: 'app.module.ts'}, + {name: 'app.resolvers.ts'}, + {name: 'app.routing.ts'}, + {name: 'app.types.ts'} + ] + } + ]; + + // General dir + this.generalDir = [ + { + name : 'src/', + children: [ + { + name : '@fuse/', + children: [ + {name: 'animations/'}, + {name: 'components/'}, + {name: 'directives/'}, + {name: 'lib/'}, + {name: 'pipes/'}, + {name: 'services/'}, + {name: 'styles/'}, + {name: 'tailwind/'}, + {name: 'validators/'}, + {name: 'version/'}, + {name: 'index.ts'}, + {name: 'fuse.module.ts'} + ] + }, + this.appDir[0], + { + name : 'assets/', + children: [ + {name: 'fonts/'}, + {name: 'icons/'}, + {name: 'images/'}, + {name: 'styles/'} + ] + }, + { + name : 'environments/', + children: [ + {name: 'environment.prod.ts'}, + {name: 'environment.ts'} + ] + }, + { + name : 'styles/', + children: [ + {name: 'styles.scss'}, + {name: 'tailwind.scss'}, + {name: 'vendors.scss'} + ] + }, + {name: 'favicon-16x16.png'}, + {name: 'favicon-32x32.png'}, + {name: 'global.d.ts'}, + {name: 'index.html'}, + {name: 'main.ts'}, + {name: 'polyfills.ts'}, + {name: 'test.ts'} + ] + } + ]; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + this.appTree = this.createTree(this.appDir); + this.generalTree = this.createTree(this.generalDir); + + // Add 'last:true' to the last child + this.appTree.treeControl.dataNodes.forEach((node: FlatDirNode, index, nodes) => { + nodes[index].last = false; + if ( nodes[index + 1] ) + { + nodes[index].last = nodes[index + 1].level === node.level - 1; + } + else + { + nodes[index].last = true; + } + }); + + this.generalTree.treeControl.dataNodes.forEach((node: FlatDirNode, index, nodes) => { + nodes[index].last = false; + if ( nodes[index + 1] ) + { + nodes[index].last = nodes[index + 1].level === node.level - 1; + } + else + { + nodes[index].last = true; + } + }); + + // Expand the first item + this.appTree.treeControl.expand(this.appTree.treeControl.dataNodes[0]); + this.generalTree.treeControl.expand(this.generalTree.treeControl.dataNodes[0]); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Has child + * + * @param _ + * @param node + */ + hasChild(_: number, node: DirNode): boolean + { + return node.expandable; + } + + /** + * Create a new tree + */ + createTree(data): { dataSource: any, treeControl: any } + { + // Create tree control and mock-api source + const treeControl = new FlatTreeControl(node => node.level, node => node.expandable); + const dataSource = new MatTreeFlatDataSource( + treeControl, + new MatTreeFlattener( + (node: DirNode, level: number) => ({ + expandable: !!node.children && node.children.length > 0, + name : node.name, + level : level + }), + node => node.level, node => node.expandable, node => node.children) + ); + + // Set the mock-api + dataSource.data = data; + + return { + treeControl, + dataSource + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.html b/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.html new file mode 100644 index 00000000..75c13b63 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.html @@ -0,0 +1,80 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Development +
+
+ +
+

+ Starter Kit +

+
+
+ +
+ +
+ +

+ Starter kit is the bare minimum version of the Fuse. All the Demo applications and pages are stripped from it and includes only the essential components and + modules for you to start building your app. +

+

+ It's strongly recommended that you build your app on top of the Starter kit rather then the Demo. Demo includes lots of + sample content and some of them would never be used together (like multiple Pricing page designs, multiple Auth page designs etc.) which can slow down your app a + lot more than usual. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.ts b/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.ts new file mode 100644 index 00000000..51c714f3 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/starter-kit/starter-kit.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'starter-kit', + templateUrl: './starter-kit.html', + styles : [''] +}) +export class StarterKitComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/development/updating/updating.html b/src/app/modules/admin/docs/guides/development/updating/updating.html new file mode 100644 index 00000000..63f986ea --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/updating/updating.html @@ -0,0 +1,95 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Development +
+
+ +
+

+ Updating +

+
+
+ +
+ +
+ +

+ Since Fuse is built as a Starter kit and an Admin template, there is no easy or a set way of updating it like a normal library. Though + it's completely up to you to keep the Fuse updated, there are two key points that might help you with the task: +

+
    +
  • +

    + Do NOT touch the @fuse folder unless you absolutely have to. Keeping that folder intact is the key to have easier + upgrades. +

    +
  • +
  • +

    + Fork the original Fuse repo from its Github and build on top of that. That way, you can merge the changes from the origin repo as updates released. +

    +
  • +
+

+ If you follow these two rules, it will make the updating process a little bit more easier. +

+

+ The best way of updating Fuse is to compare the latest version with your version using Github's compare feature. After that, you can either manually patch your + setup or merge (and resolve conflicts) through Github. Every release is tagged and available under the Releases tab of Fuse's Github repo. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/development/updating/updating.ts b/src/app/modules/admin/docs/guides/development/updating/updating.ts new file mode 100644 index 00000000..a7bfb3d5 --- /dev/null +++ b/src/app/modules/admin/docs/guides/development/updating/updating.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'updating', + templateUrl: './updating.html', + styles : [''] +}) +export class UpdatingComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/getting-started/installation/installation.html b/src/app/modules/admin/docs/guides/getting-started/installation/installation.html new file mode 100644 index 00000000..01f12353 --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/installation/installation.html @@ -0,0 +1,153 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Getting Started +
+
+ +
+

+ Installation +

+
+
+ +
+ +
+ +

+ Before you begin installing Fuse, prepare a folder where you can unzip the downloaded .zip file. +

+ +

1. Choose which version you want to install

+

+ When you unzip the .zip file you have downloaded from Themeforest, you will find 2 additional .zip files along with other files. One of those .zip files is the + Demo version, and the other one is the Starter version: +

+
    +
  • +

    + Demo fuse-demo-vX.X.X.zip +

    +

    + This .zip file includes the Demo version which includes all the applications, pages and UI sections from the Demo application. This version is for referencing + purposes only and it should be only used for copying code/modules from it. +

    +

    + Do NOT use the Demo version to build your app, otherwise you will have a lot of unnecessary weight to your app right from the start and it + will provide a poor development experience. +

    +
  • +
  • +

    + Starter fuse-starter-vX.X.X.zip +

    +

    + This .zip file includes the Starter version which includes all the core components and functionality of Fuse without the Demo applications, + pages and UI sections. DO use the Starter version to build your app on top. +

    +
  • +
+ +

2. Unzip

+

+ After choosing the version you want to install, unzip the .zip file of that version into your workspace directory. +

+ +
+

+ You can completely skip the steps #1 and #2 and instead fork the project from Fuse's Github repo directly. This will not only + make things simpler, but it will also make any future updates easier as you can merge the changes from the original repo into your fork. +

+

+ For more information and to access Fuse's Github repo, check out the Fuse's Themeforest description page. +

+
+
+ +

3. Run the installation command

+

+ Open a console/terminal window and navigate into your workspace directory. You must be at the same folder with the package.json file in order to run + the commands. +

+

+ To complete the installation, enter the following command: +

+ +

+ This command will take some time and install all the required libraries into the node_modules directory in order for you to start developing. +

+ +
+

+ After the installation completes, you may see warnings about deprecated packages and security risks. You can safely ignore those messages as Fuse (and other + Angular apps) use Node.js for only development environment. +

+

+ Unless you explicitly add a package to your dependencies list in package.json file, they won't be included into the final application + therefore they are not going cause any security risks. +

+
+
+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/getting-started/installation/installation.ts b/src/app/modules/admin/docs/guides/getting-started/installation/installation.ts new file mode 100644 index 00000000..b892245b --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/installation/installation.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'installation', + templateUrl: './installation.html', + styles : [''] +}) +export class InstallationComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.html b/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.html new file mode 100644 index 00000000..fa567e52 --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.html @@ -0,0 +1,105 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Getting Started +
+
+ +
+

+ Introduction +

+
+
+ +
+ +
+ +

Thank you for choosing Fuse.

+

+ Fuse is a multi-purpose, multi-layout Angular admin template featuring custom made Application and Page layouts, UI elements and UX best practices. +

+

+ In this documentation, you will find starter guides and API documentation of the custom made Fuse components. +

+ +
+

Main libraries

+

+ Fuse powered by 3 main libraries; Angular, Angular Material and TailwindCSS: +

+
    +
  • + Angular + +

    + It is the core of the Fuse. This version only works with Angular. +

    +
  • +
  • + Angular Material + +

    + Provides the main UI components such as Buttons, Form fields, Tabs, Progress bars and more. +

    +
  • +
  • + TailwindCSS + +

    + It is the core of the style configuration and it provides utility classes for almost every CSS rule available. +

    +
  • +
+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.ts b/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.ts new file mode 100644 index 00000000..05d3c4d1 --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/introduction/introduction.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'introduction', + templateUrl: './introduction.html', + styles : [''] +}) +export class IntroductionComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.html b/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.html new file mode 100644 index 00000000..4af602f8 --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.html @@ -0,0 +1,111 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Getting Started +
+
+ +
+

+ Prerequisites +

+
+
+ +
+ +
+ +

+ Before you begin developing with Fuse, make sure your development environment includes Node.js, npm and Angular CLI. +

+ +

1. Node.js

+

+ To install Node.js, go to + Node.js + + and install the active LTS version. +

+ +

2. npm

+

+ To download and install npm packages, you must have the npm package manager. This guide uses the npm client command line interface, which is installed with Node.js + by default. To check that you have the npm client installed, run npm -v in a terminal/console window. +

+ +

3. Angular CLI

+

+ You will use the + Angular CLI + + to create projects, generate application and library code, and perform a variety of ongoing development tasks + such as testing, bundling, and deployment. +

+

+ To install the CLI using npm, open a terminal/console window and enter the following command: +

+ + + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.ts b/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.ts new file mode 100644 index 00000000..64c3bda4 --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'prerequisites', + templateUrl: './prerequisites.html', + styles : [''] +}) +export class PrerequisitesComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/getting-started/serving/serving.html b/src/app/modules/admin/docs/guides/getting-started/serving/serving.html new file mode 100644 index 00000000..94479a6f --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/serving/serving.html @@ -0,0 +1,102 @@ +
+ + +
+
+ +
+ +
+ + Guides +
+
+ + Getting Started +
+
+ +
+

+ Serving +

+
+
+ +
+ +
+ + +

+ After the installation process finishes, run the following command while still in your workspace directory: +

+ +

+ The ng serve command launches the server, watches your files, and rebuilds the app as you make changes to those files. +

+

+ The --open (or just -o) option automatically opens your browser to http://localhost:4200/. +

+ +

Alternate command

+ +

+ Alias for ng serve --open. +

+ +

+ If you are getting error messages that includes keywords like HEAP, JS stack tree, + out of memory while trying to run ng serve --open or npm start commands, + you may have an older Node.js version, try updating your Node.js to the latest LTS version and then try again. +

+ + + + +
+ +
diff --git a/src/app/modules/admin/docs/guides/getting-started/serving/serving.ts b/src/app/modules/admin/docs/guides/getting-started/serving/serving.ts new file mode 100644 index 00000000..a1d8630d --- /dev/null +++ b/src/app/modules/admin/docs/guides/getting-started/serving/serving.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; + +@Component({ + selector : 'serving', + templateUrl: './serving.html', + styles : [''] +}) +export class ServingComponent +{ + /** + * Constructor + */ + constructor(private _guidesComponent: GuidesComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._guidesComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/guides/guides.component.html b/src/app/modules/admin/docs/guides/guides.component.html new file mode 100644 index 00000000..e0b82370 --- /dev/null +++ b/src/app/modules/admin/docs/guides/guides.component.html @@ -0,0 +1,38 @@ +
+ + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ + diff --git a/src/app/modules/admin/docs/guides/guides.component.scss b/src/app/modules/admin/docs/guides/guides.component.scss new file mode 100644 index 00000000..f114c6ec --- /dev/null +++ b/src/app/modules/admin/docs/guides/guides.component.scss @@ -0,0 +1,9 @@ +guides { + + fuse-vertical-navigation { + + .fuse-vertical-navigation-wrapper { + box-shadow: none !important; + } + } +} diff --git a/src/app/modules/admin/docs/guides/guides.component.ts b/src/app/modules/admin/docs/guides/guides.component.ts new file mode 100644 index 00000000..f55bd65d --- /dev/null +++ b/src/app/modules/admin/docs/guides/guides.component.ts @@ -0,0 +1,199 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { MatDrawer } from '@angular/material/sidenav'; +import { FuseNavigationItem } from '@fuse/components/navigation'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; +import { Subject } from 'rxjs'; + +@Component({ + selector : 'guides', + templateUrl : './guides.component.html', + styleUrls : ['./guides.component.scss'], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class GuidesComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + drawerMode: 'side' | 'over'; + drawerOpened: boolean; + menuData: FuseNavigationItem[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseMediaWatcherService: FuseMediaWatcherService + ) + { + this.menuData = [ + { + id : 'getting-started', + title : 'Getting started', + type : 'group', + children: [ + { + id : 'getting-started.introduction', + title: 'Introduction', + type : 'basic', + link : '/docs/guides/getting-started/introduction' + }, + { + id : 'getting-started.prerequisites', + title: 'Prerequisites', + type : 'basic', + link : '/docs/guides/getting-started/prerequisites' + }, + { + id : 'getting-started.installation', + title: 'Installation', + type : 'basic', + link : '/docs/guides/getting-started/installation' + }, + { + id : 'getting-started.serving', + title: 'Serving', + type : 'basic', + link : '/docs/guides/getting-started/serving' + } + ] + }, + { + id : 'development', + title : 'Development', + type : 'group', + children: [ + { + id : 'development.directory-structure', + title: 'Directory structure', + type : 'basic', + link : '/docs/guides/development/directory-structure' + }, + { + id : 'development.component-structure', + title: 'Component structure', + type : 'basic', + link : '/docs/guides/development/component-structure' + }, + { + id : 'development.starter-kit', + title: 'Starter kit', + type : 'basic', + link : '/docs/guides/development/starter-kit' + }, + { + id : 'development.deployment', + title: 'Deployment', + type : 'basic', + link : '/docs/guides/development/deployment' + }, + { + id : 'development.updating', + title: 'Updating', + type : 'basic', + link : '/docs/guides/development/updating' + } + ] + }, + { + id : 'customization', + title : 'Customization', + type : 'group', + children: [ + { + id : 'customization.theme-layouts', + title: 'Theme layouts', + type : 'basic', + link : '/docs/guides/customization/theme-layouts' + }, + { + id : 'customization.page-layouts', + title: 'Page layouts', + type : 'basic', + link : '/docs/guides/customization/page-layouts' + }, + { + id : 'customization.tailwindcss', + title: 'TailwindCSS', + type : 'basic', + link : '/docs/guides/customization/tailwindcss' + }, + { + id : 'customization.theming', + title: 'Theming', + type : 'basic', + link : '/docs/guides/customization/theming' + }, + { + id : 'customization.component-theming', + title: 'Component theming', + type : 'basic', + link : '/docs/guides/customization/component-theming' + }, + { + id : 'customization.splash-screen', + title: 'Splash screen', + type : 'basic', + link : '/docs/guides/customization/splash-screen' + } + ] + }, + { + id : 'authentication', + title : 'Authentication', + type : 'group', + children: [ + { + id : 'authentication.jwt', + title: 'JWT', + type : 'basic', + link : '/docs/guides/authentication/jwt' + } + ] + } + ]; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media query change + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('md') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/docs/guides/guides.module.ts b/src/app/modules/admin/docs/guides/guides.module.ts new file mode 100644 index 00000000..c4d9c2dc --- /dev/null +++ b/src/app/modules/admin/docs/guides/guides.module.ts @@ -0,0 +1,66 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTreeModule } from '@angular/material/tree'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { FuseScrollResetModule } from '@fuse/directives/scroll-reset'; +import { SharedModule } from 'app/shared/shared.module'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; +import { IntroductionComponent } from 'app/modules/admin/docs/guides/getting-started/introduction/introduction'; +import { PrerequisitesComponent } from 'app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites'; +import { InstallationComponent } from 'app/modules/admin/docs/guides/getting-started/installation/installation'; +import { ServingComponent } from 'app/modules/admin/docs/guides/getting-started/serving/serving'; +import { DirectoryStructureComponent } from 'app/modules/admin/docs/guides/development/directory-structure/directory-structure'; +import { ComponentStructureComponent } from 'app/modules/admin/docs/guides/development/component-structure/component-structure'; +import { StarterKitComponent } from 'app/modules/admin/docs/guides/development/starter-kit/starter-kit'; +import { DeploymentComponent } from 'app/modules/admin/docs/guides/development/deployment/deployment'; +import { UpdatingComponent } from 'app/modules/admin/docs/guides/development/updating/updating'; +import { ThemeLayoutsComponent } from 'app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts'; +import { PageLayoutsComponent } from 'app/modules/admin/docs/guides/customization/page-layouts/page-layouts'; +import { TailwindCSSComponent } from 'app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss'; +import { ThemingComponent } from 'app/modules/admin/docs/guides/customization/theming/theming'; +import { ComponentThemingComponent } from 'app/modules/admin/docs/guides/customization/component-theming/component-theming'; +import { SplashScreenCustomizationComponent } from 'app/modules/admin/docs/guides/customization/splash-screen/splash-screen'; +import { JwtComponent } from 'app/modules/admin/docs/guides/authentication/jwt/jwt'; +import { guidesRoutes } from 'app/modules/admin/docs/guides/guides.routing'; + +@NgModule({ + declarations: [ + GuidesComponent, + IntroductionComponent, + PrerequisitesComponent, + InstallationComponent, + ServingComponent, + DirectoryStructureComponent, + ComponentStructureComponent, + StarterKitComponent, + DeploymentComponent, + UpdatingComponent, + ThemeLayoutsComponent, + PageLayoutsComponent, + TailwindCSSComponent, + ThemingComponent, + ComponentThemingComponent, + SplashScreenCustomizationComponent, + JwtComponent + ], + imports : [ + RouterModule.forChild(guidesRoutes), + MatButtonModule, + MatIconModule, + MatSidenavModule, + MatTreeModule, + FuseHighlightModule, + FuseAlertModule, + FuseNavigationModule, + FuseScrollResetModule, + SharedModule + ] +}) +export class GuidesModule +{ +} diff --git a/src/app/modules/admin/docs/guides/guides.routing.ts b/src/app/modules/admin/docs/guides/guides.routing.ts new file mode 100644 index 00000000..a9fc313b --- /dev/null +++ b/src/app/modules/admin/docs/guides/guides.routing.ts @@ -0,0 +1,136 @@ +import { Route } from '@angular/router'; +import { GuidesComponent } from 'app/modules/admin/docs/guides/guides.component'; +import { IntroductionComponent } from 'app/modules/admin/docs/guides/getting-started/introduction/introduction'; +import { PrerequisitesComponent } from 'app/modules/admin/docs/guides/getting-started/prerequisites/prerequisites'; +import { InstallationComponent } from 'app/modules/admin/docs/guides/getting-started/installation/installation'; +import { ServingComponent } from 'app/modules/admin/docs/guides/getting-started/serving/serving'; +import { DirectoryStructureComponent } from 'app/modules/admin/docs/guides/development/directory-structure/directory-structure'; +import { ComponentStructureComponent } from 'app/modules/admin/docs/guides/development/component-structure/component-structure'; +import { StarterKitComponent } from 'app/modules/admin/docs/guides/development/starter-kit/starter-kit'; +import { DeploymentComponent } from 'app/modules/admin/docs/guides/development/deployment/deployment'; +import { UpdatingComponent } from 'app/modules/admin/docs/guides/development/updating/updating'; +import { ThemeLayoutsComponent } from 'app/modules/admin/docs/guides/customization/theme-layouts/theme-layouts'; +import { PageLayoutsComponent } from 'app/modules/admin/docs/guides/customization/page-layouts/page-layouts'; +import { TailwindCSSComponent } from 'app/modules/admin/docs/guides/customization/tailwindcss/tailwindcss'; +import { ThemingComponent } from 'app/modules/admin/docs/guides/customization/theming/theming'; +import { ComponentThemingComponent } from 'app/modules/admin/docs/guides/customization/component-theming/component-theming'; +import { SplashScreenCustomizationComponent } from 'app/modules/admin/docs/guides/customization/splash-screen/splash-screen'; +import { JwtComponent } from 'app/modules/admin/docs/guides/authentication/jwt/jwt'; + +export const guidesRoutes: Route[] = [ + { + path : '', + component: GuidesComponent, + children : [ + { + path : '', + pathMatch : 'full', + redirectTo: 'getting-started' + }, + { + path : 'getting-started', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'introduction' + }, + { + path : 'introduction', + component: IntroductionComponent + }, + { + path : 'prerequisites', + component: PrerequisitesComponent + }, + { + path : 'installation', + component: InstallationComponent + }, + { + path : 'serving', + component: ServingComponent + } + ] + }, + { + path : 'development', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'structure' + }, + { + path : 'directory-structure', + component: DirectoryStructureComponent + }, + { + path : 'component-structure', + component: ComponentStructureComponent + }, + { + path : 'starter-kit', + component: StarterKitComponent + }, + { + path : 'deployment', + component: DeploymentComponent + }, + { + path : 'updating', + component: UpdatingComponent + } + ] + }, + { + path : 'customization', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'theme-layouts' + }, + { + path : 'theme-layouts', + component: ThemeLayoutsComponent + }, + { + path : 'page-layouts', + component: PageLayoutsComponent + }, + { + path : 'tailwindcss', + component: TailwindCSSComponent + }, + { + path : 'theming', + component: ThemingComponent + }, + { + path : 'component-theming', + component: ComponentThemingComponent + }, + { + path : 'splash-screen', + component: SplashScreenCustomizationComponent + } + ] + }, + { + path : 'authentication', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'jwt' + }, + { + path : 'jwt', + component: JwtComponent + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/docs/other-components/common/messages/messages.component.html b/src/app/modules/admin/docs/other-components/common/messages/messages.component.html new file mode 100644 index 00000000..51cc7ba7 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/messages/messages.component.html @@ -0,0 +1,229 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ Messages +

+
+
+ +
+ +
+ +

+ This component can be used to show latest messages in a custom made panel. These messages can be either system wide messages or messages that sent to the currently + logged in user from other users. +

+

+ It has some basic features including +

+
    +
  • marking all messages as read
  • +
  • marking individual messages as read
  • +
  • removing individual messages from the list
  • +
+ +

Usage

+

+ The component only has one input to supply the messages: +

+ + +

Message

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+
id
+
+ Unique id of the message. +
+
icon
+
+ Icon name for the message. +
+
image
+
+ Image for the message. +
+
title
+
+ Title of the message. +
+
description
+
+ Description of the message. +
+
time
+
+ String representation of the time of the message (like ISO string). +
+
link
+
+ Link of the message. +
+
useRouter
+
+ Whether to use the Router to parse the link. +
+
read
+
+ Whether the message marked as read. +
+
+ +

Messages Service

+

+ The MessagesService can be used to control the messages outside of the Messages component. This is particularly useful to control the + messages from other components for actions like creating, updating or deleting them. +

+ +

Methods

+

+ Here's the list of all available methods from MessagesService: +

+
+
+ messages$: Observable<Message[]> +
+
+ Getter for messages. +
+
+
+
+ store(messages: Message[]) +
+
+ Store messages on the service. This will replace the current messages and can be used as an alternative to messages input of the + component. +
+
+
+
+ create(message: Message): Observable<Messages> +
+
+ Create a new message on the server. +
+
+
+
+ update(id: string, message: Message): Observable<Message> +
+
+ Update the message on the server. +
+
+
+
+ delete(id: string): Observable<boolean> +
+
+ Delete the message on the server. +
+
+
+
+ markAllAsRead(): Observable<boolean> +
+
+ Mark all messages as read. +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/messages/messages.component.ts b/src/app/modules/admin/docs/other-components/common/messages/messages.component.ts new file mode 100644 index 00000000..a013450d --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/messages/messages.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'messages', + templateUrl: './messages.component.html', + styles : [''] +}) +export class MessagesComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.html b/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.html new file mode 100644 index 00000000..6986ed7c --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.html @@ -0,0 +1,229 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ Notifications +

+
+
+ +
+ +
+ +

+ This component can be used to show latest notifications in a custom made panel. These notifications can be either system wide or applications that sent to the + currently logged in user from other users. +

+

+ It has some basic features including +

+
    +
  • marking all notification as read
  • +
  • marking individual notifications as read
  • +
  • removing individual notifications from the list
  • +
+ +

Usage

+

+ The component only has one input to supply the notifications: +

+ + +

Notification

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+
id
+
+ Unique id of the notification. +
+
icon
+
+ Icon name for the notification. +
+
image
+
+ Image for the notification. +
+
title
+
+ Title of the notification. +
+
description
+
+ Description of the notification. +
+
time
+
+ String representation of the time of the notification (like ISO string). +
+
link
+
+ Link of the notification. +
+
useRouter
+
+ Whether to use the Router to parse the link. +
+
read
+
+ Whether the notification marked as read. +
+
+ +

Notifications Service

+

+ The NotificationsService can be used to control the notifications outside of the Notifications component. This is particularly useful + to control the notifications from other components for actions like creating, updating or deleting them. +

+ +

Methods

+

+ Here's the list of all available methods from NotificationsService: +

+
+
+ notifications$: Observable<Notification[]> +
+
+ Getter for notifications. +
+
+
+
+ store(notifications: Notification[]) +
+
+ Store notifications on the service. This will replace the current notifications and can be used as an alternative to notifications input of the + component. +
+
+
+
+ create(notification: Notification): Observable<Notifications> +
+
+ Create a new notification on the server. +
+
+
+
+ update(id: string, notification: Notification): Observable<Notification> +
+
+ Update the notification on the server. +
+
+
+
+ delete(id: string): Observable<boolean> +
+
+ Delete the notification on the server. +
+
+
+
+ markAllAsRead(): Observable<boolean> +
+
+ Mark all notifications as read. +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.ts b/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.ts new file mode 100644 index 00000000..7c7d32f1 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/notifications/notifications.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'notifications', + templateUrl: './notifications.component.html', + styles : [''] +}) +export class NotificationsComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/common/overview/overview.component.html b/src/app/modules/admin/docs/other-components/common/overview/overview.component.html new file mode 100644 index 00000000..045af4c2 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/overview/overview.component.html @@ -0,0 +1,86 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ Overview +

+
+
+ +
+ +
+ +

+ Common components are custom made components that could require heavy modifications depending on the project. These components are mostly related with the layout + therefore they are located in the src/app/layout/common/ directory. You can modify them without touching the @fuse directory. +

+ + These components are not very complex and they only provide some basic features. If you wish them to do more, you have to customize them, and that's exactly why + they are not located in the @fuse directory like other components. + + + We may add more features and more custom components in the future if they will be beneficial for everyone. Components that are too specific to a project won't be + included as custom components into Fuse! + +

+ Currently, there are five common components; +

+
    +
  • +

    Messages

    +

    A panel to show latest messages.

    +
  • +
  • +

    Notifications

    +

    A panel to show latest notifications.

    +
  • +
  • +

    Search

    +

    An autocomplete search box with proper API endpoint setup.

    +
  • +
  • +

    Shortcuts

    +

    A user customizable panel to show shortcuts to internal/external pages.

    +
  • +
  • +

    User Menu

    +

    A user avatar and menu component to show user related information and actions.

    +
  • +
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/overview/overview.component.ts b/src/app/modules/admin/docs/other-components/common/overview/overview.component.ts new file mode 100644 index 00000000..2a34e7f3 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/overview/overview.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'overview', + templateUrl: './overview.component.html', + styles : [''] +}) +export class OverviewComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/common/search/search.component.html b/src/app/modules/admin/docs/other-components/common/search/search.component.html new file mode 100644 index 00000000..56a79ec7 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/search/search.component.html @@ -0,0 +1,122 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ Search +

+
+
+ +
+ +
+ +

+ This component can be used for searching. It will make API calls as you start typing the search query into the search field and show the results in the + Autocomplete panel. +

+ +

Usage

+

+ Here's the basic usage of the component: +

+ + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
appearance: 'basic' | 'bar'
+
+ Appearance of the search. basic will show a simple search field. bar will show a dropdown bar that covers the + header. + + bar +
+
@Input()
+
debounce: number
+
+ Number of milliseconds to debounce the API calls. + + 300 +
+
@Input()
+
minLength: number
+
+ Minimum length of the search value required before making API calls. + + 2 +
+
@Output()
+
search: EventEmitter
+
+ An event emitted after search happened. + + - +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/search/search.component.ts b/src/app/modules/admin/docs/other-components/common/search/search.component.ts new file mode 100644 index 00000000..8fc1b0fe --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/search/search.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'search', + templateUrl: './search.component.html', + styles : [''] +}) +export class SearchComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.html b/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.html new file mode 100644 index 00000000..b07ae59d --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.html @@ -0,0 +1,186 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ Shortcuts +

+
+
+ +
+ +
+ +

+ This component can be used to show shortcuts to applications, pages or external sources. It can be controlled by the user and any changes will be persisted to the + backend if setup correctly. +

+ +

Usage

+

+ The component only has one input to supply the shortcuts: +

+ + +

Message

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
+
id
+
+ Unique id of the shortcut. +
+
label
+
+ Label of the shortcut. +
+
description
+
+ Description of the shortcut. +
+
icon
+
+ Icon name for the shortcut. +
+
link
+
+ Link of the shortcut. +
+
useRouter
+
+ Whether to use the Router to parse the link. +
+
+ +

Shortcuts Service

+

+ The ShortcutsService can be used to control the shortcuts outside of the Shortcuts component. This is particularly useful to control + the shortcuts from other components for actions like creating, updating or deleting them. +

+ +

Methods

+

+ Here's the list of all available methods from ShortcutsService: +

+
+
+ shortcuts$: Observable<Shortcut[]> +
+
+ Getter for shortcuts. +
+
+
+
+ store(shortcuts: Shortcut[]) +
+
+ Store shortcuts on the service. This will replace the current shortcuts and can be used as an alternative to shortcuts input of the + component. +
+
+
+
+ create(shortcut: Shortcut): Observable<Shortcuts> +
+
+ Create a new shortcut on the server. +
+
+
+
+ update(id: string, shortcut: Shortcut): Observable<Shortcut> +
+
+ Update the shortcut on the server. +
+
+
+
+ delete(id: string): Observable<boolean> +
+
+ Delete the shortcut on the server. +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.ts b/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.ts new file mode 100644 index 00000000..7303f7d6 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'shortcuts', + templateUrl: './shortcuts.component.html', + styles : [''] +}) +export class ShortcutsComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.html b/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.html new file mode 100644 index 00000000..751a6046 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.html @@ -0,0 +1,96 @@ +
+ + +
+
+ +
+ + +
+ + Common +
+
+ +
+

+ User Menu +

+
+
+ +
+ +
+ +

+ This component can be used for showing information and actions related to the currently logged in user. +

+ +

Usage

+

+ Here's the basic usage of the component: +

+ + +

Properties

+
+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionDefault
+
@Input()
+
showAvatar: boolean
+
+ Whether to show avatar of the user. If set to false, a generic icon will be shown. + + true +
+
@Input()
+
user: User
+
+ The user data. + + - +
+
+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.ts b/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.ts new file mode 100644 index 00000000..5b1cd108 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/common/user-menu/user-menu.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'user-menu', + templateUrl: './user-menu.component.html', + styles : [''] +}) +export class UserMenuComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/other-components.component.html b/src/app/modules/admin/docs/other-components/other-components.component.html new file mode 100644 index 00000000..1f63e296 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/other-components.component.html @@ -0,0 +1,38 @@ +
+ + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ + diff --git a/src/app/modules/admin/docs/other-components/other-components.component.scss b/src/app/modules/admin/docs/other-components/other-components.component.scss new file mode 100644 index 00000000..770127c2 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/other-components.component.scss @@ -0,0 +1,9 @@ +other-components { + + fuse-vertical-navigation { + + .fuse-vertical-navigation-wrapper { + box-shadow: none !important; + } + } +} diff --git a/src/app/modules/admin/docs/other-components/other-components.component.ts b/src/app/modules/admin/docs/other-components/other-components.component.ts new file mode 100644 index 00000000..5347a3ee --- /dev/null +++ b/src/app/modules/admin/docs/other-components/other-components.component.ts @@ -0,0 +1,155 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { MatDrawer } from '@angular/material/sidenav'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseNavigationItem } from '@fuse/components/navigation'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'other-components', + templateUrl : './other-components.component.html', + styleUrls : ['./other-components.component.scss'], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class OtherComponentsComponent implements OnInit, OnDestroy +{ + @ViewChild('matDrawer', {static: true}) matDrawer: MatDrawer; + drawerMode: 'side' | 'over'; + drawerOpened: boolean; + menuData: FuseNavigationItem[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseMediaWatcherService: FuseMediaWatcherService + ) + { + this.menuData = [ + { + id : 'common', + title : 'Common', + subtitle: 'Custom made high-level components', + type : 'group', + children: [ + { + id : 'common.overview', + title: 'Overview', + type : 'basic', + link : '/docs/other-components/common/overview' + }, + { + id : 'common.messages', + title: 'Messages', + type : 'basic', + link : '/docs/other-components/common/messages' + }, + { + id : 'common.notifications', + title: 'Notifications', + type : 'basic', + link : '/docs/other-components/common/notifications' + }, + { + id : 'common.search', + title: 'Search', + type : 'basic', + link : '/docs/other-components/common/search' + }, + { + id : 'common.shortcuts', + title: 'Shortcuts', + type : 'basic', + link : '/docs/other-components/common/shortcuts' + }, + { + id : 'common.user', + title: 'User', + type : 'basic', + link : '/docs/other-components/common/user' + } + ] + }, + { + id : 'divider-1', + type: 'divider' + }, + { + id : 'third-party', + title : 'Third party', + subtitle: 'Supported components', + type : 'group', + children: [ + { + id : 'third-party.apex-charts', + title: 'ApexCharts', + type : 'basic', + link : '/docs/other-components/third-party/apex-charts' + }, + { + id : 'third-party.full-calendar', + title: 'FullCalendar', + type : 'basic', + link : '/docs/other-components/third-party/full-calendar' + }, + { + id : 'third-party.ngx-markdown', + title: 'ngx-markdown', + type : 'basic', + link : '/docs/other-components/third-party/ngx-markdown' + }, + { + id : 'third-party.quill-editor', + title: 'Quill editor', + type : 'basic', + link : '/docs/other-components/third-party/quill-editor' + } + ] + } + ]; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media query change + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('md') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/docs/other-components/other-components.module.ts b/src/app/modules/admin/docs/other-components/other-components.module.ts new file mode 100644 index 00000000..35444dab --- /dev/null +++ b/src/app/modules/admin/docs/other-components/other-components.module.ts @@ -0,0 +1,50 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { FuseNavigationModule } from '@fuse/components/navigation'; +import { FuseScrollResetModule } from '@fuse/directives/scroll-reset'; +import { SharedModule } from 'app/shared/shared.module'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; +import { OverviewComponent } from 'app/modules/admin/docs/other-components/common/overview/overview.component'; +import { MessagesComponent } from 'app/modules/admin/docs/other-components/common/messages/messages.component'; +import { NotificationsComponent } from 'app/modules/admin/docs/other-components/common/notifications/notifications.component'; +import { SearchComponent } from 'app/modules/admin/docs/other-components/common/search/search.component'; +import { ShortcutsComponent } from 'app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component'; +import { UserMenuComponent } from 'app/modules/admin/docs/other-components/common/user-menu/user-menu.component'; +import { ApexChartsComponent } from 'app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component'; +import { FullCalendarComponent } from 'app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component'; +import { NgxMarkdownComponent } from 'app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component'; +import { QuillEditorComponent } from 'app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component'; +import { otherComponentsRoutes } from 'app/modules/admin/docs/other-components/other-components.routing'; + +@NgModule({ + declarations: [ + OtherComponentsComponent, + OverviewComponent, + MessagesComponent, + NotificationsComponent, + SearchComponent, + ShortcutsComponent, + UserMenuComponent, + ApexChartsComponent, + FullCalendarComponent, + NgxMarkdownComponent, + QuillEditorComponent + ], + imports : [ + RouterModule.forChild(otherComponentsRoutes), + MatIconModule, + MatSidenavModule, + FuseHighlightModule, + FuseAlertModule, + FuseNavigationModule, + FuseScrollResetModule, + SharedModule + ] +}) +export class OtherComponentsModule +{ +} diff --git a/src/app/modules/admin/docs/other-components/other-components.routing.ts b/src/app/modules/admin/docs/other-components/other-components.routing.ts new file mode 100644 index 00000000..2a64c2ad --- /dev/null +++ b/src/app/modules/admin/docs/other-components/other-components.routing.ts @@ -0,0 +1,86 @@ +import { Route } from '@angular/router'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; +import { OverviewComponent } from 'app/modules/admin/docs/other-components/common/overview/overview.component'; +import { MessagesComponent } from 'app/modules/admin/docs/other-components/common/messages/messages.component'; +import { NotificationsComponent } from 'app/modules/admin/docs/other-components/common/notifications/notifications.component'; +import { SearchComponent } from 'app/modules/admin/docs/other-components/common/search/search.component'; +import { ShortcutsComponent } from 'app/modules/admin/docs/other-components/common/shortcuts/shortcuts.component'; +import { UserMenuComponent } from 'app/modules/admin/docs/other-components/common/user-menu/user-menu.component'; +import { ApexChartsComponent } from 'app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component'; +import { FullCalendarComponent } from 'app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component'; +import { NgxMarkdownComponent } from 'app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component'; +import { QuillEditorComponent } from 'app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component'; + +export const otherComponentsRoutes: Route[] = [ + { + path : '', + component: OtherComponentsComponent, + children : [ + { + path : '', + pathMatch : 'full', + redirectTo: 'common/overview' + }, + { + path : 'common', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: OverviewComponent + }, + { + path : 'messages', + component: MessagesComponent + }, + { + path : 'notifications', + component: NotificationsComponent + }, + { + path : 'search', + component: SearchComponent + }, + { + path : 'shortcuts', + component: ShortcutsComponent + }, + { + path : 'user', + component: UserMenuComponent + } + ] + }, + { + path : 'third-party', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'apex-charts' + }, + { + path : 'apex-charts', + component: ApexChartsComponent + }, + { + path : 'full-calendar', + component: FullCalendarComponent + }, + { + path : 'ngx-markdown', + component: NgxMarkdownComponent + }, + { + path : 'quill-editor', + component: QuillEditorComponent + } + ] + } + ] + } +]; diff --git a/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.html b/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.html new file mode 100644 index 00000000..3ac33298 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.html @@ -0,0 +1,61 @@ +
+ + +
+
+ +
+ + +
+ + Third Party +
+
+ +
+

+ Apex Charts +

+
+
+ +
+ +
+ +

+ ApexCharts + + is a modern and interactive open-source charts library. Fuse supports ApexCharts through official + ng-apexcharts + + component. +

+

+ All charts in the Demo app built using ApexCharts. +

+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.ts b/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.ts new file mode 100644 index 00000000..e5d91eae --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/apex-charts/apex-charts.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'apex-charts', + templateUrl: './apex-charts.component.html', + styles : [''] +}) +export class ApexChartsComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.html b/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.html new file mode 100644 index 00000000..cb4e8f52 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.html @@ -0,0 +1,61 @@ +
+ + +
+
+ +
+ + +
+ + Third Party +
+
+ +
+

+ FullCalendar +

+
+
+ +
+ +
+ +

+ FullCalendar + + is the most popular full-sized Javascript calendar library. Fuse supports FullCalendar through official + fullcalendar-angular + + component. +

+

+ The Calendar demo application is built using FullCalendar. +

+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.ts b/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.ts new file mode 100644 index 00000000..90a127e4 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/full-calendar/full-calendar.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'full-calendar', + templateUrl: './full-calendar.component.html', + styles : [''] +}) +export class FullCalendarComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.html b/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.html new file mode 100644 index 00000000..59eada1d --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.html @@ -0,0 +1,52 @@ +
+ + +
+
+ +
+ + +
+ + Third Party +
+
+ +
+

+ ngxMarkdown +

+
+
+ +
+ +
+ +

+ ngxMarkdown + + is an Angular markdown component/directive/pipe/service to parse static, dynamic or remote content to html with syntax highlight. +

+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.ts b/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.ts new file mode 100644 index 00000000..23b64e63 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/ngx-markdown/ngx-markdown.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'ngx-markdown', + templateUrl: './ngx-markdown.component.html', + styles : [''] +}) +export class NgxMarkdownComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.html b/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.html new file mode 100644 index 00000000..df7bf6b2 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.html @@ -0,0 +1,61 @@ +
+ + +
+
+ +
+ + +
+ + Third Party +
+
+ +
+

+ Quill Editor +

+
+
+ +
+ +
+ +

+ Quill + + is a free, open source WYSIWYG editor built for the modern web. Fuse supports Quill editor through + ngx-quill + + component. +

+

+ The Compose dialog from Mail app includes the Quill editor. +

+ +
+ +
diff --git a/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.ts b/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.ts new file mode 100644 index 00000000..3f66e244 --- /dev/null +++ b/src/app/modules/admin/docs/other-components/third-party/quill-editor/quill-editor.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { OtherComponentsComponent } from 'app/modules/admin/docs/other-components/other-components.component'; + +@Component({ + selector : 'quill-editor', + templateUrl: './quill-editor.component.html', + styles : [''] +}) +export class QuillEditorComponent +{ + /** + * Constructor + */ + constructor(private _otherComponentsComponent: OtherComponentsComponent) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the drawer + */ + toggleDrawer(): void + { + // Toggle the drawer + this._otherComponentsComponent.matDrawer.toggle(); + } +} diff --git a/src/app/modules/admin/pages/authentication/authentication.module.ts b/src/app/modules/admin/pages/authentication/authentication.module.ts new file mode 100644 index 00000000..7443448a --- /dev/null +++ b/src/app/modules/admin/pages/authentication/authentication.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { SignInModule } from 'app/modules/admin/pages/authentication/sign-in/sign-in.module'; +import { SignUpModule } from 'app/modules/admin/pages/authentication/sign-up/sign-up.module'; +import { SignOutModule } from 'app/modules/admin/pages/authentication/sign-out/sign-out.module'; +import { ForgotPasswordModule } from 'app/modules/admin/pages/authentication/forgot-password/forgot-password.module'; +import { ResetPasswordModule } from 'app/modules/admin/pages/authentication/reset-password/reset-password.module'; +import { UnlockSessionModule } from 'app/modules/admin/pages/authentication/unlock-session/unlock-session.module'; +import { ConfirmationRequiredModule } from 'app/modules/admin/pages/authentication/confirmation-required/confirmation-required.module'; + +@NgModule({ + imports: [ + SignInModule, + SignUpModule, + SignOutModule, + ForgotPasswordModule, + ResetPasswordModule, + UnlockSessionModule, + ConfirmationRequiredModule + ], + exports: [ + SignInModule, + SignUpModule, + SignOutModule, + ForgotPasswordModule, + ResetPasswordModule, + UnlockSessionModule, + ConfirmationRequiredModule + ] +}) +export class AuthenticationModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.html new file mode 100644 index 00000000..9000aca6 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.html @@ -0,0 +1,26 @@ +
+
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.ts new file mode 100644 index 00000000..c17d3d33 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-classic', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredClassicComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/confirmation-required.module.ts b/src/app/modules/admin/pages/authentication/confirmation-required/confirmation-required.module.ts new file mode 100644 index 00000000..b9d6b69e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/confirmation-required.module.ts @@ -0,0 +1,75 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { ConfirmationRequiredClassicComponent } from 'app/modules/admin/pages/authentication/confirmation-required/classic/confirmation-required.component'; +import { ConfirmationRequiredModernComponent } from 'app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component'; +import { ConfirmationRequiredModernReversedComponent } from 'app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component'; +import { ConfirmationRequiredFullscreenComponent } from 'app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component'; +import { ConfirmationRequiredFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component'; +import { ConfirmationRequiredSplitScreenComponent } from 'app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component'; +import { ConfirmationRequiredSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component'; + +const routes: Routes = [ + { + path : 'confirmation-required', + children: [ + { + path : 'classic', + component: ConfirmationRequiredClassicComponent + }, + { + path : 'modern', + component: ConfirmationRequiredModernComponent + }, + { + path : 'modern-reversed', + component: ConfirmationRequiredModernReversedComponent + }, + { + path : 'split-screen', + component: ConfirmationRequiredSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: ConfirmationRequiredSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: ConfirmationRequiredFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: ConfirmationRequiredFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + ConfirmationRequiredClassicComponent, + ConfirmationRequiredModernComponent, + ConfirmationRequiredModernReversedComponent, + ConfirmationRequiredFullscreenComponent, + ConfirmationRequiredFullscreenReversedComponent, + ConfirmationRequiredSplitScreenComponent, + ConfirmationRequiredSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class ConfirmationRequiredModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.html new file mode 100644 index 00000000..c0fdf2d5 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.html @@ -0,0 +1,76 @@ +
+ +
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.ts new file mode 100644 index 00000000..0236d451 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen-reversed/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-fullscreen-reversed', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredFullscreenReversedComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.html new file mode 100644 index 00000000..fc2b051e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.html @@ -0,0 +1,76 @@ +
+
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.ts new file mode 100644 index 00000000..f703a19d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/fullscreen/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-fullscreen', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredFullscreenComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.html new file mode 100644 index 00000000..000a9538 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.html @@ -0,0 +1,78 @@ +
+
+ +
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.ts new file mode 100644 index 00000000..99b2cb9d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/modern-reversed/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-modern-reversed', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredModernReversedComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.html new file mode 100644 index 00000000..dd4e0830 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.html @@ -0,0 +1,78 @@ +
+
+
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.ts new file mode 100644 index 00000000..56cee33a --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/modern/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-modern', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredModernComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.html new file mode 100644 index 00000000..a263337d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.html @@ -0,0 +1,76 @@ +
+ +
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.ts new file mode 100644 index 00000000..2711c925 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen-reversed/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-split-screen-reversed', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredSplitScreenReversedComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.html b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.html new file mode 100644 index 00000000..82aca84f --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.html @@ -0,0 +1,76 @@ +
+
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.ts b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.ts new file mode 100644 index 00000000..a0baad7b --- /dev/null +++ b/src/app/modules/admin/pages/authentication/confirmation-required/split-screen/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'confirmation-required-split-screen', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ConfirmationRequiredSplitScreenComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.html new file mode 100644 index 00000000..f74f04d8 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.html @@ -0,0 +1,73 @@ +
+
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.ts new file mode 100644 index 00000000..b709dd2f --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-classic', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordClassicComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/forgot-password.module.ts b/src/app/modules/admin/pages/authentication/forgot-password/forgot-password.module.ts new file mode 100644 index 00000000..d9b7c169 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/forgot-password.module.ts @@ -0,0 +1,75 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { ForgotPasswordClassicComponent } from 'app/modules/admin/pages/authentication/forgot-password/classic/forgot-password.component'; +import { ForgotPasswordModernComponent } from 'app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component'; +import { ForgotPasswordModernReversedComponent } from 'app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component'; +import { ForgotPasswordFullscreenComponent } from 'app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component'; +import { ForgotPasswordFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component'; +import { ForgotPasswordSplitScreenComponent } from 'app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component'; +import { ForgotPasswordSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component'; + +const routes: Routes = [ + { + path : 'forgot-password', + children: [ + { + path : 'classic', + component: ForgotPasswordClassicComponent + }, + { + path : 'modern', + component: ForgotPasswordModernComponent + }, + { + path : 'modern-reversed', + component: ForgotPasswordModernReversedComponent + }, + { + path : 'split-screen', + component: ForgotPasswordSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: ForgotPasswordSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: ForgotPasswordFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: ForgotPasswordFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + ForgotPasswordClassicComponent, + ForgotPasswordModernComponent, + ForgotPasswordModernReversedComponent, + ForgotPasswordFullscreenComponent, + ForgotPasswordFullscreenReversedComponent, + ForgotPasswordSplitScreenComponent, + ForgotPasswordSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class ForgotPasswordModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.html new file mode 100644 index 00000000..a3e73210 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.html @@ -0,0 +1,123 @@ +
+ +
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.ts new file mode 100644 index 00000000..a604768a --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen-reversed/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-fullscreen-reversed', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordFullscreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.html new file mode 100644 index 00000000..99f95986 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.html @@ -0,0 +1,123 @@ +
+
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.ts new file mode 100644 index 00000000..eca52b3c --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/fullscreen/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-fullscreen', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordFullscreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.html new file mode 100644 index 00000000..469defc3 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.html @@ -0,0 +1,125 @@ +
+
+ +
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.ts new file mode 100644 index 00000000..48d12a5f --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/modern-reversed/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-modern-reversed', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordModernReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.html new file mode 100644 index 00000000..4012fc85 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.html @@ -0,0 +1,125 @@ +
+
+
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.ts new file mode 100644 index 00000000..788d122e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/modern/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-modern', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordModernComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.html new file mode 100644 index 00000000..e619dd12 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.html @@ -0,0 +1,123 @@ +
+ +
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.ts new file mode 100644 index 00000000..4daaab5b --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/split-screen-reversed/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-split-screen-reversed', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordSplitScreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.html b/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.html new file mode 100644 index 00000000..4137a1c4 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.html @@ -0,0 +1,123 @@ +
+
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.ts b/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.ts new file mode 100644 index 00000000..0cf4abd9 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/forgot-password/split-screen/forgot-password.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'forgot-password-split-screen', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ForgotPasswordSplitScreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.html new file mode 100644 index 00000000..7e1beff8 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.html @@ -0,0 +1,117 @@ +
+
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.ts new file mode 100644 index 00000000..ed72d6ee --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/classic/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-classic', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordClassicComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.html new file mode 100644 index 00000000..e9544c3c --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.html @@ -0,0 +1,167 @@ +
+ +
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.ts new file mode 100644 index 00000000..7e21179c --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-fullscreen-reversed', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordFullscreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.html new file mode 100644 index 00000000..980cd2e4 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.html @@ -0,0 +1,167 @@ +
+
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.ts new file mode 100644 index 00000000..54ee9819 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-fullscreen', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordFullscreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.html new file mode 100644 index 00000000..e834288e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.html @@ -0,0 +1,169 @@ +
+
+ +
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.ts new file mode 100644 index 00000000..ec98c029 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-modern-reversed', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordModernReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.html new file mode 100644 index 00000000..7dc22232 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.html @@ -0,0 +1,169 @@ +
+
+
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.ts new file mode 100644 index 00000000..d68dec30 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/modern/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-modern', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordModernComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/reset-password.module.ts b/src/app/modules/admin/pages/authentication/reset-password/reset-password.module.ts new file mode 100644 index 00000000..9a3d7209 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/reset-password.module.ts @@ -0,0 +1,77 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { ResetPasswordClassicComponent } from 'app/modules/admin/pages/authentication/reset-password/classic/reset-password.component'; +import { ResetPasswordModernComponent } from 'app/modules/admin/pages/authentication/reset-password/modern/reset-password.component'; +import { ResetPasswordModernReversedComponent } from 'app/modules/admin/pages/authentication/reset-password/modern-reversed/reset-password.component'; +import { ResetPasswordFullscreenComponent } from 'app/modules/admin/pages/authentication/reset-password/fullscreen/reset-password.component'; +import { ResetPasswordFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/reset-password/fullscreen-reversed/reset-password.component'; +import { ResetPasswordSplitScreenComponent } from 'app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component'; +import { ResetPasswordSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component'; + +const routes: Routes = [ + { + path : 'reset-password', + children: [ + { + path : 'classic', + component: ResetPasswordClassicComponent + }, + { + path : 'modern', + component: ResetPasswordModernComponent + }, + { + path : 'modern-reversed', + component: ResetPasswordModernReversedComponent + }, + { + path : 'split-screen', + component: ResetPasswordSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: ResetPasswordSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: ResetPasswordFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: ResetPasswordFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + ResetPasswordClassicComponent, + ResetPasswordModernComponent, + ResetPasswordModernReversedComponent, + ResetPasswordFullscreenComponent, + ResetPasswordFullscreenReversedComponent, + ResetPasswordSplitScreenComponent, + ResetPasswordSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class ResetPasswordModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.html new file mode 100644 index 00000000..5ad41d0c --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.html @@ -0,0 +1,167 @@ +
+ +
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.ts new file mode 100644 index 00000000..c8e22498 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/split-screen-reversed/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-split-screen-reversed', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordSplitScreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.html b/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.html new file mode 100644 index 00000000..c424027c --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.html @@ -0,0 +1,167 @@ +
+
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.ts b/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.ts new file mode 100644 index 00000000..aeb38200 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/reset-password/split-screen/reset-password.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { FuseValidators } from '@fuse/validators'; + +@Component({ + selector : 'reset-password-split-screen', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ResetPasswordSplitScreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.html new file mode 100644 index 00000000..b3705f95 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.html @@ -0,0 +1,145 @@ +
+
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.ts new file mode 100644 index 00000000..fa674b81 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/classic/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-classic', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInClassicComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.html new file mode 100644 index 00000000..3d56820e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.html @@ -0,0 +1,195 @@ +
+ +
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.ts new file mode 100644 index 00000000..dc9ee74f --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-fullscreen-reversed', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInFullscreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.html new file mode 100644 index 00000000..c29522cf --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.html @@ -0,0 +1,195 @@ +
+
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.ts new file mode 100644 index 00000000..2db3388d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-fullscreen', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInFullscreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.html new file mode 100644 index 00000000..e4c4f088 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.html @@ -0,0 +1,197 @@ +
+
+ +
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.ts new file mode 100644 index 00000000..68bbf776 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-modern-reversed', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInModernReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.html new file mode 100644 index 00000000..ede32ff5 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.html @@ -0,0 +1,197 @@ +
+
+
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.ts new file mode 100644 index 00000000..47960970 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/modern/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-modern', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInModernComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/sign-in.module.ts b/src/app/modules/admin/pages/authentication/sign-in/sign-in.module.ts new file mode 100644 index 00000000..2da89574 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/sign-in.module.ts @@ -0,0 +1,79 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { SignInClassicComponent } from 'app/modules/admin/pages/authentication/sign-in/classic/sign-in.component'; +import { SignInModernComponent } from 'app/modules/admin/pages/authentication/sign-in/modern/sign-in.component'; +import { SignInModernReversedComponent } from 'app/modules/admin/pages/authentication/sign-in/modern-reversed/sign-in.component'; +import { SignInFullscreenComponent } from 'app/modules/admin/pages/authentication/sign-in/fullscreen/sign-in.component'; +import { SignInFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-in/fullscreen-reversed/sign-in.component'; +import { SignInSplitScreenComponent } from 'app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component'; +import { SignInSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component'; + +const routes: Routes = [ + { + path : 'sign-in', + children: [ + { + path : 'classic', + component: SignInClassicComponent + }, + { + path : 'modern', + component: SignInModernComponent + }, + { + path : 'modern-reversed', + component: SignInModernReversedComponent + }, + { + path : 'split-screen', + component: SignInSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: SignInSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: SignInFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: SignInFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + SignInClassicComponent, + SignInModernComponent, + SignInModernReversedComponent, + SignInFullscreenComponent, + SignInFullscreenReversedComponent, + SignInSplitScreenComponent, + SignInSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class SignInModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.html new file mode 100644 index 00000000..a7440482 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.html @@ -0,0 +1,195 @@ +
+ +
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.ts new file mode 100644 index 00000000..8c0cabc5 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/split-screen-reversed/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-split-screen-reversed', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInSplitScreenReversedComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.html b/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.html new file mode 100644 index 00000000..4d787bba --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.html @@ -0,0 +1,195 @@ +
+
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.ts b/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.ts new file mode 100644 index 00000000..b4c63dc4 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-in/split-screen/sign-in.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-in-split-screen', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignInSplitScreenComponent implements OnInit +{ + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.html new file mode 100644 index 00000000..c89a67f5 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.html @@ -0,0 +1,33 @@ +
+
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.ts new file mode 100644 index 00000000..ce232574 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/classic/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-classic', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutClassicComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.html new file mode 100644 index 00000000..2e362995 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.html @@ -0,0 +1,83 @@ +
+ +
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.ts new file mode 100644 index 00000000..23fbba24 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-fullscreen-reversed', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutFullscreenReversedComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.html new file mode 100644 index 00000000..445f5087 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.html @@ -0,0 +1,83 @@ +
+
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.ts new file mode 100644 index 00000000..4ee090e2 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-fullscreen', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutFullscreenComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.html new file mode 100644 index 00000000..710acc56 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.html @@ -0,0 +1,85 @@ +
+
+ +
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.ts new file mode 100644 index 00000000..d5985cf7 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-modern-reversed', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutModernReversedComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.html new file mode 100644 index 00000000..c86c3dc4 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.html @@ -0,0 +1,85 @@ +
+
+
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.ts new file mode 100644 index 00000000..d6b0a70f --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/modern/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-modern', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutModernComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/sign-out.module.ts b/src/app/modules/admin/pages/authentication/sign-out/sign-out.module.ts new file mode 100644 index 00000000..d58f8c49 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/sign-out.module.ts @@ -0,0 +1,69 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { SharedModule } from 'app/shared/shared.module'; +import { SignOutClassicComponent } from 'app/modules/admin/pages/authentication/sign-out/classic/sign-out.component'; +import { SignOutModernComponent } from 'app/modules/admin/pages/authentication/sign-out/modern/sign-out.component'; +import { SignOutModernReversedComponent } from 'app/modules/admin/pages/authentication/sign-out/modern-reversed/sign-out.component'; +import { SignOutFullscreenComponent } from 'app/modules/admin/pages/authentication/sign-out/fullscreen/sign-out.component'; +import { SignOutFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-out/fullscreen-reversed/sign-out.component'; +import { SignOutSplitScreenComponent } from 'app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component'; +import { SignOutSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component'; + +const routes: Routes = [ + { + path : 'sign-out', + children: [ + { + path : 'classic', + component: SignOutClassicComponent + }, + { + path : 'modern', + component: SignOutModernComponent + }, + { + path : 'modern-reversed', + component: SignOutModernReversedComponent + }, + { + path : 'split-screen', + component: SignOutSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: SignOutSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: SignOutFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: SignOutFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + SignOutClassicComponent, + SignOutModernComponent, + SignOutModernReversedComponent, + SignOutFullscreenComponent, + SignOutFullscreenReversedComponent, + SignOutSplitScreenComponent, + SignOutSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatFormFieldModule, + MatInputModule, + SharedModule + ] +}) +export class SignOutModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.html new file mode 100644 index 00000000..3bf689e0 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.html @@ -0,0 +1,83 @@ +
+ +
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.ts new file mode 100644 index 00000000..8279c157 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/split-screen-reversed/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-split-screen-reversed', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutSplitScreenReversedComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.html b/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.html new file mode 100644 index 00000000..19e3de33 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.html @@ -0,0 +1,83 @@ +
+
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.ts b/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.ts new file mode 100644 index 00000000..13d99e8a --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-out/split-screen/sign-out.component.ts @@ -0,0 +1,29 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector : 'sign-out-split-screen', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignOutSplitScreenComponent +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.html new file mode 100644 index 00000000..c4b82d1b --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.html @@ -0,0 +1,136 @@ +
+
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.ts new file mode 100644 index 00000000..08c3e076 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/classic/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-classic', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpClassicComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.html new file mode 100644 index 00000000..b4c91707 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.html @@ -0,0 +1,186 @@ +
+ +
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.ts new file mode 100644 index 00000000..4e435aa6 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-fullscreen-reversed', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpFullscreenReversedComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.html new file mode 100644 index 00000000..87156d26 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.html @@ -0,0 +1,186 @@ +
+
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.ts new file mode 100644 index 00000000..a0b3f422 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-fullscreen', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpFullscreenComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.html new file mode 100644 index 00000000..7cabef80 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.html @@ -0,0 +1,188 @@ +
+
+ +
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.ts new file mode 100644 index 00000000..b8e3438e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-modern-reversed', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpModernReversedComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.html new file mode 100644 index 00000000..20613a96 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.html @@ -0,0 +1,188 @@ +
+
+
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.ts new file mode 100644 index 00000000..5e05ea70 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/modern/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-modern', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpModernComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/sign-up.module.ts b/src/app/modules/admin/pages/authentication/sign-up/sign-up.module.ts new file mode 100644 index 00000000..bea37358 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/sign-up.module.ts @@ -0,0 +1,79 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { SignUpClassicComponent } from 'app/modules/admin/pages/authentication/sign-up/classic/sign-up.component'; +import { SignUpModernComponent } from 'app/modules/admin/pages/authentication/sign-up/modern/sign-up.component'; +import { SignUpModernReversedComponent } from 'app/modules/admin/pages/authentication/sign-up/modern-reversed/sign-up.component'; +import { SignUpFullscreenComponent } from 'app/modules/admin/pages/authentication/sign-up/fullscreen/sign-up.component'; +import { SignUpFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-up/fullscreen-reversed/sign-up.component'; +import { SignUpSplitScreenComponent } from 'app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component'; +import { SignUpSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component'; + +const routes: Routes = [ + { + path : 'sign-up', + children: [ + { + path : 'classic', + component: SignUpClassicComponent + }, + { + path : 'modern', + component: SignUpModernComponent + }, + { + path : 'modern-reversed', + component: SignUpModernReversedComponent + }, + { + path : 'split-screen', + component: SignUpSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: SignUpSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: SignUpFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: SignUpFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + SignUpClassicComponent, + SignUpModernComponent, + SignUpModernReversedComponent, + SignUpFullscreenComponent, + SignUpFullscreenReversedComponent, + SignUpSplitScreenComponent, + SignUpSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class SignUpModule +{ +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.html new file mode 100644 index 00000000..8360abfd --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.html @@ -0,0 +1,186 @@ +
+ +
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.ts new file mode 100644 index 00000000..a5e765cf --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/split-screen-reversed/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-split-screen-reversed', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpSplitScreenReversedComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.html b/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.html new file mode 100644 index 00000000..bbe0904d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.html @@ -0,0 +1,186 @@ +
+
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.ts b/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.ts new file mode 100644 index 00000000..b6dbf8e6 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/sign-up/split-screen/sign-up.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'sign-up-split-screen', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class SignUpSplitScreenComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signUp(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.html new file mode 100644 index 00000000..9ceec621 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.html @@ -0,0 +1,94 @@ +
+
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.ts new file mode 100644 index 00000000..3ffa68f2 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-classic', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionClassicComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.html new file mode 100644 index 00000000..e8a42f59 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.html @@ -0,0 +1,144 @@ +
+ +
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.ts new file mode 100644 index 00000000..b61091ff --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-fullscreen-reversed', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionFullscreenReversedComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.html new file mode 100644 index 00000000..79413f3d --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.html @@ -0,0 +1,144 @@ +
+
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.ts new file mode 100644 index 00000000..f198b6da --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-fullscreen', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionFullscreenComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.html new file mode 100644 index 00000000..c7c64da1 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.html @@ -0,0 +1,146 @@ +
+
+ +
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.ts new file mode 100644 index 00000000..19878703 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-modern-reversed', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionModernReversedComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.html new file mode 100644 index 00000000..e982880e --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.html @@ -0,0 +1,146 @@ +
+
+
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.ts new file mode 100644 index 00000000..2feaab70 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-modern', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionModernComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.html new file mode 100644 index 00000000..9cc65ec7 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.html @@ -0,0 +1,144 @@ +
+ +
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.ts new file mode 100644 index 00000000..3a6d38ea --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-split-screen-reversed', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionSplitScreenReversedComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.html b/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.html new file mode 100644 index 00000000..520a99e8 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.html @@ -0,0 +1,144 @@ +
+
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.ts b/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.ts new file mode 100644 index 00000000..303d8061 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'unlock-session-split-screen', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class UnlockSessionSplitScreenComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string = 'Brian Hughes'; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + } +} diff --git a/src/app/modules/admin/pages/authentication/unlock-session/unlock-session.module.ts b/src/app/modules/admin/pages/authentication/unlock-session/unlock-session.module.ts new file mode 100644 index 00000000..812bd509 --- /dev/null +++ b/src/app/modules/admin/pages/authentication/unlock-session/unlock-session.module.ts @@ -0,0 +1,77 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { UnlockSessionClassicComponent } from 'app/modules/admin/pages/authentication/unlock-session/classic/unlock-session.component'; +import { UnlockSessionModernComponent } from 'app/modules/admin/pages/authentication/unlock-session/modern/unlock-session.component'; +import { UnlockSessionModernReversedComponent } from 'app/modules/admin/pages/authentication/unlock-session/modern-reversed/unlock-session.component'; +import { UnlockSessionFullscreenComponent } from 'app/modules/admin/pages/authentication/unlock-session/fullscreen/unlock-session.component'; +import { UnlockSessionFullscreenReversedComponent } from 'app/modules/admin/pages/authentication/unlock-session/fullscreen-reversed/unlock-session.component'; +import { UnlockSessionSplitScreenComponent } from 'app/modules/admin/pages/authentication/unlock-session/split-screen/unlock-session.component'; +import { UnlockSessionSplitScreenReversedComponent } from 'app/modules/admin/pages/authentication/unlock-session/split-screen-reversed/unlock-session.component'; + +const routes: Routes = [ + { + path : 'unlock-session', + children: [ + { + path : 'classic', + component: UnlockSessionClassicComponent + }, + { + path : 'modern', + component: UnlockSessionModernComponent + }, + { + path : 'modern-reversed', + component: UnlockSessionModernReversedComponent + }, + { + path : 'split-screen', + component: UnlockSessionSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: UnlockSessionSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: UnlockSessionFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: UnlockSessionFullscreenReversedComponent + } + ] + } +]; + +@NgModule({ + declarations: [ + UnlockSessionClassicComponent, + UnlockSessionModernComponent, + UnlockSessionModernReversedComponent, + UnlockSessionFullscreenComponent, + UnlockSessionFullscreenReversedComponent, + UnlockSessionSplitScreenComponent, + UnlockSessionSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseAlertModule, + SharedModule + ] +}) +export class UnlockSessionModule +{ +} diff --git a/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.html new file mode 100644 index 00000000..fa3d98f5 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.html @@ -0,0 +1,73 @@ +
+
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.ts new file mode 100644 index 00000000..9db9235b --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/classic/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonClassicComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/coming-soon.module.ts b/src/app/modules/admin/pages/coming-soon/coming-soon.module.ts new file mode 100644 index 00000000..65385b3f --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/coming-soon.module.ts @@ -0,0 +1,74 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { ComingSoonClassicComponent } from 'app/modules/admin/pages/coming-soon/classic/coming-soon.component'; +import { ComingSoonModernComponent } from 'app/modules/admin/pages/coming-soon/modern/coming-soon.component'; +import { ComingSoonModernReversedComponent } from 'app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component'; +import { ComingSoonSplitScreenComponent } from 'app/modules/admin/pages/coming-soon/split-screen/coming-soon.component'; +import { ComingSoonSplitScreenReversedComponent } from 'app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component'; +import { ComingSoonFullscreenComponent } from 'app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component'; +import { ComingSoonFullscreenReversedComponent } from 'app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component'; + +const routes: Routes = [ + { + path : 'classic', + component: ComingSoonClassicComponent + }, + { + path : 'modern', + component: ComingSoonModernComponent + }, + { + path : 'modern-reversed', + component: ComingSoonModernReversedComponent + }, + { + path : 'split-screen', + component: ComingSoonSplitScreenComponent + }, + { + path : 'split-screen-reversed', + component: ComingSoonSplitScreenReversedComponent + }, + { + path : 'fullscreen', + component: ComingSoonFullscreenComponent + }, + { + path : 'fullscreen-reversed', + component: ComingSoonFullscreenReversedComponent + } +]; + +@NgModule({ + declarations: [ + ComingSoonClassicComponent, + ComingSoonModernComponent, + ComingSoonModernReversedComponent, + ComingSoonFullscreenComponent, + ComingSoonFullscreenReversedComponent, + ComingSoonSplitScreenComponent, + ComingSoonSplitScreenReversedComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class ComingSoonModule +{ +} diff --git a/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.html new file mode 100644 index 00000000..32c2fc11 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.html @@ -0,0 +1,123 @@ +
+ +
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.ts new file mode 100644 index 00000000..28fa10c1 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/fullscreen-reversed/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonFullscreenReversedComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.html new file mode 100644 index 00000000..c92d934a --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.html @@ -0,0 +1,123 @@ +
+
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.ts new file mode 100644 index 00000000..95f3a109 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/fullscreen/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonFullscreenComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.html new file mode 100644 index 00000000..1bd5f43e --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.html @@ -0,0 +1,125 @@ +
+
+ +
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+
+
diff --git a/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.ts new file mode 100644 index 00000000..cdc9d9fa --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/modern-reversed/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonModernReversedComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.html new file mode 100644 index 00000000..3a083b52 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.html @@ -0,0 +1,125 @@ +
+
+
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+ +
+
diff --git a/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.ts new file mode 100644 index 00000000..3bf570dc --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/modern/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonModernComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.html new file mode 100644 index 00000000..2569d98d --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.html @@ -0,0 +1,123 @@ +
+ +
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+
diff --git a/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.ts new file mode 100644 index 00000000..00d519fd --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/split-screen-reversed/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonSplitScreenReversedComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.html b/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.html new file mode 100644 index 00000000..d37d3261 --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.html @@ -0,0 +1,123 @@ +
+
+
+ +
+ +
+ + +
Almost there!
+
+ Do you want to be notified when we are ready? Register below so we can notify you about the launch! +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ This isn't a newsletter subscription. We will send one email to you when + we launch and then you will be removed from the list. +
+ +
+
+
+ +
diff --git a/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.ts b/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.ts new file mode 100644 index 00000000..f41c343d --- /dev/null +++ b/src/app/modules/admin/pages/coming-soon/split-screen/coming-soon.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'coming-soon-classic', + templateUrl : './coming-soon.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class ComingSoonSplitScreenComponent implements OnInit +{ + @ViewChild('comingSoonNgForm') comingSoonNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + comingSoonForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.comingSoonForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + register(): void + { + // Return if the form is invalid + if ( this.comingSoonForm.invalid ) + { + return; + } + + // Disable the form + this.comingSoonForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Do your action here... + // Emulate server delay + setTimeout(() => { + + // Re-enable the form + this.comingSoonForm.enable(); + + // Reset the form + this.comingSoonNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'success', + message: 'You have been registered to the list.' + }; + + }, 1000); + } +} diff --git a/src/app/modules/admin/pages/error/error-404/error-404.component.html b/src/app/modules/admin/pages/error/error-404/error-404.component.html new file mode 100644 index 00000000..2ae98955 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-404/error-404.component.html @@ -0,0 +1,64 @@ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
Ooops... 404!
+
The page you requested could not be found.
+ + Back to Dashboard + +
+
diff --git a/src/app/modules/admin/pages/error/error-404/error-404.component.ts b/src/app/modules/admin/pages/error/error-404/error-404.component.ts new file mode 100644 index 00000000..707e4813 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-404/error-404.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'error-404', + templateUrl : './error-404.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class Error404Component +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/error/error-404/error-404.module.ts b/src/app/modules/admin/pages/error/error-404/error-404.module.ts new file mode 100644 index 00000000..8a84bc56 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-404/error-404.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { Error404Component } from 'app/modules/admin/pages/error/error-404/error-404.component'; +import { error404Routes } from 'app/modules/admin/pages/error/error-404/error-404.routing'; + +@NgModule({ + declarations: [ + Error404Component + ], + imports : [ + RouterModule.forChild(error404Routes) + ] +}) +export class Error404Module +{ +} diff --git a/src/app/modules/admin/pages/error/error-404/error-404.routing.ts b/src/app/modules/admin/pages/error/error-404/error-404.routing.ts new file mode 100644 index 00000000..19c2b07f --- /dev/null +++ b/src/app/modules/admin/pages/error/error-404/error-404.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { Error404Component } from 'app/modules/admin/pages/error/error-404/error-404.component'; + +export const error404Routes: Route[] = [ + { + path : '', + component: Error404Component + } +]; diff --git a/src/app/modules/admin/pages/error/error-500/error-500.component.html b/src/app/modules/admin/pages/error/error-500/error-500.component.html new file mode 100644 index 00000000..e8d55838 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-500/error-500.component.html @@ -0,0 +1,73 @@ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
Something went wrong!
+
Server Error 500. Our staff has been notified, thank you for your understanding.
+ + Back to Dashboard + +
+
diff --git a/src/app/modules/admin/pages/error/error-500/error-500.component.ts b/src/app/modules/admin/pages/error/error-500/error-500.component.ts new file mode 100644 index 00000000..fa8ac9d4 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-500/error-500.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'error-500', + templateUrl : './error-500.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class Error500Component +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/error/error-500/error-500.module.ts b/src/app/modules/admin/pages/error/error-500/error-500.module.ts new file mode 100644 index 00000000..48f311ac --- /dev/null +++ b/src/app/modules/admin/pages/error/error-500/error-500.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { Error500Component } from 'app/modules/admin/pages/error/error-500/error-500.component'; +import { error500Routes } from 'app/modules/admin/pages/error/error-500/error-500.routing'; + +@NgModule({ + declarations: [ + Error500Component + ], + imports : [ + RouterModule.forChild(error500Routes) + ] +}) +export class Error500Module +{ +} diff --git a/src/app/modules/admin/pages/error/error-500/error-500.routing.ts b/src/app/modules/admin/pages/error/error-500/error-500.routing.ts new file mode 100644 index 00000000..c12722b2 --- /dev/null +++ b/src/app/modules/admin/pages/error/error-500/error-500.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { Error500Component } from 'app/modules/admin/pages/error/error-500/error-500.component'; + +export const error500Routes: Route[] = [ + { + path : '', + component: Error500Component + } +]; diff --git a/src/app/modules/admin/pages/invoice/printable/compact/compact.component.html b/src/app/modules/admin/pages/invoice/printable/compact/compact.component.html new file mode 100644 index 00000000..2f711ac2 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/compact/compact.component.html @@ -0,0 +1,163 @@ +
+ + +
+ + +
+ +
+
+
INVOICE
+
#9-0004
+
INVOICE DATE
+
Jul 19, 2022
+
DUE DATE
+
Aug 19, 2022
+
TOTAL DUE
+
$235,000.00
+
+
+
+ +
+
+
Fuse Inc.
+
2810 Country Club Road
+
Cranford, NJ 07016
+
+66 123 455 87
+
hello@fuseinc.com
+
www.fuseinc.com
+
+
+
+ +
+
Brian Hughes
+
9301 Wood Street Philadelphia, PA 19111
+
hughes.brian@company.com
+
+55 552 455 87
+
+ +
+ +
SERVICE
+
RATE
+
QTY
+
TOTAL
+ + +
+ + +
Prototype & Design
+
$75.00
+
240
+
$18,000.00
+ + +
+ + +
Development
+
$60.50
+
350
+
$21,175.00
+ + +
+ + +
Testing
+
$25.00
+
50
+
$1,250.00
+ + +
+ + +
Documentation & Training
+
$26.50
+
260
+
$6,890.00
+ + +
+ + +
Critical bug fixes for a year
+
$25,000
+
2
+
$50,000.00
+ + +
+ + +
Extended security updates for a year
+
$15.000
+
2
+
$30,000.00
+ + +
+ + +
Extended updates for a year
+
$50.000
+
2
+
$100,000.00
+ + +
+ + +
SUBTOTAL
+
$227,315.00
+ + +
+ + +
TAX
+
$11,365.75
+ + +
+ + +
DISCOUNT
+
$3,680.75
+ + +
+ + +
TOTAL
+
$235,000.00
+
+ +
+
Please pay within 15 days. Thank you for your business.
+
+ +
+ In condimentum malesuada efficitur. Mauris volutpat placerat auctor. Ut ac congue dolor. Quisque scelerisque lacus sed feugiat fermentum. + Cras aliquet facilisis pellentesque. Nunc hendrerit quam at leo commodo, a suscipit tellus dapibus. Etiam at felis volutpat est mollis lacinia. + Mauris placerat sem sit amet velit mollis, in porttitor ex finibus. Proin eu nibh id libero tincidunt lacinia et eget. +
+
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/pages/invoice/printable/compact/compact.component.ts b/src/app/modules/admin/pages/invoice/printable/compact/compact.component.ts new file mode 100644 index 00000000..fc1414a7 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/compact/compact.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'compact', + templateUrl : './compact.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CompactComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/invoice/printable/compact/compact.module.ts b/src/app/modules/admin/pages/invoice/printable/compact/compact.module.ts new file mode 100644 index 00000000..b406407d --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/compact/compact.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CdkScrollableModule } from '@angular/cdk/scrolling'; +import { CompactComponent } from 'app/modules/admin/pages/invoice/printable/compact/compact.component'; +import { compactRoutes } from 'app/modules/admin/pages/invoice/printable/compact/compact.routing'; + +@NgModule({ + declarations: [ + CompactComponent + ], + imports : [ + RouterModule.forChild(compactRoutes), + CdkScrollableModule + ] +}) +export class CompactModule +{ +} diff --git a/src/app/modules/admin/pages/invoice/printable/compact/compact.routing.ts b/src/app/modules/admin/pages/invoice/printable/compact/compact.routing.ts new file mode 100644 index 00000000..39a806db --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/compact/compact.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { CompactComponent } from 'app/modules/admin/pages/invoice/printable/compact/compact.component'; + +export const compactRoutes: Route[] = [ + { + path : '', + component: CompactComponent + } +]; diff --git a/src/app/modules/admin/pages/invoice/printable/modern/modern.component.html b/src/app/modules/admin/pages/invoice/printable/modern/modern.component.html new file mode 100644 index 00000000..d18f6ad6 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/modern/modern.component.html @@ -0,0 +1,163 @@ +
+ + +
+ + +
+ +
+
+
+
+ +
+
+
Fuse Inc.
+
2810 Country Club Road
+
Cranford, NJ 07016
+
+66 123 455 87
+
hello@fuseinc.com
+
www.fuseinc.com
+
+
+
+
+ Bill To +
+
+
Brian Hughes
+
9301 Wood Street
+
Philadelphia, PA 19111
+
+55 552 455 87
+
hughes.brian@company.com
+
+
+
+
+
INVOICE
+
#9-0004
+
INVOICE DATE
+
Jul 19, 2022
+
DUE DATE
+
Aug 19, 2022
+
TOTAL DUE
+
$49,000.00
+
+
+ +
+ +
SERVICE
+
RATE
+
QTY
+
TOTAL
+ + +
+ + +
+
Prototype & Design
+
+ Prototyping of the application's general workflow and the detailed design of its 72 screens as a working prototype. +
+
+
$75.00
+
240
+
$18,000.00
+ + +
+ + +
+
Development
+
+ The web and mobile development of the application using appropriate tools and registering it to major application stores. +
+
+
$60.50
+
350
+
$21,175.00
+ + +
+ + +
+
Testing
+
+ Extensive testing of the application using various mobile and desktop devices with different operating systems. +
+
+
$25.00
+
50
+
$1,250.00
+ + +
+ + +
+
Documentation & Training
+
+ Development of the detailed documentation, preparing guides and instructional videos and extensive training of 2 people. +
+
+
$26.50
+
260
+
$6,890.00
+ + +
+ + +
SUBTOTAL
+
$47,315.00
+ + +
+ + +
TAX
+
$2,365.75
+ + +
+ + +
DISCOUNT
+
$180.75
+ + +
+ + +
TOTAL
+
$49,000.00
+
+ +
+
Please pay within 15 days. Thank you for your business.
+
+ +
+ In condimentum malesuada efficitur. Mauris volutpat placerat auctor. Ut ac congue dolor. Quisque scelerisque lacus sed feugiat fermentum. + Cras aliquet facilisis pellentesque. Nunc hendrerit quam at leo commodo, a suscipit tellus dapibus. Etiam at felis volutpat est mollis lacinia. + Mauris placerat sem sit amet velit mollis, in porttitor ex finibus. Proin eu nibh id libero tincidunt lacinia et eget. +
+
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/pages/invoice/printable/modern/modern.component.ts b/src/app/modules/admin/pages/invoice/printable/modern/modern.component.ts new file mode 100644 index 00000000..224b5611 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/modern/modern.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'modern', + templateUrl : './modern.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ModernComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/invoice/printable/modern/modern.module.ts b/src/app/modules/admin/pages/invoice/printable/modern/modern.module.ts new file mode 100644 index 00000000..4fc62cc9 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/modern/modern.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ModernComponent } from 'app/modules/admin/pages/invoice/printable/modern/modern.component'; +import { modernRoutes } from 'app/modules/admin/pages/invoice/printable/modern/modern.routing'; + +@NgModule({ + declarations: [ + ModernComponent + ], + imports : [ + RouterModule.forChild(modernRoutes) + ] +}) +export class ModernModule +{ +} diff --git a/src/app/modules/admin/pages/invoice/printable/modern/modern.routing.ts b/src/app/modules/admin/pages/invoice/printable/modern/modern.routing.ts new file mode 100644 index 00000000..81361284 --- /dev/null +++ b/src/app/modules/admin/pages/invoice/printable/modern/modern.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { ModernComponent } from 'app/modules/admin/pages/invoice/printable/modern/modern.component'; + +export const modernRoutes: Route[] = [ + { + path : '', + component: ModernComponent + } +]; diff --git a/src/app/modules/admin/pages/maintenance/maintenance.component.html b/src/app/modules/admin/pages/maintenance/maintenance.component.html new file mode 100644 index 00000000..3e004c32 --- /dev/null +++ b/src/app/modules/admin/pages/maintenance/maintenance.component.html @@ -0,0 +1,49 @@ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
We are under scheduled maintenance.
+
Sorry for the inconvenience, we will be back shortly!
+
+
diff --git a/src/app/modules/admin/pages/maintenance/maintenance.component.ts b/src/app/modules/admin/pages/maintenance/maintenance.component.ts new file mode 100644 index 00000000..ac03862b --- /dev/null +++ b/src/app/modules/admin/pages/maintenance/maintenance.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'maintenance', + templateUrl : './maintenance.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MaintenanceComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/maintenance/maintenance.module.ts b/src/app/modules/admin/pages/maintenance/maintenance.module.ts new file mode 100644 index 00000000..41e9035d --- /dev/null +++ b/src/app/modules/admin/pages/maintenance/maintenance.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MaintenanceComponent } from 'app/modules/admin/pages/maintenance/maintenance.component'; +import { maintenanceRoutes } from 'app/modules/admin/pages/maintenance/maintenance.routing'; + +@NgModule({ + declarations: [ + MaintenanceComponent + ], + imports : [ + RouterModule.forChild(maintenanceRoutes) + ] +}) +export class MaintenanceModule +{ +} diff --git a/src/app/modules/admin/pages/maintenance/maintenance.routing.ts b/src/app/modules/admin/pages/maintenance/maintenance.routing.ts new file mode 100644 index 00000000..694b7a8a --- /dev/null +++ b/src/app/modules/admin/pages/maintenance/maintenance.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { MaintenanceComponent } from 'app/modules/admin/pages/maintenance/maintenance.component'; + +export const maintenanceRoutes: Route[] = [ + { + path : '', + component: MaintenanceComponent + } +]; diff --git a/src/app/modules/admin/pages/pricing/modern/modern.component.html b/src/app/modules/admin/pages/pricing/modern/modern.component.html new file mode 100644 index 00000000..0e6073b3 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/modern/modern.component.html @@ -0,0 +1,435 @@ +
+ + +
+ + + + + + + + + +
+

PRICING

+
+ Take control of your productivity +
+
+
Start small and free, upgrade as you go.
+
Take control of everything.
+
+ +
+ + +
+
+ +
+
+
+ + +
Personal
+
Perfect for an individual or a small team starting to get bigger
+
+ +
+
USD
+
+ $6.00 + $9.00 +
+
+ +
+ +
billed yearly
+
$9.00 billed monthly
+
+ +
billed monthly
+
$6.00 billed yearly
+
+
+ + + +
+
Core features, including:
+
+
+ +
10 projects
+
+
+ +
5GB storage
+
+
+ +
Analytics
+
+
+ +
Free mobile app
+
+
+ +
Access to forums
+
+
+
+
+ + +
+
POPULAR
+
+
Premium
+
Perfect for growing teams wanting to be in more control
+
+ +
+
USD
+
+ $12.00 + $15.00 +
+
+ +
+ +
billed yearly
+
$15.00 billed monthly
+
+ +
billed monthly
+
$12.00 billed yearly
+
+
+ + + +
+
Personal features, plus:
+
+
+ +
Unlimited projects
+
+
+ +
Unlimited storage
+
+
+ +
Custom domains
+
+
+ +
Bulk editing
+
+
+ +
12 / 5 support
+
+
+
+
+ + +
Enterprise
+
Perfect for companies wanting advanced tools and support
+
+ +
+
USD
+
+ $49.00 + $69.00 +
+
+ +
+ +
billed yearly
+
$69.00 billed monthly
+
+ +
billed monthly
+
$49.00 billed yearly
+
+
+ + + +
+
Premium features, plus:
+
+
+ +
Dedicated hardware
+
+
+ +
%99.9 uptime
+
+
+ +
Advanced analytics
+
+
+ +
3rd party integrations
+
+
+ +
24 / 7 support
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ Everything you need to build efficiently +
+
+ Start building your app using our tools, be efficient, spend less time with details more time with your business +
+
+ +
+
+ + + +
Create and Edit Projects
+
+ Create and edit projects, upload images via drag drop, add categories, add custom fields, create interactive forms and more. +
+
+
+ + + +
Search and Filter
+
+ Search and filter within the projects, categories and custom fields. Save search and filter details for easy access. +
+
+
+ + + +
Real Time Updates
+
+ Real time updates that doesn't require page reload. Lean back and watch the changes happen in real time. +
+
+
+ + + +
Meta Information
+
+ Add and remove meta information to custom fields to differentiate them in reports and analytics results, use them for detailed reports. +
+
+
+ + + +
Pre-rendered Results
+
+ Pre-render results to make reports and analytics more accessible by screen readers and other accessibility tools. +
+
+
+ + + +
Simple Analytics
+
+ Simple analytics with no unnecessary data flow or weight. More readable results with less data consumption. +
+
+
+
+
+ + +
+
+
Boost your productivity.
+
Start using Fuse today.
+ +
+
+ + +
+
+
+
+ Frequently asked questions +
+
+ Here are the most frequently asked questions you may check before getting started +
+
+ +
+
+
+ What is the duration of the free trial? +
+
+

+ Our app is free to try for 14 days, if you want more, you can provide + payment details which will extend your trial to 30 days providing you + an extra 16 more days to try our app. +

+
+
+
+
+ Are there discounts for non-profits or educational use? +
+
+

+ Yes, our Personal and Premium packages are free for non-profits and + educational use. E-mail your details to us after starting your Free + Trial and we will upgrade your account if you qualify. +

+
+
+
+
+ What is the storage is for? +
+
+

+ Since we provide an extremely detailed reporting and analytics + tool, they require quite a bit storage space. For average use, you + don’t have to worry about running out of space since the + Personal package limits the projects you can have. +

+

+ For some reason if you run out of space, contact us and we will + see what can be done about it and make sure you are not + generating unnecessary reports and/or analytics data. +

+
+
+
+
+ What happens if I’m not satisfied? +
+
+

+ If you are still in your free trial period, you can cancel your + account at anytime with a single click of a button. If you already + paid for your first month, we also offer 30-day money-back + guarantee with no questions asked. +

+

+ After first month, you can still cancel your account at any time + but we will calculate the amount that corresponds to days you + have been using our app for that month and refund only the + remaining amount. +

+
+
+
+
+
+
diff --git a/src/app/modules/admin/pages/pricing/modern/modern.component.ts b/src/app/modules/admin/pages/pricing/modern/modern.component.ts new file mode 100644 index 00000000..8cae1bd9 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/modern/modern.component.ts @@ -0,0 +1,19 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'pricing-modern', + templateUrl : './modern.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class PricingModernComponent +{ + yearlyBilling: boolean = true; + + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/pricing/modern/modern.module.ts b/src/app/modules/admin/pages/pricing/modern/modern.module.ts new file mode 100644 index 00000000..0a8fe93a --- /dev/null +++ b/src/app/modules/admin/pages/pricing/modern/modern.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { PricingModernComponent } from 'app/modules/admin/pages/pricing/modern/modern.component'; +import { pricingModernRoutes } from 'app/modules/admin/pages/pricing/modern/modern.routing'; + +@NgModule({ + declarations: [ + PricingModernComponent + ], + imports : [ + RouterModule.forChild(pricingModernRoutes), + MatButtonModule, + MatIconModule, + FuseCardModule, + SharedModule + ] +}) +export class PricingModernModule +{ +} diff --git a/src/app/modules/admin/pages/pricing/modern/modern.routing.ts b/src/app/modules/admin/pages/pricing/modern/modern.routing.ts new file mode 100644 index 00000000..8fb9c323 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/modern/modern.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { PricingModernComponent } from 'app/modules/admin/pages/pricing/modern/modern.component'; + +export const pricingModernRoutes: Route[] = [ + { + path : '', + component: PricingModernComponent + } +]; diff --git a/src/app/modules/admin/pages/pricing/simple/simple.component.html b/src/app/modules/admin/pages/pricing/simple/simple.component.html new file mode 100644 index 00000000..0143a490 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/simple/simple.component.html @@ -0,0 +1,344 @@ +
+ + +
+ + + + + + + + + +
+

PRICING

+
+ Take control of your productivity +
+
+
Start small and free, upgrade as you go.
+
Take control of everything.
+
+ +
+ + +
+
+ +
+
+
+ + +
Personal
+ +
+
+ $6 + $9 +
+
/ month
+
+ +
+ +
billed yearly
+
$9.00 billed monthly
+
+ +
billed monthly
+
$6.00 billed yearly
+
+
+ +
+
10 projects
+
5GB storage
+
Analytics
+
Free mobile app
+
Access to forums
+
+ + +
+ + +
POPULAR
+
Premium
+ +
+
+ $12 + $15 +
+
/ month
+
+ +
+ +
billed yearly
+
$15.00 billed monthly
+
+ +
billed monthly
+
$12.00 billed yearly
+
+
+ +
+
Unlimited projects
+
Unlimited storage
+
Custom domains
+
Bulk editing
+
12 / 5 support
+
+ + +
+ + +
Enterprise
+ +
+
+ $49 + $69 +
+
/ month
+
+ +
+ +
billed yearly
+
$69.00 billed monthly
+
+ +
billed monthly
+
$49.00 billed yearly
+
+
+ +
+
Dedicated hardware
+
%99.9 uptime
+
Advanced analytics
+
3rd party integrations
+
24 / 7 support
+
+ + +
+
+
+
+
+ + +
+
+
+
+ Everything you need to build efficiently +
+
+ Start building your app using our tools, be efficient, spend less time with details more time with your business +
+
+ +
+
+ + + +
Create and Edit Projects
+
+ Create and edit projects, upload images via drag drop, add categories, add custom fields, create interactive forms and more. +
+
+
+ + + +
Search and Filter
+
+ Search and filter within the projects, categories and custom fields. Save search and filter details for easy access. +
+
+
+ + + +
Real Time Updates
+
+ Real time updates that doesn't require page reload. Lean back and watch the changes happen in real time. +
+
+
+ + + +
Meta Information
+
+ Add and remove meta information to custom fields to differentiate them in reports and analytics results, use them for detailed reports. +
+
+
+ + + +
Pre-rendered Results
+
+ Pre-render results to make reports and analytics more accessible by screen readers and other accessibility tools. +
+
+
+ + + +
Simple Analytics
+
+ Simple analytics with no unnecessary data flow or weight. More readable results with less data consumption. +
+
+
+
+
+ + +
+
+
Boost your productivity.
+
Start using Fuse today.
+ +
+
+ + +
+
+
+
+ Frequently asked questions +
+
+ Here are the most frequently asked questions you may check before getting started +
+
+ +
+
+
+ What is the duration of the free trial? +
+
+

+ Our app is free to try for 14 days, if you want more, you can provide + payment details which will extend your trial to 30 days providing you + an extra 16 more days to try our app. +

+
+
+
+
+ Are there discounts for non-profits or educational use? +
+
+

+ Yes, our Personal and Premium packages are free for non-profits and + educational use. E-mail your details to us after starting your Free + Trial and we will upgrade your account if you qualify. +

+
+
+
+
+ What is the storage is for? +
+
+

+ Since we provide an extremely detailed reporting and analytics + tool, they require quite a bit storage space. For average use, you + don’t have to worry about running out of space since the + Personal package limits the projects you can have. +

+

+ For some reason if you run out of space, contact us and we will + see what can be done about it and make sure you are not + generating unnecessary reports and/or analytics data. +

+
+
+
+
+ What happens if I’m not satisfied? +
+
+

+ If you are still in your free trial period, you can cancel your + account at anytime with a single click of a button. If you already + paid for your first month, we also offer 30-day money-back + guarantee with no questions asked. +

+

+ After first month, you can still cancel your account at any time + but we will calculate the amount that corresponds to days you + have been using our app for that month and refund only the + remaining amount. +

+
+
+
+
+
+ +
diff --git a/src/app/modules/admin/pages/pricing/simple/simple.component.ts b/src/app/modules/admin/pages/pricing/simple/simple.component.ts new file mode 100644 index 00000000..adf597c4 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/simple/simple.component.ts @@ -0,0 +1,19 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'pricing-simple', + templateUrl : './simple.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class PricingSimpleComponent +{ + yearlyBilling: boolean = true; + + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/pricing/simple/simple.module.ts b/src/app/modules/admin/pages/pricing/simple/simple.module.ts new file mode 100644 index 00000000..09759045 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/simple/simple.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { PricingSimpleComponent } from 'app/modules/admin/pages/pricing/simple/simple.component'; +import { pricingSimpleRoutes } from 'app/modules/admin/pages/pricing/simple/simple.routing'; + +@NgModule({ + declarations: [ + PricingSimpleComponent + ], + imports : [ + RouterModule.forChild(pricingSimpleRoutes), + MatButtonModule, + MatIconModule, + FuseCardModule, + SharedModule + ] +}) +export class PricingSimpleModule +{ +} diff --git a/src/app/modules/admin/pages/pricing/simple/simple.routing.ts b/src/app/modules/admin/pages/pricing/simple/simple.routing.ts new file mode 100644 index 00000000..eb1c8e94 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/simple/simple.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { PricingSimpleComponent } from 'app/modules/admin/pages/pricing/simple/simple.component'; + +export const pricingSimpleRoutes: Route[] = [ + { + path : '', + component: PricingSimpleComponent + } +]; diff --git a/src/app/modules/admin/pages/pricing/single/single.component.html b/src/app/modules/admin/pages/pricing/single/single.component.html new file mode 100644 index 00000000..5ec435ed --- /dev/null +++ b/src/app/modules/admin/pages/pricing/single/single.component.html @@ -0,0 +1,260 @@ +
+ + +
+ + + + + + + + + +
+

PRICING

+
+ Take control of your productivity +
+
+
Start small and free, upgrade as you go.
+
Take control of everything.
+
+
+ +
+ +
+
Lifetime Membership
+
+ Learn from like-minded individuals which are eager to make a living building stuff on the web. Pay once and get lifetime access to the community. +
+
+
INCLUDED FEATURES
+
+
+ +
+
+ +
Private forum access
+
+
+ +
Access to annual online conference
+
+
+ +
Member resources
+
+
+ +
Official member T-Shirt
+
+
+
+ +
+
+
$599
+
USD
+
+
+
No monthly subscription,
+
you only pay once.
+
+ +
+
+
+
+ + +
+
+
+
+ Everything you need to build efficiently +
+
+ Start building your app using our tools, be efficient, spend less time with details more time with your business +
+
+ +
+
+ + + +
Create and Edit Projects
+
+ Create and edit projects, upload images via drag drop, add categories, add custom fields, create interactive forms and more. +
+
+
+ + + +
Search and Filter
+
+ Search and filter within the projects, categories and custom fields. Save search and filter details for easy access. +
+
+
+ + + +
Real Time Updates
+
+ Real time updates that doesn't require page reload. Lean back and watch the changes happen in real time. +
+
+
+ + + +
Meta Information
+
+ Add and remove meta information to custom fields to differentiate them in reports and analytics results, use them for detailed reports. +
+
+
+ + + +
Pre-rendered Results
+
+ Pre-render results to make reports and analytics more accessible by screen readers and other accessibility tools. +
+
+
+ + + +
Simple Analytics
+
+ Simple analytics with no unnecessary data flow or weight. More readable results with less data consumption. +
+
+
+
+
+ + +
+
+
Boost your productivity.
+
Start using Fuse today.
+ +
+
+ + +
+
+
+
+ Frequently asked questions +
+
+ Here are the most frequently asked questions you may check before getting started +
+
+ +
+
+
+ What is the duration of the free trial? +
+
+

+ Our app is free to try for 14 days, if you want more, you can provide + payment details which will extend your trial to 30 days providing you + an extra 16 more days to try our app. +

+
+
+
+
+ Are there discounts for non-profits or educational use? +
+
+

+ Yes, our Personal and Premium packages are free for non-profits and + educational use. E-mail your details to us after starting your Free + Trial and we will upgrade your account if you qualify. +

+
+
+
+
+ What is the storage is for? +
+
+

+ Since we provide an extremely detailed reporting and analytics + tool, they require quite a bit storage space. For average use, you + don’t have to worry about running out of space since the + Personal package limits the projects you can have. +

+

+ For some reason if you run out of space, contact us and we will + see what can be done about it and make sure you are not + generating unnecessary reports and/or analytics data. +

+
+
+
+
+ What happens if I’m not satisfied? +
+
+

+ If you are still in your free trial period, you can cancel your + account at anytime with a single click of a button. If you already + paid for your first month, we also offer 30-day money-back + guarantee with no questions asked. +

+

+ After first month, you can still cancel your account at any time + but we will calculate the amount that corresponds to days you + have been using our app for that month and refund only the + remaining amount. +

+
+
+
+
+
+ +
diff --git a/src/app/modules/admin/pages/pricing/single/single.component.ts b/src/app/modules/admin/pages/pricing/single/single.component.ts new file mode 100644 index 00000000..dc9d567b --- /dev/null +++ b/src/app/modules/admin/pages/pricing/single/single.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'pricing-single', + templateUrl : './single.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class PricingSingleComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/pricing/single/single.module.ts b/src/app/modules/admin/pages/pricing/single/single.module.ts new file mode 100644 index 00000000..d4fe4273 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/single/single.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { PricingSingleComponent } from 'app/modules/admin/pages/pricing/single/single.component'; +import { pricingSingleRoutes } from 'app/modules/admin/pages/pricing/single/single.routing'; + +@NgModule({ + declarations: [ + PricingSingleComponent + ], + imports : [ + RouterModule.forChild(pricingSingleRoutes), + MatButtonModule, + MatIconModule, + FuseCardModule, + SharedModule + ] +}) +export class PricingSingleModule +{ +} diff --git a/src/app/modules/admin/pages/pricing/single/single.routing.ts b/src/app/modules/admin/pages/pricing/single/single.routing.ts new file mode 100644 index 00000000..5a4a7864 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/single/single.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { PricingSingleComponent } from 'app/modules/admin/pages/pricing/single/single.component'; + +export const pricingSingleRoutes: Route[] = [ + { + path : '', + component: PricingSingleComponent + } +]; diff --git a/src/app/modules/admin/pages/pricing/table/table.component.html b/src/app/modules/admin/pages/pricing/table/table.component.html new file mode 100644 index 00000000..b05b725e --- /dev/null +++ b/src/app/modules/admin/pages/pricing/table/table.component.html @@ -0,0 +1,476 @@ +
+ + +
+ + + + + + + + + +
+

PRICING

+
+ Take control of your productivity +
+
+
Start small and free, upgrade as you go.
+
Take control of everything.
+
+ +
+ + +
+
+ +
+ +
+ +
+
+
+
+
Personal
+
+ +
+ $6 + $9 +
+
/ mo
+
+
+ +
billed yearly
+
$9.00 billed monthly
+
+ +
billed monthly
+
$6.00 billed yearly
+
+
+ +
+
+
+
+
+
Premium
+ +
+
+ +
+ $12 + $15 +
+
/ mo
+
+
+ +
billed yearly
+
$15.00 billed monthly
+
+ +
billed monthly
+
$12.00 billed yearly
+
+
+ +
+
+
+
+
Enterprise
+
+ +
+ $49 + $69 +
+
/ mo
+
+
+ +
billed yearly
+
$69.00 billed monthly
+
+ +
billed monthly
+
$49.00 billed yearly
+
+
+ +
+
+
+ + + + +
+
Unlimited projects
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
Unlimited storage
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
Custom domain support
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
Dedicated hardware
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+
Fraud analysis
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
Rates for in-house payment systems
+ +
2.9% + 30¢
+ +
2.6% + 30¢
+ +
2.4% + 30¢
+
+ +
+
Rates for other payment systems
+ +
4.9% + 30¢
+ +
4.6% + 30¢
+ +
4.4% + 30¢
+
+ +
+
Additional fees using other payment systems
+ +
2%
+ +
1%
+ +
0.5%
+
+
+
+
+
+ + +
+
+
+
+ Everything you need to build efficiently +
+
+ Start building your app using our tools, be efficient, spend less time with details more time with your business +
+
+ +
+
+ + + +
Create and Edit Projects
+
+ Create and edit projects, upload images via drag drop, add categories, add custom fields, create interactive forms and more. +
+
+
+ + + +
Search and Filter
+
+ Search and filter within the projects, categories and custom fields. Save search and filter details for easy access. +
+
+
+ + + +
Real Time Updates
+
+ Real time updates that doesn't require page reload. Lean back and watch the changes happen in real time. +
+
+
+ + + +
Meta Information
+
+ Add and remove meta information to custom fields to differentiate them in reports and analytics results, use them for detailed reports. +
+
+
+ + + +
Pre-rendered Results
+
+ Pre-render results to make reports and analytics more accessible by screen readers and other accessibility tools. +
+
+
+ + + +
Simple Analytics
+
+ Simple analytics with no unnecessary data flow or weight. More readable results with less data consumption. +
+
+
+
+
+ + +
+
+
Boost your productivity.
+
Start using Fuse today.
+ +
+
+ + +
+
+
+
+ Frequently asked questions +
+
+ Here are the most frequently asked questions you may check before getting started +
+
+ +
+
+
+ What is the duration of the free trial? +
+
+

+ Our app is free to try for 14 days, if you want more, you can provide + payment details which will extend your trial to 30 days providing you + an extra 16 more days to try our app. +

+
+
+
+
+ Are there discounts for non-profits or educational use? +
+
+

+ Yes, our Personal and Premium packages are free for non-profits and + educational use. E-mail your details to us after starting your Free + Trial and we will upgrade your account if you qualify. +

+
+
+
+
+ What is the storage is for? +
+
+

+ Since we provide an extremely detailed reporting and analytics + tool, they require quite a bit storage space. For average use, you + don’t have to worry about running out of space since the + Personal package limits the projects you can have. +

+

+ For some reason if you run out of space, contact us and we will + see what can be done about it and make sure you are not + generating unnecessary reports and/or analytics data. +

+
+
+
+
+ What happens if I’m not satisfied? +
+
+

+ If you are still in your free trial period, you can cancel your + account at anytime with a single click of a button. If you already + paid for your first month, we also offer 30-day money-back + guarantee with no questions asked. +

+

+ After first month, you can still cancel your account at any time + but we will calculate the amount that corresponds to days you + have been using our app for that month and refund only the + remaining amount. +

+
+
+
+
+
+ +
diff --git a/src/app/modules/admin/pages/pricing/table/table.component.ts b/src/app/modules/admin/pages/pricing/table/table.component.ts new file mode 100644 index 00000000..4ff88fa7 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/table/table.component.ts @@ -0,0 +1,19 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'pricing-table', + templateUrl : './table.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class PricingTableComponent +{ + yearlyBilling: boolean = true; + + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/pricing/table/table.module.ts b/src/app/modules/admin/pages/pricing/table/table.module.ts new file mode 100644 index 00000000..fc21da6e --- /dev/null +++ b/src/app/modules/admin/pages/pricing/table/table.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { PricingTableComponent } from 'app/modules/admin/pages/pricing/table/table.component'; +import { pricingTableRoutes } from 'app/modules/admin/pages/pricing/table/table.routing'; + +@NgModule({ + declarations: [ + PricingTableComponent + ], + imports : [ + RouterModule.forChild(pricingTableRoutes), + MatButtonModule, + MatIconModule, + FuseCardModule, + SharedModule + ] +}) +export class PricingTableModule +{ +} diff --git a/src/app/modules/admin/pages/pricing/table/table.routing.ts b/src/app/modules/admin/pages/pricing/table/table.routing.ts new file mode 100644 index 00000000..cc727192 --- /dev/null +++ b/src/app/modules/admin/pages/pricing/table/table.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { PricingTableComponent } from 'app/modules/admin/pages/pricing/table/table.component'; + +export const pricingTableRoutes: Route[] = [ + { + path : '', + component: PricingTableComponent + } +]; diff --git a/src/app/modules/admin/pages/profile/profile.component.html b/src/app/modules/admin/pages/profile/profile.component.html new file mode 100644 index 00000000..bc5c1328 --- /dev/null +++ b/src/app/modules/admin/pages/profile/profile.component.html @@ -0,0 +1,1836 @@ +
+ + +
+ + +
+ Cover image +
+ + +
+ + +
+ User avatar +
+ + +
+
Brian Hughes
+
London, UK
+
+ + + + + +
+
+ 200k + FOLLOWERS +
+
+ 1.2k + FOLLOWING +
+
+ + + + +
+ +
+ + +
+ + + + + +
+ + + +
Create Post
+
+
+ Card cover image +
Brian Hughes
+
+ + + +
+
+ + + + + + + + + + + +
+
+ + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+ Card cover image +
+ +
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+ + +
+
+
+ Card cover image + + + +
+
+ + + +
+
+
+
+
+
+ Card cover image +
+ + Rutherford Brannan Oh, I’m in.. Let’s arrange a trip for the next weekend if you want! + +
+ Like + + Reply + + Hide replies + + + 17 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Yes!! Let's talk about it on lunch! + +
+ Like + + Reply + + + 15 min +
+
+
+
+ Card cover image +
+ + Barbara Cotilla Count me in !!! + +
+ Like + + Reply + + + 12 min +
+
+
+
+ Card cover image +
+ + Alan Marti The color of the sky doesn’t look natural at all, do you really think this is natural? I’d say Photoshop! + Your trip isn't going to worth it since you won't be seeing this exact sky. + +
+ Like + + Reply + + Hide replies + + + 24 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Hey, Alan! You must be fun at parties! + +
+ Like + + Reply + + + 22 min +
+
+
+
+ Card cover image +
+ + Alan Marti Caroline, I'm telling the truth, and if you cannot stand the truth, maybe we shouldn't be friends anymore... + +
+ Like + + Reply + + + 20 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Dude! Relax! I'm just messing with you... + +
+ Like + + Reply + + + 18 min +
+
+
+
+ Card cover image +
+ + Alan Marti Sorry! I had a bad morning, let's talk about this in couple hours, I need to relax a bit :( + +
+ Like + + Reply + + + 16 min +
+
+
+
+ Card cover image +
+ + Marleah Eagleston Count me in, too! + +
+ Like + + Reply + + + 34 min +
+
+
+
+
+
+
+ + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+

+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. + Let's build some happy little clouds up here. I was blessed with a very steady hand; and it comes in very handy when you're doing these little delicate + things. This is the fun part. +

+

+ Isn't it great to do something you can't fail at? Little trees and bushes grow however makes them happy. + Trees get lonely too, so we'll give him a little friend. There are no mistakes. You can fix anything that happens. +

+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+ Card cover image +
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Hey!! I never saw this one, it was amazing.. I think I’m going to buy myself a set and try his technique at home! +
+
+
+
+ Card cover image +
+
+
Take a look behind the scenes of Rob Boss episodes
+
+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. +
+
example.com
+
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Hey!! I never saw this episode, it was amazing.. I think I’m going to buy myself a set and try his technique at home! +
+
+
+
+ Card cover image +
+
+
Rob Boss - Season 09 Episode 04
+
+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. +
+
example.com
+
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/pages/profile/profile.component.ts b/src/app/modules/admin/pages/profile/profile.component.ts new file mode 100644 index 00000000..1068add3 --- /dev/null +++ b/src/app/modules/admin/pages/profile/profile.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'profile', + templateUrl : './profile.component.html', + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ProfileComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/pages/profile/profile.module.ts b/src/app/modules/admin/pages/profile/profile.module.ts new file mode 100644 index 00000000..82701f77 --- /dev/null +++ b/src/app/modules/admin/pages/profile/profile.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { ProfileComponent } from 'app/modules/admin/pages/profile/profile.component'; +import { profileRoutes } from 'app/modules/admin/pages/profile/profile.routing'; + +@NgModule({ + declarations: [ + ProfileComponent + ], + imports : [ + RouterModule.forChild(profileRoutes), + MatButtonModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatTooltipModule, + FuseCardModule, + SharedModule + ] +}) +export class ProfileModule +{ +} diff --git a/src/app/modules/admin/pages/profile/profile.routing.ts b/src/app/modules/admin/pages/profile/profile.routing.ts new file mode 100644 index 00000000..4bde57d4 --- /dev/null +++ b/src/app/modules/admin/pages/profile/profile.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { ProfileComponent } from 'app/modules/admin/pages/profile/profile.component'; + +export const profileRoutes: Route[] = [ + { + path : '', + component: ProfileComponent + } +]; diff --git a/src/app/modules/admin/ui/angular-material/angular-material.component.html b/src/app/modules/admin/ui/angular-material/angular-material.component.html new file mode 100644 index 00000000..f532ae9c --- /dev/null +++ b/src/app/modules/admin/ui/angular-material/angular-material.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Angular Material +

+
+
+
+ + +
+ +
+ +

+ Fuse uses + Angular Material + + as its primary user interface library. It offers form controls, + buttons, tabs, sidebars, icons, modals, tooltips, data tables and many more well tested and + widely used components. +

+

+ Even though Fuse doesn't follow Google's Material design specifications, Angular Material + is one of the best Angular component libraries out there and since it's developed and maintained + by Google itself, it offers the best compatibility and support for Angular. +

+

+ Fuse is 100% compatible with all Angular Material components. +

+ +

Component examples and API documentation

+

+ Because it makes this demo app very heavy and unusable, we don't showcase any of the components + within this demo. It also makes it harder for us to upgrade to the latest version of the Angular + Material whenever there is a new version, simply because we have to update all the component demos + as well, and it's not an easy task. +

+

+ With that being said, you should always refer to the official docs, they always have the latest version + up and running so you won't end up with an outdated examples and/or API documentation. +

+ +

Official docs

+

+ Angular Material examples and API documentation: + https://material.angular.io/components/categories + +

+
+ +
+ +
diff --git a/src/app/modules/admin/ui/angular-material/angular-material.component.ts b/src/app/modules/admin/ui/angular-material/angular-material.component.ts new file mode 100644 index 00000000..5bce8e1a --- /dev/null +++ b/src/app/modules/admin/ui/angular-material/angular-material.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'angular-material', + templateUrl : './angular-material.component.html', + encapsulation: ViewEncapsulation.None +}) +export class AngularMaterialComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/angular-material/angular-material.module.ts b/src/app/modules/admin/ui/angular-material/angular-material.module.ts new file mode 100644 index 00000000..e9f50694 --- /dev/null +++ b/src/app/modules/admin/ui/angular-material/angular-material.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; +import { AngularMaterialComponent } from 'app/modules/admin/ui/angular-material/angular-material.component'; + +export const routes: Route[] = [ + { + path : '', + component: AngularMaterialComponent + } +]; + +@NgModule({ + declarations: [ + AngularMaterialComponent + ], + imports : [ + RouterModule.forChild(routes), + SharedModule + ] +}) +export class AngularMaterialModule +{ +} diff --git a/src/app/modules/admin/ui/animations/animations.component.html b/src/app/modules/admin/ui/animations/animations.component.html new file mode 100644 index 00000000..50308dc7 --- /dev/null +++ b/src/app/modules/admin/ui/animations/animations.component.html @@ -0,0 +1,2018 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Animations +

+
+
+
+ + +
+ +
+ +

+ Fuse provides set of ready-to-use animations for convenience. You can access them by importing the FuseAnimations and set it as the + animations property of the @Component metadata. +

+ +

Module

+ + +

Usage

+ + + + +

Animations

+ + + + +

Expand / Collapse

+ +

+ This animation can be triggered in two ways; +

+
    +
  1. + Adding [@expandCollapse]="state" to the element and toggling the state + between the 'collapsed' and 'expanded' strings manually. +
  2. +
  3. + Adding @expandCollapse to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@expandCollapse]="false" +

+ +
+ +
+
Expand / Collapse
+
+ + + +
+
+ + + + + + + +
+
+ Animated box +
+
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Shake

+

+ This animation can be triggered in two ways; +

+
    +
  1. + Adding [@shake]="state" to the element and toggling the state + between the false and true manually. +
  2. +
  3. + Adding @shake to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@shake]="false" +

+ +
+ +
+
Shake
+
+ + + +
+
+ + + + + + + +
+ +
+
+ Animated box +
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Fade In

+

+ Fade In animation can be triggered in two ways; +

+
    +
  1. + Adding [@fadeIn]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @fadeIn to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@fadeIn]="false" +

+ + Direction + + In + Top + Bottom + Left + Right + + + + +
+ +
+
Fade In
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade In Top
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade In Bottom
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade In Left
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade In Right
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Fade Out

+

+ Fade Out animation can be triggered in two ways; +

+
    +
  1. + Adding [@fadeOut]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @fadeOut to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@fadeOut]="false" +

+ + Direction + + Out + Top + Bottom + Left + Right + + + + +
+ +
+
Fade Out
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade Out Top
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade Out Bottom
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade Out Left
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Fade Out Right
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Slide In

+

+ Slide In animation can be triggered in two ways; +

+
    +
  1. + Adding [@slideIn]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @slideIn to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@slideIn]="false" +

+ + Direction + + Top + Bottom + Left + Right + + + + +
+ +
+
Slide In Top
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide In Bottom
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide In Left
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide In Right
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Slide Out

+

+ Slide Out animation can be triggered in two ways; +

+
    +
  1. + Adding [@slideOut]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @slideOut to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@slideOut]="false" +

+ + Direction + + Top + Bottom + Left + Right + + + + +
+ +
+
Slide Out Top
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide Out Bottom
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide Out Left
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + +
+ +
+
Slide Out Right
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Zoom In

+

+ Zoom In animation can be triggered in two ways; +

+
    +
  1. + Adding [@zoomIn]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @zoomIn to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@zoomIn]="false" +

+ +
+ +
+
Zoom In
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ + + + +

Zoom Out

+

+ Zoom Out animation can be triggered in two ways; +

+
    +
  1. + Adding [@zoomOut]="state" to the element and toggling the state + between the 'void' and '*' strings manually. +
  2. +
  3. + Adding @zoomOut to the element and using *ngIf to toggle the + element. +
  4. +
+

+ The animation can be disabled by setting the state to false; [@zoomOut]="false" +

+ +
+ +
+
Zoom Out
+
+ + + + + +
+
+ + + + + + + +
+ +
+
Animated box
+
+ +
+ +
+ +
+ + + + + + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/animations/animations.component.scss b/src/app/modules/admin/ui/animations/animations.component.scss new file mode 100644 index 00000000..3ff05f93 --- /dev/null +++ b/src/app/modules/admin/ui/animations/animations.component.scss @@ -0,0 +1,62 @@ +animations { + + .mat-form-field { + width: 100%; + margin-top: 32px; + } + + mat-tab-group { + + .mat-tab-header { + padding: 24px 0; + border-top-width: 1px; + } + + .mat-tab-body-wrapper { + + .mat-tab-body { + + &:first-child { + + .mat-tab-body-content { + display: flex; + justify-content: center; + min-height: 200px; + } + } + + .animated-box { + width: 120px; + height: 120px; + overflow: hidden; + border-radius: 4px; + cursor: pointer; + user-select: none; + + .animated-box-content { + display: flex; + align-items: center; + justify-content: center; + flex: 1 0 auto; + height: 100%; + text-align: center; + font-size: 12px; + font-weight: 500; + } + } + } + } + } + + .info { + @apply text-secondary bg-gray-400; + } + + .animated-box { + @apply bg-primary shadow-md; + + .animated-box-content { + @apply text-on-primary; + } + } +} diff --git a/src/app/modules/admin/ui/animations/animations.component.ts b/src/app/modules/admin/ui/animations/animations.component.ts new file mode 100644 index 00000000..de5e94b8 --- /dev/null +++ b/src/app/modules/admin/ui/animations/animations.component.ts @@ -0,0 +1,151 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'animations', + templateUrl : './animations.component.html', + styleUrls : ['./animations.component.scss'], + animations : FuseAnimations, + encapsulation: ViewEncapsulation.None +}) +export class AnimationsComponent +{ + animationStates: any; + visibilityStates: any; + + /** + * Constructor + */ + constructor() + { + // Set the defaults + this.animationStates = { + expandCollapse: 'expanded', + fadeIn : { + direction: 'in', + in : '*', + top : '*', + bottom : '*', + left : '*', + right : '*' + }, + fadeOut : { + direction: 'out', + out : '*', + top : '*', + bottom : '*', + left : '*', + right : '*' + }, + shake : { + shake: true + }, + slideIn : { + direction: 'top', + top : '*', + bottom : '*', + left : '*', + right : '*' + }, + slideOut : { + direction: 'top', + top : '*', + bottom : '*', + left : '*', + right : '*' + }, + zoomIn : { + in: '*' + }, + zoomOut : { + out: '*' + } + }; + + this.visibilityStates = { + expandCollapse: true, + fadeIn : { + in : true, + top : true, + bottom: true, + left : true, + right : true + }, + fadeOut : { + out : true, + top : true, + bottom: true, + left : true, + right : true + }, + shake : { + shake: true + }, + slideIn : { + top : true, + bottom: true, + left : true, + right : true + }, + slideOut : { + top : true, + bottom: true, + left : true, + right : true + }, + zoomIn : { + in: true + }, + zoomOut : { + out: true + } + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle animation state + * + * @param animation + * @param firstState + * @param secondState + * @param timeout + */ + toggleAnimationState(animation: string, firstState: string | boolean, secondState: string | boolean, timeout: number = 500): void + { + // Split the animation + const animationPath = animation.split('.'); + + // Toggle the animation state + this.animationStates[animationPath[0]][animationPath[1]] = firstState; + + setTimeout(() => { + this.animationStates[animationPath[0]][animationPath[1]] = secondState; + }, timeout); + } + + /** + * Toggle visibility state + * + * @param animation + * @param timeout + */ + toggleVisibilityState(animation: string, timeout: number = 500): void + { + // Split the animation + const animationPath = animation.split('.'); + + // Toggle the visibility status + this.visibilityStates[animationPath[0]][animationPath[1]] = false; + this.animationStates[animationPath[0]][animationPath[1]] = 'void'; + + setTimeout(() => { + this.visibilityStates[animationPath[0]][animationPath[1]] = true; + this.animationStates[animationPath[0]][animationPath[1]] = '*'; + }, timeout); + } + +} diff --git a/src/app/modules/admin/ui/animations/animations.module.ts b/src/app/modules/admin/ui/animations/animations.module.ts new file mode 100644 index 00000000..875e7bd9 --- /dev/null +++ b/src/app/modules/admin/ui/animations/animations.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { SharedModule } from 'app/shared/shared.module'; +import { AnimationsComponent } from 'app/modules/admin/ui/animations/animations.component'; + +export const routes: Route[] = [ + { + path : '', + component: AnimationsComponent + } +]; + +@NgModule({ + declarations: [ + AnimationsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatFormFieldModule, + MatSelectModule, + MatTabsModule, + FuseHighlightModule, + SharedModule + ] +}) +export class AnimationsModule +{ +} diff --git a/src/app/modules/admin/ui/cards/cards.component.html b/src/app/modules/admin/ui/cards/cards.component.html new file mode 100644 index 00000000..fb5fd024 --- /dev/null +++ b/src/app/modules/admin/ui/cards/cards.component.html @@ -0,0 +1,4263 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Cards +

+
+
+
+ + +
+ +
+ + + + {{filter | titlecase}} + ({{numberOfCards[filter]}}) + + + +
+ +
+ + + + Card cover image +
+
Most beautiful and quite places to see
+
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+
+ + + + + Card cover image +
+
Rocky mountain tops
+
Updated with 20 new locations
+
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+
+ + + + + + Card cover image +
+
Most beautiful and quite places to see
+
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+ +
+
+
+ +
+ +
+
+ Most beautiful and quite places to see +
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + You can bring your own food and have a little picnic on top of the amazing grasslands. +
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + You can bring your own food and have a little picnic on top of the amazing grasslands. +
+
+
+
+
+ + + + + Card cover image +
+
Rocky mountain tops
+
Updated with 20 new locations
+
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+ +
+
+
+ + + + + Card cover image +
+
Rocky mountain tops
+
Updated with 20 new locations
+
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+ +
+
+ + +
+
+
Open now:
+
08:00AM - 09:00PM
+
+
+
Entrance fee:
+
$20 (USD)
+
+
+
+
+ + + + + Card cover image +
+
TRAVEL
+
Most beautiful and quite places to see
+
+ Card cover image +
+ Galen Lewis + 23 hours ago +
+
+
+
+ + + + + Card cover image +
Most beautiful and quite places to see
+
+ + + + + Card cover image +
From rocky mountains to crystal clear lakes, there are the places you must see and enjoy.
+
+ + + + + Card cover image +
+
Rocky mountain tops
+
Updated with 20 new locations
+
+
+ + + + + Card cover image +
+
Most beautiful and quite places to see
+
+ +
+
+
+ + + + + Card cover image +
+
Rocky mountain tops
+
Updated with 20 new locations
+
+ +
+
+
+ + + + +
+
Most beautiful and quite places to see
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + In summers you can bring your food and have a little picnic on top of the amazing grasslands. + In winters you can still enjoy them but with couple of inches snow on top of those grasslands. +
+
+ +
+
+
+ + + + +
Most beautiful and quite places to see
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + In summers you can bring your food and have a little picnic on top of the amazing grasslands. + In winters you can still enjoy them but with couple of inches snow on top of those grasslands. +
+
+ + + + +
Rocky mountain tops
+
Updated with 20 new locations
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + In summers you can bring your food and have a little picnic on top of the amazing grasslands. + In winters you can still enjoy them but with couple of inches snow on top of those grasslands. +
+
+ + + + +
+ Card cover image +
+
Mountain tops
+
Travel locations
+
+
+
From rocky mountains to crystal clear lakes, these are the places you must see and enjoy.
+
+ +
+
+ + + + +
+
+
Mountain tops
+
Travel locations
+
+ Card cover image +
+
From rocky mountains to crystal clear lakes, these are the places you must see and enjoy.
+
+ +
+
+ + + + +
+ Card cover image +
+
+
Mountain tops and clear lakes
+
Updated with 20 new locations
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + You can bring your own food and have a little picnic on top of the amazing grasslands. +
+
+ +
+
+
+ + + + +
+
Mountain tops and clear lakes
+
Updated with 20 new locations
+
+ From rocky mountains to crystal clear lakes, these are the places you must see and enjoy. + You can bring your own food and have a little picnic on top of the amazing grasslands. +
+
+ +
+
+
+ Card cover image +
+
+ + + + + Card cover image +
+
Puzzles Coffee Shop
+
+
+ + + + + +
+
4.5
+
+
98 reviews
+
+
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ + +
+
+
+ + + + +
Puzzles Coffee Shop
+
+
+ + + + + +
+
4.5
+
+
98 reviews
+
+
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. It's quiet; far away from busy streets and never ending constructions. +
+
+ + +
+
+ + + + +
+ Card cover image +
+
+
Puzzles Coffee Shop
+
+
+ + + + + +
+
4.5
+
+
98 reviews
+
+
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ + +
+
+
+ + + + +
+
Puzzles Coffee Shop
+
+
+ + + + + +
+
4.5
+
+
98 reviews
+
+
+
+ $$ + + Arabian, Brazilian, Colombian +
+
+ 774 Riverview St. +
+
+ Open + + 07:00AM Weekdays + + 10:00AM Weekends +
+
+
+ + +
+
+
+ Card cover image +
+
+ + + + +
+
News
+
+ + + + +
+
+
+
+ +
20% OFF in your favorite hats shop on next Friday.
+
+
+ +
Upcoming meetups within 20 miles. + See details + +
+
+
+ +
Concerts from your favorite bands available within 100 miles. + See details + +
+
+
+
+ +
+
+ + + + +
+
Groups
+
+ + + + +
+
+
+
+ Card cover image +
+
The Port Cafe
+
Best cafe of the downtown New York
+
1.2k followers
+
+
+
+ Card cover image +
+
Design House LLC.
+
UI/UX, brand and product design
+
957 followers
+
+
+
+ Card cover image +
+
Crax Laser Tag
+
30% off with group of 6 people
+
342 followers
+
+
+
+ Card cover image +
+
Roadster Clothing Inc.
+
$25 off on orders $500 and over
+
4.7k followers
+
+
+
+
+ +
+
+ + + + +
+
Friend Suggestions
+
+ + + + +
+
+
+
+ Card cover image +
+
Amelia Edwards
+
3 mutual friends
+
+
+
+ Card cover image +
+
Lew Silverton
+
3 mutual friends
+
+
+
+ Card cover image +
+
Leanne Simpson
+
Went to same high school
+
+
+
+ Card cover image +
+
Cecilia Pozo
+
Went to same college
+
+
+
+
+ +
+
+ + + + +
+
Activity Feed
+
+ + + + +
+
+
+
+ Card cover image +
+
Amelia Edwards commented on John Silverton's photo
+
4 minutes ago
+
+
+
+ Card cover image +
+
Lew Silverton changed his profile photo
+
25 minutes ago
+
+
+
+ Card cover image +
+
Brian Hughes liked your photo
+
3 hours ago
+
+
+
+ Card cover image +
+
Marleah Eagleston commented on John Silverton's photo
+
Yesterday
+
+
+
+
+ +
+
+ + + + +
+
Shopping List
+
+ + + + + + +
+
+
+ + Tomatoes + + + Milk + + + Eggs + + + Bread + + + Coffee + + + Olives + + + Sour Cream + + + Peanut Butter + + + Strawberry Jam + + + Cheese + +
+
+ +
+
+ + + + +
+
Today's Tasks
+
+ + + + + +
+
+
+ + USER INTERFACE (5) +
+
+ + Design user profile + + + Design dashboard + + + Create auth flow prototype + + + Re-design auth pages + + + Design landing page + +
+
+ + DESIGN SYSTEM (3) +
+
+ + Refine basic elements + + + List all the re-usable elements + + + Add standard form elements + +
+
+ + + + +
+
Daily Schedule
+
+ + + + + +
+
+
+
+
Code review
+
11:00 AM
+
+
+
Lunch with Sam
+
12:30 PM
+
+
+
Presentation of weekly usage and analytics report
+
01:45 PM
+
+
+
Meeting with new interns
+
02:30 PM
+
+
+
Coffee break & John's birthday
+
03:30 PM
+
+
+
Dinner with wife and kids
+
07:30 PM
+
+
+
+ + + + +
Customer Reviews
+
+ 4.74 average based on 508 reviews +
+
+
+
5 star
+ +
87%
+
+
+
4 star
+ +
7%
+
+
+
3 star
+ +
1%
+
+
+
2 star
+ +
1%
+
+
+
1 star
+ +
2%
+
+
+
+ +
+
+ + + + +
+
Followers
+
+ + + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+
+ +
+
+ + + + +
+
Gallery
+
+ + + + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+
+ +
+
+ + + + + Card cover image +
+
+
+
FURNISHED MANSION
+
USD $24.000.000
+
+ +
+
+ + +
+
+
+ + + + + Card cover image +
+
+
+
FURNISHED MANSION
+
USD $24.000.000
+
1 E. Pumpkin Hill Drive
+
+ +
+
+
+ 10 beds + + 4 baths + + 21k sqft. +
+
+
+ + +
+
+
+ + + + +
+ +
+
Support
+
Contact support to learn more about our products and get professional help
+ +
+ + + + + +
Branding & Product Design
+
Brand strategy, purpose, and product positioning
+
+ Card cover image + Card cover image + Card cover image + Card cover image + Card cover image +
+
+13 more
+ +
+ + + + + Card cover image +
Brian Hughes
+
London, UK
+
+
+
+ 1.2k + POSTS +
+
+ 200k + FOLLOWERS +
+
+ 1.2k + FOLLOWING +
+
+
+
I’m a friendly kitchen assistant who suffers from a severe phobia of buttons
+ +
+ + + + +
About Me
+
+ I’m a friendly kitchen assistant who suffers from a severe phobia of buttons. +

+ Brother of Elijah Jay Watkins, who has phobia of buttons and trust issues. +
+
+
+
+ + London, UK +
+
+ + ACME Corp. Lead UX Designer +
+
+ + April, 24 +
+
+ +
+ + + + +
+ Card cover image +
+
+
+ Card cover image +
+
+
+
+
+
Brian Hughes
+
London, UK
+
+
+ +
+
+
+
+
4 mutual friends
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
+
+
+
+ + + + + Card cover image +
+
Brian Hughes
+
London, UK
+
+
+ + + + +
+
Brian Hughes
+
London, UK
+
+ Card cover image +
+ + + + + Card cover image +
+
Brian Hughes
+
Head of HR Department
+
h.brian@company.com
+
+
+ + + + +
+
Brian Hughes
+
Head of HR Department
+
h.brian@company.com
+
+ Card cover image +
+ + + + + +
+
1 new mail
+
Mailbox
+
+
+ + + + +
+
New message
+
from John Balista
+
+ +
+ + + + + Card cover image +
+
Lavender Bouquet
+
USD $5
+
5 left in stock
+
+
+ + + + +
+
Lavender Bouquet
+
USD $5
+
5 left in stock
+
+ Card cover image +
+ + + + +
Personal
+
Perfect for an individual or a small team starting to get bigger
+
+ +
+
USD
+
$6.00
+
+ +
+
billed monthly
+
$6.00 billed yearly
+
+ + + +
+
Core features, including:
+
+
+ +
10 projects
+
+
+ +
5GB storage
+
+
+ +
Analytics
+
+
+ +
Free mobile app
+
+
+ +
Access to forums
+
+
+
+
+ + + + +
Personal
+ +
+
$6
+
/ month
+
+ +
+
billed monthly
+
$6.00 billed yearly
+
+ +
+
10 projects
+
5GB storage
+
Analytics
+
Free mobile app
+
Access to forums
+
+ + +
+ + + +
+
Lifetime Membership
+
+ Learn from like-minded individuals which are eager to make a living building stuff on the web. Pay once and get lifetime access to the community. +
+
+
INCLUDED FEATURES
+
+
+ +
+
+ +
Private forum access
+
+
+ +
Access to annual online conference
+
+
+ +
Member resources
+
+
+ +
Official member T-Shirt
+
+
+
+ +
+
+
$599
+
USD
+
+
+
No monthly subscription,
+
you only pay once.
+
+ +
+
+ + + + +
+
+ + +
+ Card cover image +
+
+
+
Black sneakers with white stripes
+
$240.00
+
+
+
+ Select a size: + 39 + 40 + 41 + 42 + 43 +
+
+ +
+
+
+ + + + +
+ Card cover image +
+
+
Gray sneakers with white stripes
+
ALIDAS
+
$240.00
+
+ Select a size: + 39 + 40 + 41 + 42 + 43 +
+
+
+ + + +
+
+
+ + + + +
+ Card cover image +
+
+
+
White sneakers with red stripes
+
$240.00
+
+
+ White sneakers are made of natural, biodegradable material. This feature alione makes them extremely nature friendly. +
+
+ Select a size: + 39 + 40 + 41 + 42 + 43 +
+
+
+ + + +
+
+
+ + + + + +
+            + Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ — Melissa Morillo, Comtent +
+
+ + + + +
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ + Card cover image + + MELISSA MORILLO + COMTENT +
+
+ + + + +
+ Card cover image +
+
+
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ — Melissa Morillo, Comtent +
+
+
+ + + + + Card cover image +
+
+ Puzzles coffee shop is one of the finest coffee shops in central downtown in New York. + It's quiet; far away from busy streets and never ending constructions. +
+
+ — Melissa Morillo, Comtent +
+
+
+ + + + +
Create Post
+
+
+ Card cover image +
Brian Hughes
+
+ + + +
+
+ + + + + + + + + + + +
+
+ + + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+ Card cover image +
+ +
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+ + +
+
+
+ Card cover image + + + +
+
+ + + +
+
+
+
+
+
+ Card cover image +
+ + Rutherford Brannan Oh, I’m in.. Let’s arrange a trip for the next weekend if you want! + +
+ Like + + Reply + + Hide replies + + + 17 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Yes!! Let's talk about it on lunch! + +
+ Like + + Reply + + + 15 min +
+
+
+
+ Card cover image +
+ + Barbara Cotilla Count me in !!! + +
+ Like + + Reply + + + 12 min +
+
+
+
+ Card cover image +
+ + Alan Marti The color of the sky doesn’t look natural at all, do you really think this is natural? I’d say Photoshop! + Your trip isn't going to worth it since you won't be seeing this exact sky. + +
+ Like + + Reply + + Hide replies + + + 24 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Hey, Alan! You must be fun at parties! + +
+ Like + + Reply + + + 22 min +
+
+
+
+ Card cover image +
+ + Alan Marti Caroline, I'm telling the truth, and if you cannot stand the truth, maybe we shouldn't be friends anymore... + +
+ Like + + Reply + + + 20 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Dude! Relax! I'm just messing with you... + +
+ Like + + Reply + + + 18 min +
+
+
+
+ Card cover image +
+ + Alan Marti Sorry! I had a bad morning, let's talk about this in couple hours, I need to relax a bit :( + +
+ Like + + Reply + + + 16 min +
+
+
+
+ Card cover image +
+ + Marleah Eagleston Count me in, too! + +
+ Like + + Reply + + + 34 min +
+
+
+
+
+
+
+ + + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+ Card cover image +
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Marleah Eagleston + 29 minutes ago +
+ + + + + + + + + + +
+
+ Look at that sky! I so want to be there.. Can we arrange a trip? Is that a possibility? Please!!! +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+
+ Card cover image +
+
+ Card cover image +
+
+
+ +12 + +
+ Card cover image +
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+

+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. + Let's build some happy little clouds up here. I was blessed with a very steady hand; and it comes in very handy when you're doing these little delicate + things. This is the fun part. +

+

+ Isn't it great to do something you can't fail at? Little trees and bushes grow however makes them happy. + Trees get lonely too, so we'll give him a little friend. There are no mistakes. You can fix anything that happens. +

+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Hey!! I never saw this episode, it was amazing.. I think I’m going to buy myself a set and try his technique at home! +
+
+
+
+ Card cover image +
+
+
Rob Boss - Season 09 Episode 04
+
+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. +
+
example.com
+
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+ Card cover image +
+ Caroline Lundu + 29 minutes ago +
+ + + + + + + + + + +
+
+ Hey!! I never saw this one, it was amazing.. I think I’m going to buy myself a set and try his technique at home! +
+
+
+
+ Card cover image +
+
+
Take a look behind the scenes of Rob Boss episodes
+
+ We'll put a happy little sky in here. We touch the canvas, the canvas takes what it wants. A little happy sunlight shining through there. +
+
example.com
+
+
+
+
+ + + +
+
+
+
+ Card cover image + Card cover image + Card cover image + Card cover image +
You and 24 more liked this
+
+ +
+ + +
+
+
+ + + + +
+
+ Card cover image + + + +
+
+ + + +
+
+
+
+
+
+ Card cover image +
+ + Rutherford Brannan Oh, I’m in.. Let’s arrange a trip for the next weekend if you want! + +
+ Like + + Reply + + Hide replies + + + 17 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Yes!! Let's talk about it on lunch! + +
+ Like + + Reply + + + 15 min +
+
+
+
+ Card cover image +
+ + Barbara Cotilla Count me in !!! + +
+ Like + + Reply + + + 12 min +
+
+
+
+ Card cover image +
+ + Alan Marti The color of the sky doesn’t look natural at all, do you really think this is natural? I’d say Photoshop! + Your trip isn't going to worth it since you won't be seeing this exact sky. + +
+ Like + + Reply + + Hide replies + + + 24 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Hey, Alan! You must be fun at parties! + +
+ Like + + Reply + + + 22 min +
+
+
+
+ Card cover image +
+ + Alan Marti Caroline, I'm telling the truth, and if you cannot stand the truth, maybe we shouldn't be friends anymore... + +
+ Like + + Reply + + + 20 min +
+
+
+
+ Card cover image +
+ + Caroline Lundu Dude! Relax! I'm just messing with you... + +
+ Like + + Reply + + + 18 min +
+
+
+
+ Card cover image +
+ + Alan Marti Sorry! I had a bad morning, let's talk about this in couple hours, I need to relax a bit :( + +
+ Like + + Reply + + + 16 min +
+
+
+
+ Card cover image +
+ + Marleah Eagleston Count me in, too! + +
+ Like + + Reply + + + 34 min +
+
+
+
+
+
+
+ +
+ +
diff --git a/src/app/modules/admin/ui/cards/cards.component.ts b/src/app/modules/admin/ui/cards/cards.component.ts new file mode 100644 index 00000000..187adc9f --- /dev/null +++ b/src/app/modules/admin/ui/cards/cards.component.ts @@ -0,0 +1,131 @@ +import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, QueryList, Renderer2, ViewChildren, ViewEncapsulation } from '@angular/core'; +import { MatButtonToggleChange } from '@angular/material/button-toggle'; +import { FuseCardComponent } from '@fuse/components/card'; + +@Component({ + selector : 'cards', + templateUrl : './cards.component.html', + styles : [ + ` + cards fuse-card { + margin: 16px; + } + ` + ], + encapsulation : ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CardsComponent implements AfterViewInit +{ + @ViewChildren(FuseCardComponent, {read: ElementRef}) private _fuseCards: QueryList; + + filters: string[] = ['all', 'article', 'listing', 'list', 'info', 'shopping', 'pricing', 'testimonial', 'post', 'interactive']; + numberOfCards: any = {}; + selectedFilter: string = 'all'; + + /** + * Constructor + */ + constructor(private _renderer2: Renderer2) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * After view init + */ + ngAfterViewInit(): void + { + // Calculate the number of cards + this._calcNumberOfCards(); + + // Filter the cards for the first time + this._filterCards(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On filter change + * + * @param change + */ + onFilterChange(change: MatButtonToggleChange): void + { + // Set the filter + this.selectedFilter = change.value; + + // Filter the cards + this._filterCards(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + private _calcNumberOfCards(): void + { + // Prepare the numberOfCards object + this.numberOfCards = {}; + + // Prepare the count + let count = 0; + + // Go through the filters + this.filters.forEach((filter) => { + + // For each filter, calculate the card count + if ( filter === 'all' ) + { + count = this._fuseCards.length; + } + else + { + count = this.numberOfCards[filter] = this._fuseCards.filter((fuseCard) => fuseCard.nativeElement.classList.contains('filter-' + filter)).length; + } + + // Fill the numberOfCards object with the counts + this.numberOfCards[filter] = count; + }); + } + + /** + * Filter the cards based on the selected filter + * + * @private + */ + _filterCards(): void + { + // Go through all fuse-cards + this._fuseCards.forEach((fuseCard) => { + + // If the 'all' filter is selected... + if ( this.selectedFilter === 'all' ) + { + // Remove hidden class from all cards + fuseCard.nativeElement.classList.remove('hidden'); + } + // Otherwise... + else + { + // If the card has the class name that matches the selected filter... + if ( fuseCard.nativeElement.classList.contains('filter-' + this.selectedFilter) ) + { + // Remove the hidden class + fuseCard.nativeElement.classList.remove('hidden'); + } + // Otherwise + else + { + // Add the hidden class + fuseCard.nativeElement.classList.add('hidden'); + } + } + }); + } +} diff --git a/src/app/modules/admin/ui/cards/cards.module.ts b/src/app/modules/admin/ui/cards/cards.module.ts new file mode 100644 index 00000000..363c3c17 --- /dev/null +++ b/src/app/modules/admin/ui/cards/cards.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { CardsComponent } from 'app/modules/admin/ui/cards/cards.component'; + +export const routes: Route[] = [ + { + path : '', + component: CardsComponent + } +]; + +@NgModule({ + declarations: [ + CardsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatButtonToggleModule, + MatCheckboxModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatProgressBarModule, + MatTooltipModule, + FuseCardModule, + SharedModule + ] +}) +export class CardsModule +{ +} diff --git a/src/app/modules/admin/ui/colors/colors.component.html b/src/app/modules/admin/ui/colors/colors.component.html new file mode 100644 index 00000000..c4ca72a7 --- /dev/null +++ b/src/app/modules/admin/ui/colors/colors.component.html @@ -0,0 +1,143 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Colors +

+
+
+
+ + +
+ +
+ +

+ Since Fuse uses Tailwind, all color related utilities such as text-red-50 or bg-indigo-900 + are available by default and they can be configured using Tailwind's configuration. +

+ +

+ In addition to default Tailwind colors, Fuse also provides utilities that changes depending on the selected theme. + These utilities are meant to be used in places where you want to have a theme dependent colors such as buttons, + backgrounds or texts. +

+ +

Primary, Accent & Warn

+

+ Fuse provides Primary, Accent and Warn utilities to go with + Angular Material theming. These utilities hold variable colors and they change depending on the selected theme color. +

+

+ Having these utilities allow you to have dynamic theming throughout your application without hard coding any colors. + Each of these utilities also have a complementary .text-on-XXX utility to provide a contrasting text color. +

+
+
+
+
Primary
+
+ bg-primary + text-on-primary +
+
+
Accent
+
+ bg-accent + text-on-accent +
+
+
Warn
+
+ bg-warn + text-on-warn +
+
+
Primary 200
+
+ bg-primary-200 + text-on-primary-200 +
+
+
Accent 300
+
+ bg-accent-300 + text-on-accent-300 +
+
+
Warn 400
+
+ bg-warn-400 + text-on-warn-400 +
+
+
+

+ You can change the theme from the Settings panel to observe the primary color changing. +

+

+ These variable colors have different hue values just like a default Tailwind color palette and + they are also available for other Tailwind color utilities such as border, ring and etc: +

+

+ bg-primary-50, text-accent-900, text-on-warn-500, border-primary, + ring-warn-600 ... +

+ + +

Text and Background colors

+

+ Fuse also provides set of utilities to have consistent text and background colors throughout your application without + hard coding any colors. They also allow working with dark variant of the selected theme. +

+

+ For example, a text node with a .text-secondary class will have a proper lighter color compared to main text color + depending on the selected scheme. +

+

+ Here's the complete list of the available text and background utilities: +

+
+
+
.text-default
+
.text-secondary
+
.text-hint
+
.text-disabled
+
.divider
+
+
+
.bg-card
+
.bg-default
+
.bg-dialog
+
.bg-hover
+
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/colors/colors.component.ts b/src/app/modules/admin/ui/colors/colors.component.ts new file mode 100644 index 00000000..fd7aed8e --- /dev/null +++ b/src/app/modules/admin/ui/colors/colors.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'colors', + templateUrl : './colors.component.html', + animations : FuseAnimations, + encapsulation: ViewEncapsulation.None +}) +export class ColorsComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/colors/colors.module.ts b/src/app/modules/admin/ui/colors/colors.module.ts new file mode 100644 index 00000000..62573086 --- /dev/null +++ b/src/app/modules/admin/ui/colors/colors.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatRippleModule } from '@angular/material/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTabsModule } from '@angular/material/tabs'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { SharedModule } from 'app/shared/shared.module'; +import { ColorsComponent } from 'app/modules/admin/ui/colors/colors.component'; + +export const routes: Route[] = [ + { + path : '', + component: ColorsComponent + } +]; + +@NgModule({ + declarations: [ + ColorsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatIconModule, + MatRippleModule, + MatTabsModule, + FuseHighlightModule, + SharedModule + ] +}) +export class ColorsModule +{ +} diff --git a/src/app/modules/admin/ui/datatable/datatable.component.html b/src/app/modules/admin/ui/datatable/datatable.component.html new file mode 100644 index 00000000..b73d82e3 --- /dev/null +++ b/src/app/modules/admin/ui/datatable/datatable.component.html @@ -0,0 +1,52 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Datatable +

+
+
+
+ + +
+ +
+ +

+ Since Fuse uses Angular Material, it's also possible to use their Table component. It offers base features like filtering, sorting and pagination as well as + some advanced ones like column re-ordering, column and row freezing and expandable rows. +

+ +

Examples

+

+ To keep this page simple and the Demo app as light as possible, we didn't add any examples here. Examples already can be found throughout the Demo app and also the + official Angular Material documentation has plenty of examples to get you started. +

+ +

Official docs

+

+ Angular Material Table examples and API documentation: + https://material.angular.io/components/table/overview + +

+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/datatable/datatable.component.ts b/src/app/modules/admin/ui/datatable/datatable.component.ts new file mode 100644 index 00000000..6c507c81 --- /dev/null +++ b/src/app/modules/admin/ui/datatable/datatable.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'datatable', + templateUrl : './datatable.component.html', + encapsulation: ViewEncapsulation.None +}) +export class DatatableComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/datatable/datatable.module.ts b/src/app/modules/admin/ui/datatable/datatable.module.ts new file mode 100644 index 00000000..97a62ef9 --- /dev/null +++ b/src/app/modules/admin/ui/datatable/datatable.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; +import { DatatableComponent } from 'app/modules/admin/ui/datatable/datatable.component'; + +export const routes: Route[] = [ + { + path : '', + component: DatatableComponent + } +]; + +@NgModule({ + declarations: [ + DatatableComponent + ], + imports : [ + RouterModule.forChild(routes), + SharedModule + ] +}) +export class DatatableModule +{ +} diff --git a/src/app/modules/admin/ui/forms/fields/fields.component.html b/src/app/modules/admin/ui/forms/fields/fields.component.html new file mode 100644 index 00000000..e2e54c5b --- /dev/null +++ b/src/app/modules/admin/ui/forms/fields/fields.component.html @@ -0,0 +1,770 @@ +
+ + +
+
+ +
+ +
+ + Forms +
+
+ +
+

+ Fields +

+
+
+
+ + +
+ +
+ +
+

+ By default, Fuse changes the default form field appearance to fill and heavily modifies it to provide a more unique and consistent look. We + DO NOT recommend using any other form field styles as they are not optimized for Fuse. +

+

Appearance

+

+ Here's a very simple form layout to showcase the form fields. +

+
+ +
+
+ + First name + + + + + Last name + + + +
+
+ + Address + + + +
+
+ + City + + + + + State + + + +
+
+ + Postal code + + {{postalCode.value.length}} / 5 + + +
+
+ +
+

Labels and Placeholders

+

+ Following form contains examples to showcase different label and placeholder styles. All fields in this example are standard text inputs but everything + you see here can also be applied to other input types such as textarea, select, chips etc. +

+
+ +
+ + + + + Label + + + + Label and Placeholder + + + + Label and Placeholder on focus + + +
+ +
+

Field variations

+

+ Following form contains examples to showcase form field variations. In addition to the heavy modifications, + Fuse also provides set of helper classes to further modify the style of the form fields. +

+

Required classes

+
    +
  • +

    .fuse-mat-textarea

    +

    + This helper class is required if you are using a textarea as your input. Since Angular Material doesn't differentiate a textarea from a + normal input while using them with mat-form-field, this helper class is required for textarea inputs to look good and + consistent. +

    +
  • +
+ + + +

Optional classes

+
    +
  • +

    .fuse-mat-dense

    +

    + Provides set of adjustments to make the fields denser. Dense fields are suitable for non-form usages and places where there isn't much space to work with such + as small dialogs, menus, popovers and etc. +

    +
  • +
  • +

    .fuse-mat-rounded

    +

    Provides set of adjustments to make the fields look fully rounded.

    +
  • +
  • +

    .fuse-mat-no-subscript

    +

    + Provides set of adjustments to remove the bottom spacing where hint and error messages placed. This helper is particularly useful to align the + field easily if you don't need to show error messages or hint text. For example a search bar in the toolbar uses this helper to fit the field to the toolbar + without having an extra bottom spacing. +

    +
  • +
  • +

    .fuse-mat-emphasized-affix

    +

    + Provides set of adjustments to emphasize the field prefix and suffix by changing their background color and adding a border around them. +

    +
  • +
+ +

Usage

+

+ <mat-form-field class="{{getFormFieldHelpersAsString()}}">...<mat-form-field> +

+

+ + Dense + Rounded + No subscript + Emphasized affix + +

+ +

With mat-label

+
+ +
+
+ + Input + + This is a hint text + +
+
+ + Input with mat-icon as prefix & suffix + + + + +
+
+ + Input with mat-icon-button as prefix & suffix + + + + +
+
+ + Input with text prefix & suffix + + $ + .00 + +
+
+ + Right aligned input with text prefix & suffix + + $ + .00 + +
+
+ + Input with mat-select as prefix & suffix + + + EU + US + + + kg + gr + oz + + +
+
+ + Textarea + + +
+
+ + Textarea with prefix & suffix + + + + +
+
+ + Textarea with autosize + + +
+
+ + Textarea with autosize, prefix & suffix + + + + +
+
+ + Select with prefix + + Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 + Select 1-2 + Select 1-3 + + + + + Select with suffix + + Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 + Select 2-2 + Select 2-3 + + + +
+
+ + Native select with prefix + + + + + Native select with suffix + + + +
+
+ + + + Lemon + + + + Lime + + + + Apple + + + + + +
+
+ + Choose a date + + + + +
+
+ +
+

Without mat-label

+
+ +
+
+ + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + $ + .00 + +
+
+ + + $ + .00 + +
+
+ + + + EU + US + + + kg + gr + oz + + +
+
+ + + +
+
+ + + + + +
+
+ + + +
+
+ + + + + +
+
+ + + Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 Select 1-1 + Select 1-2 + Select 1-3 + + + + + + Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 Select 2-1 + Select 2-2 + Select 2-3 + + + +
+
+ + + + + + + + +
+
+ + + + Lemon + + + + Lime + + + + Apple + + + + + +
+
+ + + + + +
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/forms/fields/fields.component.ts b/src/app/modules/admin/ui/forms/fields/fields.component.ts new file mode 100644 index 00000000..26dc8e61 --- /dev/null +++ b/src/app/modules/admin/ui/forms/fields/fields.component.ts @@ -0,0 +1,31 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; + +@Component({ + selector : 'forms-fields', + templateUrl : './fields.component.html', + encapsulation: ViewEncapsulation.None +}) +export class FormsFieldsComponent +{ + formFieldHelpers: string[] = ['']; + + /** + * Constructor + */ + constructor(private _formBuilder: FormBuilder) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get the form field helpers as string + */ + getFormFieldHelpersAsString(): string + { + return this.formFieldHelpers.join(' '); + } +} diff --git a/src/app/modules/admin/ui/forms/fields/fields.module.ts b/src/app/modules/admin/ui/forms/fields/fields.module.ts new file mode 100644 index 00000000..d6b6f28c --- /dev/null +++ b/src/app/modules/admin/ui/forms/fields/fields.module.ts @@ -0,0 +1,50 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; +import { MatSelectModule } from '@angular/material/select'; +import { FuseAutogrowModule } from '@fuse/directives/autogrow'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { SharedModule } from 'app/shared/shared.module'; +import { FormsFieldsComponent } from 'app/modules/admin/ui/forms/fields/fields.component'; + +export const routes: Route[] = [ + { + path : '', + component: FormsFieldsComponent + } +]; + +@NgModule({ + declarations: [ + FormsFieldsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatButtonToggleModule, + MatChipsModule, + MatDatepickerModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatMomentDateModule, + MatSelectModule, + FuseAutogrowModule, + FuseHighlightModule, + SharedModule + ] +}) +export class FormsFieldsModule +{ +} diff --git a/src/app/modules/admin/ui/forms/layouts/layouts.component.html b/src/app/modules/admin/ui/forms/layouts/layouts.component.html new file mode 100644 index 00000000..971a6547 --- /dev/null +++ b/src/app/modules/admin/ui/forms/layouts/layouts.component.html @@ -0,0 +1,971 @@ +
+ + +
+
+ +
+ +
+ + Forms +
+
+ +
+

+ Layouts +

+
+
+
+ + +
+ +
+ +
+

+ Forms are one of the most important and most used components of any web application. Below, you can find couple of ready to use form layout examples which you + can use as the base of your own forms. +

+
+ + +
+

Sectioned form with dividers

+

+ This sectioned form example uses dividers to separate the different sections of the form. Form fields uses placeholders and don't have separate labels + for more compact look. +

+
+ +
+

Basic information

+

+ Set your login preferences, help us personalize your experience and make big account changes here +

+
+ + + + +
+
+ + + Country 1 + Country 2 + Country 3 + + + + + + Language 1 + Language 2 + Language 3 + + + +
+ + + +

Profile

+

+ People here will get to know you with this information +

+
+ + + + + + + + +
+
+ + + www.example.com/ + +
+
+ + + + +
+ + + +

Notifications

+

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+ +
+ + +
+
+ + + +
+

Sectioned form with dividers #2

+

+ This sectioned form example uses dividers to separate the different sections of the form, section title and description is horizontally aligned with the section + fields. Form fields uses mat-label to have separate labels as well as placeholders for hints. +

+
+ +
+
+
+

Basic information

+

+ Set your login preferences, help us personalize your experience and make big account changes here +

+
+
+
+ + Email Address + + + +
+
+ + Country / Region + + Country 1 + Country 2 + Country 3 + + + +
+
+ + Language + + Language 1 + Language 2 + Language 3 + + + +
+
+
+ + + +
+
+

Profile

+

+ People here will get to know you with this information +

+
+
+
+ + First name + + + +
+
+ + Last name + + + +
+
+ + Username + + www.example.com/ + +
+
+ + About + + + +
+
+
+ + + +
+
+

Notifications

+

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+
+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ +
+ + +
+
+ + + +
+

Sectioned form with dividers #3

+

+ This sectioned form example uses dividers and colors to separate the different sections of the form. Form fields have labels and dense style. +

+
+ +
+
+

Basic information

+

Set your login preferences, help us personalize your experience and make big account changes here

+
+
+ + Email Address + + + + Country / Region + + Country 1 + Country 2 + Country 3 + + + + Language + + Language 1 + Language 2 + Language 3 + + +
+ +
+

Profile

+

People here will get to know you with this information

+
+
+ + First name + + + + Last name + + + + Username + + www.example.com/ + + + About + + +
+ +
+

Notifications

+

We'll always let you know about important changes, but you pick what else you want to hear about.

+
+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+ +
+ + +
+
+ + + +
+

Sectioned form with separate cards

+

+ This sectioned form example uses cards to separate the sections of the form. This kind of form layouts are more suitable for Settings or similar pages. +

+
+ +
+ +
+

Basic information

+

+ Set your login preferences, help us personalize your experience and make big account changes here +

+ +
+ + + + +
+
+ + + Country 1 + Country 2 + Country 3 + + + + + + Language 1 + Language 2 + Language 3 + + + +
+
+ +
+

Profile

+

+ People here will get to know you with this information +

+ +
+ + + + + + + + +
+
+ + + www.example.com/ + +
+
+ + + + +
+
+ +
+

Notifications

+

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+ +
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ +
+ + +
+ +
+ + +
+

Sectioned form with separate cards #2

+

+ This sectioned form example uses cards and whitespace to separate the different sections of the form, section title and description is horizontally aligned with + the section fields. Form fields have labels and dense style. +

+
+ +
+
+
+

Basic information

+

+ Set your login preferences, help us personalize your experience and make big account changes here +

+
+
+ + Email Address + + + + Country / Region + + Country 1 + Country 2 + Country 3 + + + + Language + + Language 1 + Language 2 + Language 3 + + +
+
+ +
+
+

Profile

+

+ People here will get to know you with this information +

+
+
+ + First name + + + + Last name + + + + Username + + www.example.com/ + + + About + + +
+
+ +
+
+

Notifications

+

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+
+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ +
+ + +
+
+ + +
+

Sectioned form with separate cards #3

+

+ This sectioned form example uses cards and whitespace to separate the different sections of the form, section title and description is horizontally aligned with + the section fields. Form fields have separate labels and dense style. +

+
+ +
+
+
+

Basic information

+

Set your login preferences, help us personalize your experience and make big account changes here

+
+ +
+
+ Email Address + + + +
+
+ Country / Region + + + Country 1 + Country 2 + Country 3 + + +
+
+ Language + + + Language 1 + Language 2 + Language 3 + + +
+
+
+ +
+
+

Profile

+

People here will get to know you with this information

+
+ +
+
+ First name + + + +
+
+ Last name + + + +
+
+ Username + + + www.example.com/ + +
+
+ About + + + +
+
+
+ +
+
+

Notifications

+

We'll always let you know about important changes, but you pick what else you want to hear about.

+
+ +
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ +
+ + +
+
+ +
+ +
+
+ diff --git a/src/app/modules/admin/ui/forms/layouts/layouts.component.ts b/src/app/modules/admin/ui/forms/layouts/layouts.component.ts new file mode 100644 index 00000000..31b06388 --- /dev/null +++ b/src/app/modules/admin/ui/forms/layouts/layouts.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'forms-layouts', + templateUrl : './layouts.component.html', + encapsulation: ViewEncapsulation.None +}) +export class FormsLayoutsComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/forms/layouts/layouts.module.ts b/src/app/modules/admin/ui/forms/layouts/layouts.module.ts new file mode 100644 index 00000000..13a7e8e9 --- /dev/null +++ b/src/app/modules/admin/ui/forms/layouts/layouts.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { SharedModule } from 'app/shared/shared.module'; +import { FormsLayoutsComponent } from 'app/modules/admin/ui/forms/layouts/layouts.component'; + +export const routes: Route[] = [ + { + path : '', + component: FormsLayoutsComponent + } +]; + +@NgModule({ + declarations: [ + FormsLayoutsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatCheckboxModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatRadioModule, + MatSelectModule, + SharedModule + ] +}) +export class FormsLayoutsModule +{ +} diff --git a/src/app/modules/admin/ui/forms/wizards/wizards.component.html b/src/app/modules/admin/ui/forms/wizards/wizards.component.html new file mode 100644 index 00000000..c10ac046 --- /dev/null +++ b/src/app/modules/admin/ui/forms/wizards/wizards.component.html @@ -0,0 +1,554 @@ +
+ + +
+
+ +
+ +
+ + Forms +
+
+ +
+

+ Form Wizards +

+
+
+
+ + +
+ +
+ +
+

+ Form wizard examples in this page uses mat-horizontal-stepper and mat-vertical-stepper components from Angular Material. You can get + more information about them over here: + https://material.angular.io/components/stepper/overview + + . +

+

+ We prepared couple examples to get you started. You are not limited with these examples, there are lots of options to steppers and you can configure them to + have different behaviors. Take a look at the official guide to learn more about them. +

+
+ + +
Horizontal Stepper
+ +
+ + + Basic information +

+ Fill in your basic information to let us know your preferences +

+
+ + + + +
+
+ + + Country 1 + Country 2 + Country 3 + + + + + + Language 1 + Language 2 + Language 3 + + + +
+
+ +
+
+ + + Profile +

+ People here will get to know you with this information +

+
+ + + + + + + + +
+
+ + + www.example.com/ + +
+
+ + + + +
+
+ + +
+
+ + + Notifications +

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ + +
+
+ + + Done +

+ Thank you for completing our form! You can reset the form if you would like to change your information. +

+
+ + +
+
+
+
+ + +
Vertical Stepper
+ +
+ + + Basic information +

+ Fill in your basic information to let us know your preferences +

+
+ + + + +
+
+ + + Country 1 + Country 2 + Country 3 + + + + + + Language 1 + Language 2 + Language 3 + + + +
+
+ +
+
+ + + Profile +

+ People here will get to know you with this information +

+
+ + + + + + + + +
+
+ + + www.example.com/ + +
+
+ + + + +
+
+ + +
+
+ + + Notifications +

+ We'll always let you know about important changes, but you pick what else you want to hear about. +

+
+
+ By Email +
+ + Company News + + + Featured Products + + + Messages + +
+
+
+ Push Notifications + + + Everything + + + Just the good stuff + + + No push notifications + + +
+
+
+ + +
+
+ + + Done +

+ Thank you for completing our form! You can reset the form if you would like to change your information. +

+
+ + +
+
+
+
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/forms/wizards/wizards.component.ts b/src/app/modules/admin/ui/forms/wizards/wizards.component.ts new file mode 100644 index 00000000..af5de26f --- /dev/null +++ b/src/app/modules/admin/ui/forms/wizards/wizards.component.ts @@ -0,0 +1,76 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; + +@Component({ + selector : 'forms-wizards', + templateUrl : './wizards.component.html', + encapsulation: ViewEncapsulation.None +}) +export class FormsWizardsComponent implements OnInit +{ + horizontalStepperForm: FormGroup; + verticalStepperForm: FormGroup; + + /** + * Constructor + */ + constructor(private _formBuilder: FormBuilder) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Horizontal stepper form + this.horizontalStepperForm = this._formBuilder.group({ + step1: this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + country : ['', Validators.required], + language: ['', Validators.required] + }), + step2: this._formBuilder.group({ + firstName: ['', Validators.required], + lastName : ['', Validators.required], + userName : ['', Validators.required], + about : [''] + }), + step3: this._formBuilder.group({ + byEmail : this._formBuilder.group({ + companyNews : [true], + featuredProducts: [false], + messages : [true] + }), + pushNotifications: ['everything', Validators.required] + }) + }); + + // Vertical stepper form + this.verticalStepperForm = this._formBuilder.group({ + step1: this._formBuilder.group({ + email : ['', [Validators.required, Validators.email]], + country : ['', Validators.required], + language: ['', Validators.required] + }), + step2: this._formBuilder.group({ + firstName: ['', Validators.required], + lastName : ['', Validators.required], + userName : ['', Validators.required], + about : [''] + }), + step3: this._formBuilder.group({ + byEmail : this._formBuilder.group({ + companyNews : [true], + featuredProducts: [false], + messages : [true] + }), + pushNotifications: ['everything', Validators.required] + }) + }); + } +} diff --git a/src/app/modules/admin/ui/forms/wizards/wizards.module.ts b/src/app/modules/admin/ui/forms/wizards/wizards.module.ts new file mode 100644 index 00000000..5f4f0da7 --- /dev/null +++ b/src/app/modules/admin/ui/forms/wizards/wizards.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatStepperModule } from '@angular/material/stepper'; +import { SharedModule } from 'app/shared/shared.module'; +import { FormsWizardsComponent } from 'app/modules/admin/ui/forms/wizards/wizards.component'; + +export const routes: Route[] = [ + { + path : '', + component: FormsWizardsComponent + } +]; + +@NgModule({ + declarations: [ + FormsWizardsComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatRadioModule, + MatSelectModule, + MatStepperModule, + SharedModule + ] +}) +export class FormsWizardsModule +{ +} diff --git a/src/app/modules/admin/ui/icons/icons.component.html b/src/app/modules/admin/ui/icons/icons.component.html new file mode 100644 index 00000000..242d0005 --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.component.html @@ -0,0 +1,96 @@ +
+ + +
+
+ +
+ +
+ + Icons +
+
+ +
+

+ +

{{icons.name}}

+
+

+
+
+
+ + +
+ +
+ +

Usage

+ + + + +

Icons

+
+ + Search an icon + + + + Icon size + + 16 + 20 + 24 + 32 + 40 + 48 + 64 + + +
+ +
+ + + + + +
+ +
+ +
+ +
{{icon}}
+ +
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/icons/icons.component.ts b/src/app/modules/admin/ui/icons/icons.component.ts new file mode 100644 index 00000000..283dd31e --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.component.ts @@ -0,0 +1,128 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs'; +import { map, takeUntil } from 'rxjs/operators'; +import { IconsService } from 'app/modules/admin/ui/icons/icons.service'; +import { Icon } from 'app/modules/admin/ui/icons/icons.types'; + +@Component({ + selector : 'icons', + templateUrl : './icons.component.html', + encapsulation: ViewEncapsulation.None +}) +export class IconsComponent implements OnInit, OnDestroy +{ + icons$: Observable; + filteredIcons$: Observable; + filterValue$: BehaviorSubject = new BehaviorSubject(''); + + iconSize: number = 24; + selectedIcon: string[]; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _iconsService: IconsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the icons + this.icons$ = this._iconsService.icons; + + // Subscribe to icons + this._iconsService.icons + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe((icons) => { + + // Set the icon size in case the icon set + // has a special base grid size + this.iconSize = icons.grid; + + // Select the first icon + this.selectedIcon = [icons.namespace, icons.list[0]]; + }); + + // Create filtered icons + this.filteredIcons$ = combineLatest([this.icons$, this.filterValue$]) + .pipe( + map(([icons, filterValue]) => { + + // Filter the icons + const filteredIcons = icons.list.filter(icon => icon.toLowerCase().includes(filterValue.toLowerCase())); + + // Update the list with the filtered icons + return { + ...icons, + list: filteredIcons + }; + }) + ); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Filter icons + * + * @param event + */ + filterIcons(event: any): void + { + // Push the value to the observable + this.filterValue$.next(event.target.value); + } + + /** + * Select an icon + * + * @param namespace + * @param icon + */ + selectIcon(namespace: string, icon: string): void + { + this.selectedIcon = [ + namespace, + icon + ]; + } + + /** + * Returns the selected icon's svgIcon + * to use in mat-icon component + */ + calcSvgIconAttr(): string + { + if ( !this.selectedIcon ) + { + return ''; + } + + if ( this.selectedIcon[0] === '' ) + { + return this.selectedIcon[1]; + } + + return this.selectedIcon.join(':'); + } +} diff --git a/src/app/modules/admin/ui/icons/icons.module.ts b/src/app/modules/admin/ui/icons/icons.module.ts new file mode 100644 index 00000000..c9272d2c --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.module.ts @@ -0,0 +1,51 @@ +import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { Route, RouterModule } from '@angular/router'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { SharedModule } from 'app/shared/shared.module'; +import { IconsComponent } from 'app/modules/admin/ui/icons/icons.component'; +import { IconsResolver } from 'app/modules/admin/ui/icons/icons.resolvers'; + +export const routes: Route[] = [ + { + // Redirect /icons to /icons/material-twotone + path : '', + pathMatch : 'full', + redirectTo: 'material-twotone' + }, + { + path : '', + component: IconsComponent, + children : [ + { + path : '**', + resolve: { + icons: IconsResolver + } + } + ] + } +]; + +@NgModule({ + declarations: [ + IconsComponent + ], + imports : [ + ReactiveFormsModule, + RouterModule.forChild(routes), + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSelectModule, + FuseHighlightModule, + SharedModule + ] +}) +export class IconsModule +{ +} diff --git a/src/app/modules/admin/ui/icons/icons.resolvers.ts b/src/app/modules/admin/ui/icons/icons.resolvers.ts new file mode 100644 index 00000000..5038ff59 --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.resolvers.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { IconsService } from 'app/modules/admin/ui/icons/icons.service'; + +@Injectable({ + providedIn: 'root' +}) +export class IconsResolver implements Resolve +{ + /** + * Constructor + */ + constructor(private _iconsService: IconsService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Resolve + * + * @param route + * @param state + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable + { + return this._iconsService.getIcons(state.url); + } +} diff --git a/src/app/modules/admin/ui/icons/icons.service.ts b/src/app/modules/admin/ui/icons/icons.service.ts new file mode 100644 index 00000000..4112d3e1 --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class IconsService +{ + // Private + private _icons: BehaviorSubject = new BehaviorSubject(null); + + /** + * Constructor + */ + constructor(private _httpClient: HttpClient) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Getter for icons + */ + get icons(): Observable + { + return this._icons.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Get icons + * + * @param url + */ + getIcons(url: string): Observable + { + // Prepend the url with 'api' + url = 'api' + url; + + return this._httpClient.get(url).pipe( + tap((response: any) => { + this._icons.next(response); + }) + ); + } +} diff --git a/src/app/modules/admin/ui/icons/icons.types.ts b/src/app/modules/admin/ui/icons/icons.types.ts new file mode 100644 index 00000000..25be8aea --- /dev/null +++ b/src/app/modules/admin/ui/icons/icons.types.ts @@ -0,0 +1,7 @@ +export interface Icon +{ + namespace: string; + name: string; + grid: number; + list: string[]; +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.html new file mode 100644 index 00000000..91ea1d37 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.ts new file mode 100644 index 00000000..d55fcd6c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-fullwidth-content-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedFullwidthContentScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.html new file mode 100644 index 00000000..9da9b8cc --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.html @@ -0,0 +1,71 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.ts new file mode 100644 index 00000000..88378183 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-fullwidth-normal-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedFullwidthNormalScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.html new file mode 100644 index 00000000..a031bb4d --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.ts new file mode 100644 index 00000000..d5ddc0b7 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-fullwidth-page-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedFullwidthPageScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..5b43ace6 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.html @@ -0,0 +1,82 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..91883fcb --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-left-sidebar-1-content-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar1ContentScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..0a11aca4 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.html @@ -0,0 +1,80 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..21c3b592 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-left-sidebar-1-normal-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar1NormalScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..77f80273 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.html @@ -0,0 +1,82 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..2ba0cd81 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-left-sidebar-1-page-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar1PageScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..20721bdf --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.html @@ -0,0 +1,83 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..8e3e2ec7 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-left-sidebar-2-content-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar2ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..511e26f6 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.html @@ -0,0 +1,81 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..acb6517e --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-left-sidebar-2-normal-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar2NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..4195d993 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.html @@ -0,0 +1,83 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..1c31082a --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-left-sidebar-2-page-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedLeftSidebar2PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..b56cf90c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.html @@ -0,0 +1,83 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..a160ce05 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-right-sidebar-1-content-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar1ContentScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..f5bcf43a --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.html @@ -0,0 +1,81 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..7ef99e95 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-right-sidebar-1-normal-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar1NormalScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..50bbd9f6 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.html @@ -0,0 +1,83 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..920dcba8 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'carded-right-sidebar-1-page-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar1PageScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..92ba086e --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.html @@ -0,0 +1,84 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..e30c71e7 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-right-sidebar-2-content-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar2ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..2ee4bf4d --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.html @@ -0,0 +1,82 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..36dd0f8a --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-right-sidebar-2-normal-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar2NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..017f8a41 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.html @@ -0,0 +1,84 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..813a516a --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'carded-right-sidebar-2-page-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class CardedRightSidebar2PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.component.ts b/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.component.ts new file mode 100644 index 00000000..4dd4f8dd --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'demo-placeholder', + template : ` +
+ `, + encapsulation: ViewEncapsulation.None +}) +export class DemoPlaceholderComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.module.ts b/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.module.ts new file mode 100644 index 00000000..42373157 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { DemoPlaceholderComponent } from 'app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.component'; + +@NgModule({ + declarations: [ + DemoPlaceholderComponent + ], + exports : [ + DemoPlaceholderComponent + ] +}) +export class DemoPlaceholderModule +{ +} diff --git a/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.component.ts b/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.component.ts new file mode 100644 index 00000000..51b91e6f --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.component.ts @@ -0,0 +1,199 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types'; + +@Component({ + selector : 'demo-sidebar', + template : ` +
+ +
+ +
+ + +
Demo Sidebar
+ + + +
+
+ +
Storage
+
+
+ 19.9 GB of 100 GB used + +
+
+ + +
+
+ +
Users
+
+
+ 8 of 20 users used + +
+
+
+ `, + styles : [ + ` + demo-sidebar fuse-vertical-navigation .fuse-vertical-navigation-wrapper { + box-shadow: none !important; + } + ` + ], + encapsulation: ViewEncapsulation.None +}) +export class DemoSidebarComponent +{ + menuData: FuseNavigationItem[]; + + /** + * Constructor + */ + constructor() + { + this.menuData = [ + { + title : 'Actions', + subtitle: 'Task, project & team', + type : 'group', + children: [ + { + title: 'Create task', + type : 'basic', + icon : 'heroicons_outline:plus-circle' + }, + { + title: 'Create team', + type : 'basic', + icon : 'heroicons_outline:user-group' + }, + { + title: 'Create project', + type : 'basic', + icon : 'heroicons_outline:briefcase' + }, + { + title: 'Create user', + type : 'basic', + icon : 'heroicons_outline:user-add' + }, + { + title : 'Assign user or team', + subtitle: 'Assign to a task or a project', + type : 'basic', + icon : 'heroicons_outline:badge-check' + } + ] + }, + { + title : 'Tasks', + type : 'group', + children: [ + { + title: 'All tasks', + type : 'basic', + icon : 'heroicons_outline:clipboard-list', + badge: { + title : '49', + classes: 'px-2 bg-primary text-on-primary rounded-full' + } + }, + { + title: 'Ongoing tasks', + type : 'basic', + icon : 'heroicons_outline:clipboard-copy' + }, + { + title: 'Completed tasks', + type : 'basic', + icon : 'heroicons_outline:clipboard-check' + }, + { + title: 'Abandoned tasks', + type : 'basic', + icon : 'heroicons_outline:clipboard' + }, + { + title: 'Assigned to me', + type : 'basic', + icon : 'heroicons_outline:user' + }, + { + title: 'Assigned to my team', + type : 'basic', + icon : 'heroicons_outline:users' + } + ] + }, + { + title : 'Settings', + type : 'group', + children: [ + { + title : 'General', + type : 'collapsable', + icon : 'heroicons_outline:cog', + children: [ + { + title: 'Tasks', + type : 'basic' + }, + { + title: 'Users', + type : 'basic' + }, + { + title: 'Teams', + type : 'basic' + } + ] + }, + { + title : 'Account', + type : 'collapsable', + icon : 'heroicons_outline:user-circle', + children: [ + { + title: 'Personal', + type : 'basic' + }, + { + title: 'Payment', + type : 'basic' + }, + { + title: 'Security', + type : 'basic' + } + ] + } + ] + }, + { + type: 'divider' + } + ]; + } +} diff --git a/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.module.ts b/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.module.ts new file mode 100644 index 00000000..66a457c6 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { FuseNavigationModule } from '@fuse/components/navigation/navigation.module'; +import { DemoSidebarComponent } from 'app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.component'; + +@NgModule({ + declarations: [ + DemoSidebarComponent + ], + imports : [ + RouterModule.forChild([]), + MatIconModule, + MatProgressBarModule, + FuseNavigationModule + ], + exports : [ + DemoSidebarComponent + ] +}) +export class DemoSidebarModule +{ +} diff --git a/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component.ts b/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component.ts new file mode 100644 index 00000000..73d55d74 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component.ts @@ -0,0 +1,136 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +export interface PageLayoutsOverviewData +{ + title: string; + description: string; + availableOptions: { + value: string; + title: string; + }[]; + selectedOption: string; + options: { + [option: string]: { + description: string; + link: string; + component: any; + } + }; +} + +@Component({ + selector : 'layout-overview', + template : ` +
+
+ +
+
{{overview.title}}
+
{{overview.description}}
+
+ + + {{option.title}} + + +
+
+ + +
+ +
+
+ + + +
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
{{selectedOption.description}}
+
+ /src/app/modules/admin{{selectedOption.link}}/ +
+
+
+ +
+
+
+
+
+
+ `, + styles : [ + ` + layout-overview #component-container > *:first-child { + position: relative; + display: flex; + flex-direction: column; + flex: 1 1 auto; + } + ` + ], + encapsulation: ViewEncapsulation.None +}) +export class LayoutOverviewComponent implements OnInit +{ + overview: PageLayoutsOverviewData; + + /** + * Constructor + */ + constructor(private _activatedRoute: ActivatedRoute) + { + } + + /** + * On init + */ + ngOnInit(): void + { + // Get the route data + this.overview = this._activatedRoute.snapshot.data.overview; + } +} diff --git a/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.module.ts b/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.module.ts new file mode 100644 index 00000000..e1c1c6a8 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTabsModule } from '@angular/material/tabs'; +import { SharedModule } from 'app/shared/shared.module'; +import { LayoutOverviewComponent } from 'app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component'; + +@NgModule({ + declarations: [ + LayoutOverviewComponent + ], + imports : [ + SharedModule, + RouterModule.forChild([]), + MatButtonModule, + MatButtonToggleModule, + MatIconModule, + MatTabsModule + ], + exports : [ + LayoutOverviewComponent + ] +}) +export class LayoutOverviewModule +{ +} diff --git a/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.html b/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.html new file mode 100644 index 00000000..0076ce6c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.html @@ -0,0 +1,11 @@ +
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.ts b/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.ts new file mode 100644 index 00000000..1bfd34be --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'empty-normal-scroll', + templateUrl : './empty.component.html', + encapsulation: ViewEncapsulation.None +}) +export class EmptyNormalScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.html b/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.html new file mode 100644 index 00000000..0d1c8a7e --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.html @@ -0,0 +1,13 @@ +
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.ts b/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.ts new file mode 100644 index 00000000..d35289dc --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'empty-page-scroll', + templateUrl : './empty.component.html', + encapsulation: ViewEncapsulation.None +}) +export class EmptyPageScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/overview/overview.component.html b/src/app/modules/admin/ui/page-layouts/overview/overview.component.html new file mode 100644 index 00000000..64f314e0 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/overview/overview.component.html @@ -0,0 +1,62 @@ +
+ + +
+
+ + + +
+

+ Overview +

+
+
+
+ + +
+ +
+ + +

Introduction

+

+ Page layouts are set of pre-made layouts that can be used as the starter on any page/app design. While they provide some styling by default, it's very minimal + and can be easily modified from the component you create. +

+

+ Main benefits of using page layouts are; +

+
    +
  • +

    Consistency

    + Your apps and pages will all look similar in terms of layout and general styling which essentially make them more user friendly and easy + to learn. +
  • +
  • +

    Easy modifications

    + In the future, if you decide to change the design of your pages, add elements or modify the existing ones, it can be done very easily + since all your pages will be sharing same class names and the general code structure. +
  • +
  • +

    Easier learning curve for your users

    + Making the general design and layout of your pages similar will make them easier to learn for your users. They + won't be looking for a save button or a search field over and over again, trying to find and memorize their locations for each page since all pages will + be sharing a similar structure. +
  • +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/overview/overview.component.ts b/src/app/modules/admin/ui/page-layouts/overview/overview.component.ts new file mode 100644 index 00000000..3565970b --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/overview/overview.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'overview', + templateUrl : './overview.component.html', + encapsulation: ViewEncapsulation.None +}) +export class OverviewComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/page-layouts.module.ts b/src/app/modules/admin/ui/page-layouts/page-layouts.module.ts new file mode 100644 index 00000000..50b5312b --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/page-layouts.module.ts @@ -0,0 +1,1038 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTabsModule } from '@angular/material/tabs'; +import { SharedModule } from 'app/shared/shared.module'; +import { DemoPlaceholderModule } from 'app/modules/admin/ui/page-layouts/common/demo-placeholder/demo-placeholder.module'; +import { DemoSidebarModule } from 'app/modules/admin/ui/page-layouts/common/demo-sidebar/demo-sidebar.module'; +import { LayoutOverviewModule } from 'app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.module'; +import { LayoutOverviewComponent } from 'app/modules/admin/ui/page-layouts/common/layout-overview/layout-overview.component'; + +import { OverviewComponent } from 'app/modules/admin/ui/page-layouts/overview/overview.component'; + +import { EmptyNormalScrollComponent } from 'app/modules/admin/ui/page-layouts/empty/normal-scroll/empty.component'; +import { EmptyPageScrollComponent } from 'app/modules/admin/ui/page-layouts/empty/page-scroll/empty.component'; + +import { CardedFullwidthPageScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/fullwidth/page-scroll/fullwidth.component'; +import { CardedFullwidthNormalScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/fullwidth/normal-scroll/fullwidth.component'; +import { CardedFullwidthContentScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/fullwidth/content-scroll/fullwidth.component'; + +import { CardedLeftSidebar1NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-1/normal-scroll/left-sidebar-1.component'; +import { CardedLeftSidebar1PageScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-1/page-scroll/left-sidebar-1.component'; +import { CardedLeftSidebar1ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-1/content-scroll/left-sidebar-1.component'; + +import { CardedLeftSidebar2ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-2/content-scroll/left-sidebar-2.component'; +import { CardedLeftSidebar2NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-2/normal-scroll/left-sidebar-2.component'; +import { CardedLeftSidebar2PageScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/left-sidebar-2/page-scroll/left-sidebar-2.component'; + +import { CardedRightSidebar2PageScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-2/page-scroll/right-sidebar-2.component'; +import { CardedRightSidebar1NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-1/normal-scroll/right-sidebar-1.component'; +import { CardedRightSidebar2ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-2/content-scroll/right-sidebar-2.component'; + +import { CardedRightSidebar1PageScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-1/page-scroll/right-sidebar-1.component'; +import { CardedRightSidebar1ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-1/content-scroll/right-sidebar-1.component'; +import { CardedRightSidebar2NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/carded/right-sidebar-2/normal-scroll/right-sidebar-2.component'; + +import { SimpleFullwidthNormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component'; +import { SimpleFullwidthPageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component'; +import { SimpleFullwidthContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component'; + +import { SimpleLeftSidebar1NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component'; +import { SimpleLeftSidebar1PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component'; +import { SimpleLeftSidebar1ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component'; + +import { SimpleLeftSidebar2NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component'; +import { SimpleLeftSidebar2PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component'; +import { SimpleLeftSidebar2ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component'; +import { SimpleLeftSidebar2InnerScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component'; + +import { SimpleLeftSidebar3NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component'; +import { SimpleLeftSidebar3PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component'; +import { SimpleLeftSidebar3ScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component'; + +import { SimpleRightSidebar1NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component'; +import { SimpleRightSidebar1PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component'; +import { SimpleRightSidebar1ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component'; + +import { SimpleRightSidebar2NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component'; +import { SimpleRightSidebar2PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component'; +import { SimpleRightSidebar2ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component'; +import { SimpleRightSidebar2InnerScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component'; + +import { SimpleRightSidebar3NormalScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component'; +import { SimpleRightSidebar3PageScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component'; +import { SimpleRightSidebar3ContentScrollComponent } from 'app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component'; + +export const overviews = { + empty : { + title : 'Empty Layout', + description : 'Layout that spans the entire width of the content area with 2 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll: { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/empty/normal-scroll', + component : EmptyNormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/empty/page-scroll', + component : EmptyPageScrollComponent + } + } + }, + carded: { + fullwidth : { + title : 'Carded Fullwidth Layout', + description : 'Carded layout that spans the entire width of the content area with a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/carded/fullwidth/normal-scroll', + component : CardedFullwidthNormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/carded/fullwidth/page-scroll', + component : CardedFullwidthPageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/carded/fullwidth/content-scroll', + component : CardedFullwidthContentScrollComponent + } + } + }, + leftSidebar1: { + title : 'Carded Left Sidebar #1', + description : 'Carded layout with a left sidebar, a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/carded/left-sidebar-1/normal-scroll', + component : CardedLeftSidebar1NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/carded/left-sidebar-1/page-scroll', + component : CardedLeftSidebar1PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/carded/left-sidebar-1/content-scroll', + component : CardedLeftSidebar1ContentScrollComponent + } + } + }, + leftSidebar2: { + title : 'Carded Left Sidebar #2', + description : 'Carded layout with a left sidebar, a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/carded/left-sidebar-2/normal-scroll', + component : CardedLeftSidebar2NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/carded/left-sidebar-2/page-scroll', + component : CardedLeftSidebar2PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/carded/left-sidebar-2/content-scroll', + component : CardedLeftSidebar2ContentScrollComponent + } + } + }, + rightSidebar1: { + title : 'Carded Right Sidebar #1', + description : 'Carded layout with a right sidebar, a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/carded/right-sidebar-1/normal-scroll', + component : CardedRightSidebar1NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/carded/right-sidebar-1/page-scroll', + component : CardedRightSidebar1PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/carded/right-sidebar-1/content-scroll', + component : CardedRightSidebar1ContentScrollComponent + } + } + }, + rightSidebar2: { + title : 'Carded Right Sidebar #2', + description : 'Carded layout with a right sidebar, a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/carded/right-sidebar-2/normal-scroll', + component : CardedRightSidebar2NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/carded/right-sidebar-2/page-scroll', + component : CardedRightSidebar2PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/carded/right-sidebar-2/content-scroll', + component : CardedRightSidebar2ContentScrollComponent + } + } + } + }, + simple: { + fullwidth : { + title : 'Fullwidth Layout', + description : 'Layout that spans the entire width of the content area with a dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/fullwidth/normal-scroll', + component : SimpleFullwidthNormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/fullwidth/page-scroll', + component : SimpleFullwidthPageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/fullwidth/content-scroll', + component : SimpleFullwidthContentScrollComponent + } + } + }, + leftSidebar1 : { + title : 'Left Sidebar #1', + description : 'Layout with a left sidebar and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/left-sidebar-1/normal-scroll', + component : SimpleLeftSidebar1NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/left-sidebar-1/page-scroll', + component : SimpleLeftSidebar1PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/left-sidebar-1/content-scroll', + component : SimpleLeftSidebar1ContentScrollComponent + } + } + }, + leftSidebar2 : { + title : 'Left Sidebar #2', + description : 'Layout with a left sidebar, a dedicated header and 4 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + }, + { + value: 'innerScroll', + title: 'Inner Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/left-sidebar-2/normal-scroll', + component : SimpleLeftSidebar2NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/left-sidebar-2/page-scroll', + component : SimpleLeftSidebar2PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/left-sidebar-2/content-scroll', + component : SimpleLeftSidebar2ContentScrollComponent + }, + innerScroll : { + description: 'Only the inner content area of the page scrolls making sidebar and everything else to stick into their positions.', + link : '/ui/page-layouts/simple/left-sidebar-2/inner-scroll', + component : SimpleLeftSidebar2InnerScrollComponent + } + } + }, + leftSidebar3 : { + title : 'Left Sidebar #3', + description : 'Layout with left sidebar, a fullwidth dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/left-sidebar-3/normal-scroll', + component : SimpleLeftSidebar3NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/left-sidebar-3/page-scroll', + component : SimpleLeftSidebar3PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/left-sidebar-3/content-scroll', + component : SimpleLeftSidebar3ScrollComponent + } + } + }, + rightSidebar1: { + title : 'Right Sidebar #1', + description : 'Layout with a right sidebar and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/right-sidebar-1/normal-scroll', + component : SimpleRightSidebar1NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/right-sidebar-1/page-scroll', + component : SimpleRightSidebar1PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/right-sidebar-1/content-scroll', + component : SimpleRightSidebar1ContentScrollComponent + } + } + }, + rightSidebar2: { + title : 'Right Sidebar #2', + description : 'Layout with a right sidebar, a dedicated header and 4 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + }, + { + value: 'innerScroll', + title: 'Inner Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/right-sidebar-2/normal-scroll', + component : SimpleRightSidebar2NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/right-sidebar-2/page-scroll', + component : SimpleRightSidebar2PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/right-sidebar-2/content-scroll', + component : SimpleRightSidebar2ContentScrollComponent + }, + innerScroll : { + description: 'Only the inner content area of the page scrolls making sidebar and everything else to stick into their positions.', + link : '/ui/page-layouts/simple/right-sidebar-2/inner-scroll', + component : SimpleRightSidebar2InnerScrollComponent + } + } + }, + rightSidebar3: { + title : 'Right Sidebar #3', + description : 'Layout with right sidebar, a fullwidth dedicated header and 3 different scroll modes.', + availableOptions: [ + { + value: 'normalScroll', + title: 'Normal Scroll' + }, + { + value: 'pageScroll', + title: 'Page Scroll' + }, + { + value: 'contentScroll', + title: 'Content Scroll' + } + ], + selectedOption : 'normalScroll', + options : { + normalScroll : { + description: 'No scrolling area manipulations, entire viewport scrolls (body scroll).', + link : '/ui/page-layouts/simple/right-sidebar-3/normal-scroll', + component : SimpleRightSidebar3NormalScrollComponent + }, + pageScroll : { + description: 'Only the page area scrolls making the main toolbar and footer to stick to the top and bottom of the viewport respectively.', + link : '/ui/page-layouts/simple/right-sidebar-3/page-scroll', + component : SimpleRightSidebar3PageScrollComponent + }, + contentScroll: { + description: 'Only the content area of the page scrolls making everything else to stick into their positions.', + link : '/ui/page-layouts/simple/right-sidebar-3/content-scroll', + component : SimpleRightSidebar3ContentScrollComponent + } + } + } + } +}; + +export const routes: Route[] = [ + // Overview + { + path : 'overview', + component: OverviewComponent + }, + + // Empty + { + path : 'empty', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.empty + } + }, + { + path : 'normal-scroll', + component: EmptyNormalScrollComponent + }, + { + path : 'page-scroll', + component: EmptyPageScrollComponent + } + ] + }, + + // Carded + { + path : 'carded', + children: [ + { + path : 'fullwidth', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.carded.fullwidth + } + }, + { + path : 'normal-scroll', + component: CardedFullwidthNormalScrollComponent + }, + { + path : 'page-scroll', + component: CardedFullwidthPageScrollComponent + }, + { + path : 'content-scroll', + component: CardedFullwidthContentScrollComponent + } + ] + }, + { + path : 'left-sidebar-1', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.carded.leftSidebar1 + } + }, + { + path : 'normal-scroll', + component: CardedLeftSidebar1NormalScrollComponent + }, + { + path : 'page-scroll', + component: CardedLeftSidebar1PageScrollComponent + }, + { + path : 'content-scroll', + component: CardedLeftSidebar1ContentScrollComponent + } + ] + }, + { + path : 'left-sidebar-2', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.carded.leftSidebar2 + } + }, + { + path : 'normal-scroll', + component: CardedLeftSidebar2NormalScrollComponent + }, + { + path : 'page-scroll', + component: CardedLeftSidebar2PageScrollComponent + }, + { + path : 'content-scroll', + component: CardedLeftSidebar2ContentScrollComponent + } + ] + }, + { + path : 'right-sidebar-1', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.carded.rightSidebar1 + } + }, + { + path : 'normal-scroll', + component: CardedRightSidebar1NormalScrollComponent + }, + { + path : 'page-scroll', + component: CardedRightSidebar1PageScrollComponent + }, + { + path : 'content-scroll', + component: CardedRightSidebar1ContentScrollComponent + } + ] + }, + { + path : 'right-sidebar-2', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.carded.rightSidebar2 + } + }, + { + path : 'normal-scroll', + component: CardedRightSidebar2NormalScrollComponent + }, + { + path : 'page-scroll', + component: CardedRightSidebar2PageScrollComponent + }, + { + path : 'content-scroll', + component: CardedRightSidebar2ContentScrollComponent + } + ] + } + ] + }, + + // Simple + { + path : 'simple', + children: [ + { + path : 'fullwidth', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.fullwidth + } + }, + { + path : 'normal-scroll', + component: SimpleFullwidthNormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleFullwidthPageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleFullwidthContentScrollComponent + } + ] + }, + { + path : 'left-sidebar-1', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.leftSidebar1 + } + }, + { + path : 'normal-scroll', + component: SimpleLeftSidebar1NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleLeftSidebar1PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleLeftSidebar1ContentScrollComponent + } + ] + }, + { + path : 'left-sidebar-2', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.leftSidebar2 + } + }, + { + path : 'normal-scroll', + component: SimpleLeftSidebar2NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleLeftSidebar2PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleLeftSidebar2ContentScrollComponent + }, + { + path : 'inner-scroll', + component: SimpleLeftSidebar2InnerScrollComponent + } + ] + }, + { + path : 'left-sidebar-3', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.leftSidebar3 + } + }, + { + path : 'normal-scroll', + component: SimpleLeftSidebar3NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleLeftSidebar3PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleLeftSidebar3ScrollComponent + } + ] + }, + { + path : 'right-sidebar-1', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.rightSidebar1 + } + }, + { + path : 'normal-scroll', + component: SimpleRightSidebar1NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleRightSidebar1PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleRightSidebar1ContentScrollComponent + } + ] + }, + { + path : 'right-sidebar-2', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.rightSidebar2 + } + }, + { + path : 'normal-scroll', + component: SimpleRightSidebar2NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleRightSidebar2PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleRightSidebar2ContentScrollComponent + }, + { + path : 'inner-scroll', + component: SimpleRightSidebar2InnerScrollComponent + } + ] + }, + { + path : 'right-sidebar-3', + children: [ + { + path : '', + pathMatch : 'full', + redirectTo: 'overview' + }, + { + path : 'overview', + component: LayoutOverviewComponent, + data : { + overview: overviews.simple.rightSidebar3 + } + }, + { + path : 'normal-scroll', + component: SimpleRightSidebar3NormalScrollComponent + }, + { + path : 'page-scroll', + component: SimpleRightSidebar3PageScrollComponent + }, + { + path : 'content-scroll', + component: SimpleRightSidebar3ContentScrollComponent + } + ] + } + ] + } +]; + +@NgModule({ + declarations: [ + OverviewComponent, + + // Empty + EmptyNormalScrollComponent, + EmptyPageScrollComponent, + + // Carded - Fullwidth + CardedFullwidthNormalScrollComponent, + CardedFullwidthPageScrollComponent, + CardedFullwidthContentScrollComponent, + + // Carded - Left sidebar + CardedLeftSidebar1NormalScrollComponent, + CardedLeftSidebar1PageScrollComponent, + CardedLeftSidebar1ContentScrollComponent, + + CardedLeftSidebar2NormalScrollComponent, + CardedLeftSidebar2PageScrollComponent, + CardedLeftSidebar2ContentScrollComponent, + + + // Carded - Right sidebar + CardedRightSidebar1NormalScrollComponent, + CardedRightSidebar1PageScrollComponent, + CardedRightSidebar1ContentScrollComponent, + + CardedRightSidebar2NormalScrollComponent, + CardedRightSidebar2PageScrollComponent, + CardedRightSidebar2ContentScrollComponent, + + // Simple - Fullwidth + SimpleFullwidthNormalScrollComponent, + SimpleFullwidthPageScrollComponent, + SimpleFullwidthContentScrollComponent, + + // Simple - Left sidebar + SimpleLeftSidebar1NormalScrollComponent, + SimpleLeftSidebar1PageScrollComponent, + SimpleLeftSidebar1ContentScrollComponent, + + SimpleLeftSidebar2NormalScrollComponent, + SimpleLeftSidebar2PageScrollComponent, + SimpleLeftSidebar2ContentScrollComponent, + SimpleLeftSidebar2InnerScrollComponent, + + SimpleLeftSidebar3NormalScrollComponent, + SimpleLeftSidebar3PageScrollComponent, + SimpleLeftSidebar3ScrollComponent, + + // Simple - Right sidebar + SimpleRightSidebar1NormalScrollComponent, + SimpleRightSidebar1PageScrollComponent, + SimpleRightSidebar1ContentScrollComponent, + + SimpleRightSidebar2NormalScrollComponent, + SimpleRightSidebar2PageScrollComponent, + SimpleRightSidebar2ContentScrollComponent, + SimpleRightSidebar2InnerScrollComponent, + + SimpleRightSidebar3NormalScrollComponent, + SimpleRightSidebar3PageScrollComponent, + SimpleRightSidebar3ContentScrollComponent + ], + imports : [ + RouterModule.forChild(routes), + MatButtonModule, + MatIconModule, + MatMenuModule, + MatSidenavModule, + MatTabsModule, + SharedModule, + DemoPlaceholderModule, + DemoSidebarModule, + LayoutOverviewModule + ] +}) +export class PageLayoutsModule +{ +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.html new file mode 100644 index 00000000..e8829904 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.ts new file mode 100644 index 00000000..3fbd420b --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/content-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'simple-fullwidth-content-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleFullwidthContentScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.html new file mode 100644 index 00000000..e741d038 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.html @@ -0,0 +1,71 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.ts new file mode 100644 index 00000000..8cbd86b4 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/normal-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'simple-fullwidth-normal-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleFullwidthNormalScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.html b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.html new file mode 100644 index 00000000..fc95e900 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.html @@ -0,0 +1,73 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.ts b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.ts new file mode 100644 index 00000000..a8d7301c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/fullwidth/page-scroll/fullwidth.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'simple-fullwidth-page-scroll', + templateUrl : './fullwidth.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleFullwidthPageScrollComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..ec5ca7a5 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.html @@ -0,0 +1,39 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..3371c7be --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/content-scroll/left-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-1-content-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar1ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..fc20b501 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.html @@ -0,0 +1,39 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..d459d901 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/normal-scroll/left-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-1-normal-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar1NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.html new file mode 100644 index 00000000..e507d507 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.html @@ -0,0 +1,41 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.ts new file mode 100644 index 00000000..2752bda8 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-1/page-scroll/left-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-1-page-scroll', + templateUrl : './left-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar1PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..466a91f8 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.html @@ -0,0 +1,81 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..0a018845 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/content-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-2-content-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar2ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..c48035f9 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.html @@ -0,0 +1,83 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..20fa4458 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/inner-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-2-inner-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar2InnerScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..f78440ad --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.html @@ -0,0 +1,81 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..fbb92de7 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/normal-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-2-normal-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar2NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.html new file mode 100644 index 00000000..76728c04 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.html @@ -0,0 +1,83 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.ts new file mode 100644 index 00000000..3ee4ab15 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-2/page-scroll/left-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-2-page-scroll', + templateUrl : './left-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar2PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.html new file mode 100644 index 00000000..e336c5f1 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.html @@ -0,0 +1,81 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.ts new file mode 100644 index 00000000..04d73986 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/content-scroll/left-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-3-content-scroll', + templateUrl : './left-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar3ScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.html new file mode 100644 index 00000000..d52f47e9 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.html @@ -0,0 +1,81 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.ts new file mode 100644 index 00000000..9f9a729c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/normal-scroll/left-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-3-normal-scroll', + templateUrl : './left-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar3NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.html new file mode 100644 index 00000000..ab94871d --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.html @@ -0,0 +1,83 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.ts new file mode 100644 index 00000000..3e7c97bd --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/left-sidebar-3/page-scroll/left-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-left-sidebar-3-page-scroll', + templateUrl : './left-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleLeftSidebar3PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..b489149c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.html @@ -0,0 +1,40 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..b4035965 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/content-scroll/right-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-1-content-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar1ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..7d06881d --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.html @@ -0,0 +1,40 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..067ea8ee --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/normal-scroll/right-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-1-normal-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar1NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.html new file mode 100644 index 00000000..be98cd72 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.html @@ -0,0 +1,42 @@ +
+ + + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.ts new file mode 100644 index 00000000..47ce7140 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-1/page-scroll/right-sidebar-1.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-1-page-scroll', + templateUrl : './right-sidebar-1.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar1PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..a01a3e04 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.html @@ -0,0 +1,82 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..392d4651 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/content-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-2-content-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar2ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..a7e07b35 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.html @@ -0,0 +1,84 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..e1f8949c --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/inner-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-2-inner-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar2InnerScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..84ace526 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.html @@ -0,0 +1,82 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..84b9a32e --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/normal-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-2-normal-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar2NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.html new file mode 100644 index 00000000..2d1883ea --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.html @@ -0,0 +1,84 @@ +
+ + + + + + + + + + + + + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.ts new file mode 100644 index 00000000..1af6bfe5 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-2/page-scroll/right-sidebar-2.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-2-page-scroll', + templateUrl : './right-sidebar-2.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar2PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.html new file mode 100644 index 00000000..60b7bebb --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.html @@ -0,0 +1,82 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.ts new file mode 100644 index 00000000..a0721d1d --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/content-scroll/right-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-3-content-scroll', + templateUrl : './right-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar3ContentScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.html new file mode 100644 index 00000000..99c879c7 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.html @@ -0,0 +1,82 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.ts new file mode 100644 index 00000000..3bc3a4ae --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/normal-scroll/right-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-3-normal-scroll', + templateUrl : './right-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar3NormalScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.html b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.html new file mode 100644 index 00000000..88063052 --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.html @@ -0,0 +1,84 @@ +
+ + +
+
+ +
+ + +
+ +
+

+ Page heading +

+
+
+ +
+ +
+
+ + + + + + + + + + + + + +
+ + +
+ +
+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.ts b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.ts new file mode 100644 index 00000000..1e33724f --- /dev/null +++ b/src/app/modules/admin/ui/page-layouts/simple/right-sidebar-3/page-scroll/right-sidebar-3.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; + +@Component({ + selector : 'simple-right-sidebar-3-page-scroll', + templateUrl : './right-sidebar-3.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SimpleRightSidebar3PageScrollComponent implements OnInit, OnDestroy +{ + drawerMode: 'over' | 'side' = 'side'; + drawerOpened: boolean = true; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor(private _fuseMediaWatcherService: FuseMediaWatcherService) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Subscribe to media changes + this._fuseMediaWatcherService.onMediaChange$ + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(({matchingAliases}) => { + + // Set the drawerMode and drawerOpened if + if ( matchingAliases.includes('lg') ) + { + this.drawerMode = 'side'; + this.drawerOpened = true; + } + else + { + this.drawerMode = 'over'; + this.drawerOpened = false; + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.html b/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.html new file mode 100644 index 00000000..7b6098ac --- /dev/null +++ b/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.html @@ -0,0 +1,50 @@ +
+ + +
+
+ +
+ +
+ +
+

+ TailwindCSS +

+
+
+
+ + +
+ +
+ +

+ As per the official page of Tailwind CSS, it is a highly customizable, low-level CSS framework that gives you all of the building blocks you need to build bespoke + designs without any annoying opinionated styles you have to fight to override. +

+

+ To simply put, Tailwind provides helper classes for almost every CSS rule available. Fuse includes and uses Tailwind by default and it can be used in any part of + the theme. +

+ +

Official docs

+

+ Official Tailwind CSS documentation: + https://tailwindcss.com/ + +

+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.ts b/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.ts new file mode 100644 index 00000000..c1e16d8c --- /dev/null +++ b/src/app/modules/admin/ui/tailwindcss/tailwindcss.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'tailwindcss', + templateUrl : './tailwindcss.component.html', + encapsulation: ViewEncapsulation.None +}) +export class TailwindCSSComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/tailwindcss/tailwindcss.module.ts b/src/app/modules/admin/ui/tailwindcss/tailwindcss.module.ts new file mode 100644 index 00000000..418edbec --- /dev/null +++ b/src/app/modules/admin/ui/tailwindcss/tailwindcss.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; +import { TailwindCSSComponent } from 'app/modules/admin/ui/tailwindcss/tailwindcss.component'; + +export const routes: Route[] = [ + { + path : '', + component: TailwindCSSComponent + } +]; + +@NgModule({ + declarations: [ + TailwindCSSComponent + ], + imports : [ + RouterModule.forChild(routes), + SharedModule + ] +}) +export class TailwindCSSModule +{ +} diff --git a/src/app/modules/admin/ui/typography/typography.component.html b/src/app/modules/admin/ui/typography/typography.component.html new file mode 100644 index 00000000..8db2e2a5 --- /dev/null +++ b/src/app/modules/admin/ui/typography/typography.component.html @@ -0,0 +1,439 @@ +
+ + +
+
+ +
+ +
+ +
+

+ Typography +

+
+
+
+ + +
+ + +
+

Body font size

+

+ The default body text is set to 14px. This allows building more complex and dense layouts without + needing too much screen space. Applications usually need to show a lot more information on one page compared to, + let's say, a blog post. This requires more denser layouts hence the smaller default body font size. +

+ +

Rich text

+

+ When building a web application, you don't want to have default HTML element styles interfering with your design. + This is because those style are designed for building web sites, therefore, Fuse takes advantage of Tailwind's reset + styles to reset all element styles by default. +

+

+ This way, you can build complex layouts and application interfaces without needing to reset element styles over and + over again. +

+

+ But this introduce a new problem when you actually want to show a rich-text content with paragraphs, + lists, links, titles and other HTML elements. They will look bad and they won't be properly styled. +

+

+ To overcome this issue, Fuse uses + + Tailwind's Official Typography Plugin + +  which adds prose class to provide typographic defaults: +

+ + + +

+ Here's an example content that's been wrapped with the prose class: +

+
+ +
+ + +
+ +

Typography Demo

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus aperiam lab et fugiat id magnam minus nemo quam + voluptatem. Culpa deleniti explica nisi quod soluta. +

+

+ Alias animi labque, deserunt distinctio eum excepturi fuga iure labore magni molestias mollitia natus, officia pofro + quis sunt temporibus veritatis voluptatem, voluptatum. Aut blanditiis esse et illum maxim, obcaecati possimus + voluptate! Accusamus adipisci amet aperiam, assumenda consequuntur fugiat inventore iusto magnam molestias + natus necessitatibus, nulla pariatur. +

+

+ Amet distinctio enim itaque minima minus nesciunt recusandae soluta voluptatibus: +

+
+

+ Ad aliquid amet asperiores lab distinctio doloremque eaque, exercitationem explicabo, minus mollitia + natus necessitatibus odio omnis pofro rem. +

+
+

+ Alias architecto asperiores, dignissimos illum ipsam ipsum itaque, natus necessitatibus officiis, perferendis quae + sed ullam veniam vitae voluptas! Magni, nisi, quis! A accusamus animi commodi, consectetur distinctio + eaque, eos excepturi illum laboriosam maiores nam natus nulla officiis perspiciatis rem reprehenderit sed + tenetur veritatis. +

+

+ Consectetur dicta enim error eveniet expedita, facere in itaque labore natus quasi? Ad consectetur + eligendi facilis magni quae quis, quo temporibus voluptas voluptate voluptatem! +

+

+ Adipisci alias animi debitis eos et impedit maiores, modi nam nobis officia optio perspiciatis, rerum. + Accusantium esse nostrum odit quis quo: +

+ +
h1 a {{'{'}}
+    display: block;
+    width: 300px;
+    height: 80px;
+{{'}'}}
+ +

+ Accusantium aut autem, lab deleniti eaque fugiat fugit id ipsa iste molestiae, + necessitatibus nemo quasi + . +

+
+

+ Accusantium aspernatur autem enim +

+

+ Blanditiis, fugit voluptate! Assumenda blanditiis consectetur, labque cupiditate ducimus eaque earum, fugiat illum + ipsa, necessitatibus omnis quaerat reiciendis totam. Architecto, facere illum molestiae nihil nulla + quibusdam quidem vel! Atque blanditiis deserunt. +

+

+ Debitis deserunt doloremque labore laboriosam magni minus odit: +

+
    +
  1. Asperiores dicta esse maiores nobis officiis.
  2. +
  3. Accusamus aliquid debitis dolore illo ipsam molettiae possimus.
  4. +
  5. Magnam mollitia pariatur perspiciatis quasi quidem tenetur voluptatem! Adipisci aspernatur assumenda dicta.
  6. +
+

+ Animi fugit incidunt iure magni maiores molestias. +

+

+ Consequatur iusto soluta +

+

+ Aliquid asperiores corporis — deserunt dolorum ducimus eius eligendi explicabo quaerat suscipit voluptas. +

+

+ Deserunt dolor eos et illum laborum magni molestiae mollitia: +

+
+

Autem beatae consectetur consequatur, facere, facilis fugiat id illo, impedit numquam optio quis sunt ducimus illo.

+
+

+ Adipisci consequuntur doloribus facere in ipsam maxime molestias pofro quam: +

+
+ +
+ Accusamus blanditiis labque delectus esse et eum excepturi, impedit ipsam iste maiores minima mollitia, nihil obcaecati + placeat quaerat qui quidem sint unde! +
+
+

+ A beatae lab deleniti explicabo id inventore magni nisi omnis placeat praesentium quibusdam: +

+
    +
  • Dolorem eaque laboriosam omnis praesentium.
  • +
  • Atque debitis delectus distinctio doloremque.
  • +
  • Fuga illo impedit minima mollitia neque obcaecati.
  • +
+

+ Consequ eius eum excepturi explicabo. +

+

+ Adipisicing elit atque impedit? +

+

+ Atque distinctio doloremque ea qui quo, repellendus. +

+

+ Delectus deserunt explicabo facilis numquam quasi! Laboriosam, magni, quisquam. Aut, blanditiis commodi distinctio, facere fuga + hic itaque iure labore laborum maxime nemo neque provident quos recusandae sequi veritatis illum inventore iure qui rerum sapiente. +

+

+ Accusamus iusto sint aperiam consectetur … +

+

+ Aliquid assumenda ipsa nam odit pofro quaerat, quasi recusandae sint! Aut, esse explicabo facilis fugit illum iure magni + necessitatibus odio quas. +

+
    +
  • +

    Dolore natus placeat rem atque dignissimos laboriosam.

    +

    + Amet repudiandae voluptates architecto dignissimos repellendus voluptas dignissimos eveniet itaque maiores natus. +

    +

    + Accusamus aliquam debitis delectus dolorem ducimus enim eos, exercitationem fugiat id iusto nostrum quae quos + recusandae reiciendis rerum sequi temporibus veniam vero? Accusantium culpa, cupiditate ducimus eveniet id maiores modi + mollitia nisi aliquid dolorum ducimus et illo in. +

    +
  • +
  • +

    Ab amet deleniti dolor, et hic optio placeat.

    +

    + Accusantium ad alias beatae, consequatur consequuntur eos error eveniet expedita fuga laborum libero maxime nulla pofro + praesentium rem rerum saepe soluta ullam vero, voluptas? Architecto at debitis, doloribus harum iure libero natus odio + optio soluta veritatis voluptate. +

    +
  • +
  • +

    At aut consectetur nam necessitatibus neque nesciunt.

    +

    + Aut dignissimos labore nobis nostrum optio! Dolor id minima velit voluptatibus. Aut consequuntur eum exercitationem + fuga, harum id impedit molestiae natus neque numquam perspiciatis quam rem voluptatum. +

    +
  • +
+

+ Animi aperiam autem labque dolore enim ex expedita harum hic id impedit ipsa laborum modi mollitia non perspiciatis quae ratione. +

+

+ Alias eos excepturi facilis fugit. +

+

+ Alias asperiores, aspernatur corporis + delectus + est + facilis + inventore dolore + ipsa nobis nostrum officia quia, veritatis vero! At dolore est nesciunt numquam quam. Ab animi architecto aut, dignissimos + eos est eum explicabo. +

+

+ Adipisci autem consequuntur labque cupiditate dolor ducimus fuga neque nesciunt: +

+ +
module.exports = {{'{'}}
+    purge: [],
+    theme: {{'{'}}
+        extend: {{'{}'}},
+    },
+    variants: {{'{}'}},
+    plugins: [],
+{{'}'}}
+ +

+ Aliquid aspernatur eius fugit hic iusto. +

+

+ Dolorum ducimus expedita? +

+

+ Culpa debitis explicabo maxime minus quaerat reprehenderit temporibus! Asperiores, cupiditate ducimus esse est expedita fuga hic + ipsam necessitatibus placeat possimus? Amet animi aut consequuntur earum eveniet. +

+
    +
  1. + Aspernatur at beatae corporis debitis. +
      +
    • + Aperiam assumenda commodi lab dicta eius, “fugit ipsam“ itaque iure molestiae nihil numquam, officia omnis quia + repellendus sapiente sed. +
    • +
    • + Nulla odio quod saepe accusantium, adipisci autem blanditiis lab doloribus. +
    • +
    • + Explicabo facilis iusto molestiae nisi nostrum obcaecati officia. +
    • +
    +
  2. +
  3. + Nobis odio officiis optio quae quis quisquam quos rem. +
      +
    • Modi pariatur quod totam. Deserunt doloribus eveniet, expedita.
    • +
    • Ad beatae dicta et fugit libero optio quaerat rem repellendus./
    • +
    • Architecto atque consequuntur corporis id iste magni.
    • +
    +
  4. +
  5. + Deserunt non placeat unde veniam veritatis? Odio quod. +
      +
    • Inventore iure magni quod repellendus tempora. Magnam neque, quia. Adipisci amet.
    • +
    • Consectetur adipisicing elit.
    • +
    • labque eum expedita illo inventore iusto laboriosam nesciunt non, odio provident.
    • +
    +
  6. +
+

+ A aliquam architecto consequatur labque dicta doloremque <li> doloribus, ducimus earum, est <p> + eveniet explicabo fuga fugit ipsum minima minus molestias nihil nisi non qui sunt vel voluptatibus? A dolorum illum nihil quidem. +

+
    +
  • +

    + Laboriosam nesciunt obcaecati optio qui. +

    +

    + Doloremque magni molestias reprehenderit. +

    +
      +
    • Accusamus aperiam blanditiis <p> commodi
    • +
    • Dolorum ea explicabo fugiat in ipsum
    • +
    +
  • +
  • +

    + Commodi dolor dolorem dolores eum expedita libero. +

    +

    + Accusamus alias consectetur dolores et, excepturi fuga iusto possimus. +

    +
      +
    • +

      + Accusantium ad alias atque aut autem consequuntur deserunt dignissimos eaque iure <p> maxime. +

      +

      + Dolorum in nisi numquam omnis quam sapiente sit vero. +

      +
    • +
    • +

      + Adipisci lab in nisi odit soluta sunt vitae commodi excepturi. +

      +
    • +
    +
  • +
  • +

    + Assumenda deserunt distinctio dolor iste mollitia nihil non? +

    +
  • +
+

+ Consectetur adipisicing elit dicta dolor iste. +

+

+ Consectetur ea natus officia omnis reprehenderit. +

+

+ Distinctio impedit quaerat sed! Accusamus + aliquam aspernatur enim expedita explicabo + . Libero molestiae + odio quasi unde ut? Ab exercitationem id numquam odio quisquam! +

+

+ Explicabo facilis nemo quidem natus tempore: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WrestlerOriginFinisher
Bret “The Hitman” HartCalgary, ABSharpshooter
Stone Cold Steve AustinAustin, TXStone Cold Stunner
Randy SavageSarasota, FLElbow Drop
VaderBoulder, COVader Bomb
Razor RamonChuluota, FLRazor’s Edge
+

+ A aliquid autem lab doloremque, ea earum eum fuga fugit illo ipsa minus natus nisi <span> obcaecati pariatur + perferendis pofro suscipit tempore. +

+

+ Ad alias atque culpa illum earum optio +

+

+ Architecto consequatur eveniet illo in iure laborum minus omnis quibusdam sequi temporibus? Ab aliquid “atque dolores molestiae + nemo perferendis” reprehenderit saepe. +

+

+ Accusantium aliquid eligendi est fuga natus, quos vel? Adipisci aperiam asperiores aspernatur consectetur cupiditate + @distinctio/doloribus + et exercitationem expedita, facere facilis illum, impedit inventore + ipsa iure iusto magnam, magni minus nesciunt non officia possimus quod reiciendis. +

+

+ Cupiditate explicabo hic maiores +

+

+ Aliquam amet consequuntur distinctio ea est excepturi facere illum maiores nisi nobis non odit officiis + quisquam, similique tempora temporibus, tenetur ullam voluptates adipisci aperiam deleniti doloremque + ducimus eos. +

+

+ Ducimus qui quo tempora. lab enim explicabo hic inventore qui soluta voluptates voluptatum? Asperiores consectetur + delectus dolorem fugiat ipsa pariatur, quas quos repellendus repudiandae sunt aut blanditiis. +

+

+ Asperiores aspernatur autem error praesentium quidem. +

+

+ Ad blanditiis commodi, doloribus id iste repudiandae vero vitae. +

+

+ Atque consectetur lab debitis enim est et, facere fugit impedit, possimus quaerat quibusdam. +

+

+ Dolorem nihil placeat quibusdam veniam? Amet architecto at consequatur eligendi eveniet excepturi hic illo impedit in iste magni maxime + modi nisi nulla odio placeat quidem, quos rem repellat similique suscipit voluptate voluptates nobis omnis quo repellendus. +

+

+ Assumenda, eum, minima! Autem consectetur fugiat iste sit! Nobis omnis quo repellendus. +

+ +
+ +
+ +
diff --git a/src/app/modules/admin/ui/typography/typography.component.ts b/src/app/modules/admin/ui/typography/typography.component.ts new file mode 100644 index 00000000..b98de741 --- /dev/null +++ b/src/app/modules/admin/ui/typography/typography.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'typography', + templateUrl : './typography.component.html', + encapsulation: ViewEncapsulation.None +}) +export class TypographyComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/admin/ui/typography/typography.module.ts b/src/app/modules/admin/ui/typography/typography.module.ts new file mode 100644 index 00000000..086c1163 --- /dev/null +++ b/src/app/modules/admin/ui/typography/typography.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { Route, RouterModule } from '@angular/router'; +import { MatTabsModule } from '@angular/material/tabs'; +import { FuseHighlightModule } from '@fuse/components/highlight'; +import { SharedModule } from 'app/shared/shared.module'; +import { TypographyComponent } from 'app/modules/admin/ui/typography/typography.component'; + +export const routes: Route[] = [ + { + path : '', + component: TypographyComponent + } +]; + +@NgModule({ + declarations: [ + TypographyComponent + ], + imports : [ + RouterModule.forChild(routes), + MatTabsModule, + FuseHighlightModule, + SharedModule + ] +}) +export class TypographyModule +{ +} diff --git a/src/app/modules/auth/confirmation-required/confirmation-required.component.html b/src/app/modules/auth/confirmation-required/confirmation-required.component.html new file mode 100644 index 00000000..82aca84f --- /dev/null +++ b/src/app/modules/auth/confirmation-required/confirmation-required.component.html @@ -0,0 +1,76 @@ +
+
+
+ +
+ +
+ + +
Confirmation required
+
+ A confirmation mail with instructions has been sent to your email address. + Follow those instructions to confirm your email address and activate your account. +
+ + +
+ Return to + sign in + +
+
+
+ +
diff --git a/src/app/modules/auth/confirmation-required/confirmation-required.component.ts b/src/app/modules/auth/confirmation-required/confirmation-required.component.ts new file mode 100644 index 00000000..a4c63984 --- /dev/null +++ b/src/app/modules/auth/confirmation-required/confirmation-required.component.ts @@ -0,0 +1,18 @@ +import { Component, ViewEncapsulation } from '@angular/core'; +import { FuseAnimations } from '@fuse/animations'; + +@Component({ + selector : 'auth-confirmation-required', + templateUrl : './confirmation-required.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthConfirmationRequiredComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/auth/confirmation-required/confirmation-required.module.ts b/src/app/modules/auth/confirmation-required/confirmation-required.module.ts new file mode 100644 index 00000000..7ca1cd28 --- /dev/null +++ b/src/app/modules/auth/confirmation-required/confirmation-required.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthConfirmationRequiredComponent } from 'app/modules/auth/confirmation-required/confirmation-required.component'; +import { authConfirmationRequiredRoutes } from 'app/modules/auth/confirmation-required/confirmation-required.routing'; + +@NgModule({ + declarations: [ + AuthConfirmationRequiredComponent + ], + imports : [ + RouterModule.forChild(authConfirmationRequiredRoutes), + MatButtonModule, + FuseCardModule, + SharedModule + ] +}) +export class AuthConfirmationRequiredModule +{ +} diff --git a/src/app/modules/auth/confirmation-required/confirmation-required.routing.ts b/src/app/modules/auth/confirmation-required/confirmation-required.routing.ts new file mode 100644 index 00000000..05b94a9b --- /dev/null +++ b/src/app/modules/auth/confirmation-required/confirmation-required.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthConfirmationRequiredComponent } from 'app/modules/auth/confirmation-required/confirmation-required.component'; + +export const authConfirmationRequiredRoutes: Route[] = [ + { + path : '', + component: AuthConfirmationRequiredComponent + } +]; diff --git a/src/app/modules/auth/forgot-password/forgot-password.component.html b/src/app/modules/auth/forgot-password/forgot-password.component.html new file mode 100644 index 00000000..4137a1c4 --- /dev/null +++ b/src/app/modules/auth/forgot-password/forgot-password.component.html @@ -0,0 +1,123 @@ +
+
+
+ +
+ +
+ + +
Forgot password?
+
Fill the form to reset your password
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/auth/forgot-password/forgot-password.component.ts b/src/app/modules/auth/forgot-password/forgot-password.component.ts new file mode 100644 index 00000000..96aa02ed --- /dev/null +++ b/src/app/modules/auth/forgot-password/forgot-password.component.ts @@ -0,0 +1,105 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { finalize } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'auth-forgot-password', + templateUrl : './forgot-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthForgotPasswordComponent implements OnInit +{ + @ViewChild('forgotPasswordNgForm') forgotPasswordNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + forgotPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.forgotPasswordForm = this._formBuilder.group({ + email: ['', [Validators.required, Validators.email]] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Send the reset link + */ + sendResetLink(): void + { + // Return if the form is invalid + if ( this.forgotPasswordForm.invalid ) + { + return; + } + + // Disable the form + this.forgotPasswordForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Forgot password + this._authService.forgotPassword(this.forgotPasswordForm.get('email').value) + .pipe( + finalize(() => { + + // Re-enable the form + this.forgotPasswordForm.enable(); + + // Reset the form + this.forgotPasswordNgForm.resetForm(); + + // Show the alert + this.showAlert = true; + }) + ) + .subscribe( + (response) => { + + // Set the alert + this.alert = { + type : 'success', + message: 'Password reset sent! You\'ll receive an email if you are registered on our system.' + }; + }, + (response) => { + + // Set the alert + this.alert = { + type : 'error', + message: 'Email does not found! Are you sure you are already a member?' + }; + } + ); + } +} diff --git a/src/app/modules/auth/forgot-password/forgot-password.module.ts b/src/app/modules/auth/forgot-password/forgot-password.module.ts new file mode 100644 index 00000000..4b978053 --- /dev/null +++ b/src/app/modules/auth/forgot-password/forgot-password.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthForgotPasswordComponent } from 'app/modules/auth/forgot-password/forgot-password.component'; +import { authForgotPasswordRoutes } from 'app/modules/auth/forgot-password/forgot-password.routing'; + +@NgModule({ + declarations: [ + AuthForgotPasswordComponent + ], + imports : [ + RouterModule.forChild(authForgotPasswordRoutes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class AuthForgotPasswordModule +{ +} diff --git a/src/app/modules/auth/forgot-password/forgot-password.routing.ts b/src/app/modules/auth/forgot-password/forgot-password.routing.ts new file mode 100644 index 00000000..5d26e86c --- /dev/null +++ b/src/app/modules/auth/forgot-password/forgot-password.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthForgotPasswordComponent } from 'app/modules/auth/forgot-password/forgot-password.component'; + +export const authForgotPasswordRoutes: Route[] = [ + { + path : '', + component: AuthForgotPasswordComponent + } +]; diff --git a/src/app/modules/auth/reset-password/reset-password.component.html b/src/app/modules/auth/reset-password/reset-password.component.html new file mode 100644 index 00000000..c424027c --- /dev/null +++ b/src/app/modules/auth/reset-password/reset-password.component.html @@ -0,0 +1,167 @@ +
+
+
+ +
+ +
+ + +
Reset your password
+
Create a new password for your account
+ + + + {{alert.message}} + + + +
+ + + + Password + + + + Password is required + + + + + + Password (Confirm) + + + + Password confirmation is required + + + Passwords must match + + + + + + + +
+ Return to + sign in + +
+ +
+
+
+ +
diff --git a/src/app/modules/auth/reset-password/reset-password.component.ts b/src/app/modules/auth/reset-password/reset-password.component.ts new file mode 100644 index 00000000..b3f5a26c --- /dev/null +++ b/src/app/modules/auth/reset-password/reset-password.component.ts @@ -0,0 +1,111 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { finalize } from 'rxjs/operators'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseValidators } from '@fuse/validators'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'auth-reset-password', + templateUrl : './reset-password.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthResetPasswordComponent implements OnInit +{ + @ViewChild('resetPasswordNgForm') resetPasswordNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + resetPasswordForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.resetPasswordForm = this._formBuilder.group({ + password : ['', Validators.required], + passwordConfirm: ['', Validators.required] + }, + { + validators: FuseValidators.mustMatch('password', 'passwordConfirm') + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset password + */ + resetPassword(): void + { + // Return if the form is invalid + if ( this.resetPasswordForm.invalid ) + { + return; + } + + // Disable the form + this.resetPasswordForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Send the request to the server + this._authService.resetPassword(this.resetPasswordForm.get('password').value) + .pipe( + finalize(() => { + + // Re-enable the form + this.resetPasswordForm.enable(); + + // Reset the form + this.resetPasswordNgForm.resetForm(); + + // Show the alert + this.showAlert = true; + }) + ) + .subscribe( + (response) => { + + // Set the alert + this.alert = { + type : 'success', + message: 'Your password has been reset.' + }; + }, + (response) => { + + // Set the alert + this.alert = { + type : 'error', + message: 'Something went wrong, please try again.' + }; + } + ); + } +} diff --git a/src/app/modules/auth/reset-password/reset-password.module.ts b/src/app/modules/auth/reset-password/reset-password.module.ts new file mode 100644 index 00000000..b2f225b9 --- /dev/null +++ b/src/app/modules/auth/reset-password/reset-password.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthResetPasswordComponent } from 'app/modules/auth/reset-password/reset-password.component'; +import { authResetPasswordRoutes } from 'app/modules/auth/reset-password/reset-password.routing'; + +@NgModule({ + declarations: [ + AuthResetPasswordComponent + ], + imports : [ + RouterModule.forChild(authResetPasswordRoutes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class AuthResetPasswordModule +{ +} diff --git a/src/app/modules/auth/reset-password/reset-password.routing.ts b/src/app/modules/auth/reset-password/reset-password.routing.ts new file mode 100644 index 00000000..d82eff4b --- /dev/null +++ b/src/app/modules/auth/reset-password/reset-password.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthResetPasswordComponent } from 'app/modules/auth/reset-password/reset-password.component'; + +export const authResetPasswordRoutes: Route[] = [ + { + path : '', + component: AuthResetPasswordComponent + } +]; diff --git a/src/app/modules/auth/sign-in/sign-in.component.html b/src/app/modules/auth/sign-in/sign-in.component.html new file mode 100644 index 00000000..4d787bba --- /dev/null +++ b/src/app/modules/auth/sign-in/sign-in.component.html @@ -0,0 +1,195 @@ +
+
+
+ +
+ +
+ + +
Sign in
+
+
Don't have an account?
+ Sign up + +
+ + + + {{alert.message}} + + + +
+ + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + +
+ + Remember me + + Forgot password? + +
+ + + + + +
+
+
Or continue with
+
+
+ + +
+ + + +
+
+
+
+ +
diff --git a/src/app/modules/auth/sign-in/sign-in.component.ts b/src/app/modules/auth/sign-in/sign-in.component.ts new file mode 100644 index 00000000..fa950d25 --- /dev/null +++ b/src/app/modules/auth/sign-in/sign-in.component.ts @@ -0,0 +1,109 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'auth-sign-in', + templateUrl : './sign-in.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthSignInComponent implements OnInit +{ + @ViewChild('signInNgForm') signInNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signInForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _authService: AuthService, + private _formBuilder: FormBuilder, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signInForm = this._formBuilder.group({ + email : ['hughes.brian@company.com', [Validators.required, Validators.email]], + password : ['admin', Validators.required], + rememberMe: [''] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign in + */ + signIn(): void + { + // Return if the form is invalid + if ( this.signInForm.invalid ) + { + return; + } + + // Disable the form + this.signInForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Sign in + this._authService.signIn(this.signInForm.value) + .subscribe( + () => { + + // Set the redirect url. + // The '/signed-in-redirect' is a dummy url to catch the request and redirect the user + // to the correct page after a successful sign in. This way, that url can be set via + // routing file and we don't have to touch here. + const redirectURL = this._activatedRoute.snapshot.queryParamMap.get('redirectURL') || '/signed-in-redirect'; + + // Navigate to the redirect url + this._router.navigateByUrl(redirectURL); + + }, + (response) => { + + // Re-enable the form + this.signInForm.enable(); + + // Reset the form + this.signInNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'error', + message: 'Wrong email or password' + }; + + // Show the alert + this.showAlert = true; + } + ); + } +} diff --git a/src/app/modules/auth/sign-in/sign-in.module.ts b/src/app/modules/auth/sign-in/sign-in.module.ts new file mode 100644 index 00000000..d562b642 --- /dev/null +++ b/src/app/modules/auth/sign-in/sign-in.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthSignInComponent } from 'app/modules/auth/sign-in/sign-in.component'; +import { authSignInRoutes } from 'app/modules/auth/sign-in/sign-in.routing'; + +@NgModule({ + declarations: [ + AuthSignInComponent + ], + imports : [ + RouterModule.forChild(authSignInRoutes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class AuthSignInModule +{ +} diff --git a/src/app/modules/auth/sign-in/sign-in.routing.ts b/src/app/modules/auth/sign-in/sign-in.routing.ts new file mode 100644 index 00000000..6f23cf82 --- /dev/null +++ b/src/app/modules/auth/sign-in/sign-in.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthSignInComponent } from 'app/modules/auth/sign-in/sign-in.component'; + +export const authSignInRoutes: Route[] = [ + { + path : '', + component: AuthSignInComponent + } +]; diff --git a/src/app/modules/auth/sign-out/sign-out.component.html b/src/app/modules/auth/sign-out/sign-out.component.html new file mode 100644 index 00000000..c89a67f5 --- /dev/null +++ b/src/app/modules/auth/sign-out/sign-out.component.html @@ -0,0 +1,33 @@ +
+
+
+ +
+ +
+ + +
You have signed out!
+
+ + + Redirecting in {{countdown | i18nPlural: countdownMapping }} + + + + + You are now being redirected! + +
+ + +
+ Go to + sign in + +
+
+
+
diff --git a/src/app/modules/auth/sign-out/sign-out.component.ts b/src/app/modules/auth/sign-out/sign-out.component.ts new file mode 100644 index 00000000..8690f412 --- /dev/null +++ b/src/app/modules/auth/sign-out/sign-out.component.ts @@ -0,0 +1,65 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subject, timer } from 'rxjs'; +import { finalize, takeUntil, takeWhile, tap } from 'rxjs/operators'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'auth-sign-out', + templateUrl : './sign-out.component.html', + encapsulation: ViewEncapsulation.None +}) +export class AuthSignOutComponent implements OnInit, OnDestroy +{ + countdown: number = 5; + countdownMapping: any = { + '=1' : '# second', + 'other': '# seconds' + }; + private _unsubscribeAll: Subject = new Subject(); + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Sign out + this._authService.signOut(); + + // Redirect after the countdown + timer(1000, 1000) + .pipe( + finalize(() => { + this._router.navigate(['sign-in']); + }), + takeWhile(() => this.countdown > 0), + takeUntil(this._unsubscribeAll), + tap(() => this.countdown--) + ) + .subscribe(); + } + + /** + * On destroy + */ + ngOnDestroy(): void + { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/modules/auth/sign-out/sign-out.module.ts b/src/app/modules/auth/sign-out/sign-out.module.ts new file mode 100644 index 00000000..cab1b635 --- /dev/null +++ b/src/app/modules/auth/sign-out/sign-out.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { FuseCardModule } from '@fuse/components/card'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthSignOutComponent } from 'app/modules/auth/sign-out/sign-out.component'; +import { authSignOutRoutes } from 'app/modules/auth/sign-out/sign-out.routing'; + +@NgModule({ + declarations: [ + AuthSignOutComponent + ], + imports : [ + RouterModule.forChild(authSignOutRoutes), + MatButtonModule, + FuseCardModule, + SharedModule + ] +}) +export class AuthSignOutModule +{ +} diff --git a/src/app/modules/auth/sign-out/sign-out.routing.ts b/src/app/modules/auth/sign-out/sign-out.routing.ts new file mode 100644 index 00000000..2e3ebe2f --- /dev/null +++ b/src/app/modules/auth/sign-out/sign-out.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthSignOutComponent } from 'app/modules/auth/sign-out/sign-out.component'; + +export const authSignOutRoutes: Route[] = [ + { + path : '', + component: AuthSignOutComponent + } +]; diff --git a/src/app/modules/auth/sign-up/sign-up.component.html b/src/app/modules/auth/sign-up/sign-up.component.html new file mode 100644 index 00000000..bbe0904d --- /dev/null +++ b/src/app/modules/auth/sign-up/sign-up.component.html @@ -0,0 +1,186 @@ +
+
+
+ +
+ +
+ + +
Sign up
+
+
Already have an account?
+ Sign in + +
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + Full name is required + + + + + + Email address + + + Email address is required + + + Please enter a valid email address + + + + + + Password + + + + Password is required + + + + + + Company + + + + +
+ + I agree to the + Terms of Service + + and + Privacy Policy + + +
+ + + + +
+
+
+ +
diff --git a/src/app/modules/auth/sign-up/sign-up.component.ts b/src/app/modules/auth/sign-up/sign-up.component.ts new file mode 100644 index 00000000..170d624b --- /dev/null +++ b/src/app/modules/auth/sign-up/sign-up.component.ts @@ -0,0 +1,104 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { FuseAnimations } from '@fuse/animations'; +import { FuseAlertType } from '@fuse/components/alert'; +import { AuthService } from 'app/core/auth/auth.service'; + +@Component({ + selector : 'auth-sign-up', + templateUrl : './sign-up.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthSignUpComponent implements OnInit +{ + @ViewChild('signUpNgForm') signUpNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + signUpForm: FormGroup; + showAlert: boolean = false; + + /** + * Constructor + */ + constructor( + private _authService: AuthService, + private _formBuilder: FormBuilder, + private _router: Router + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Create the form + this.signUpForm = this._formBuilder.group({ + name : ['', Validators.required], + email : ['', [Validators.required, Validators.email]], + password : ['', Validators.required], + company : [''], + agreements: ['', Validators.requiredTrue] + } + ); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Sign up + */ + signUp(): void + { + // Do nothing if the form is invalid + if ( this.signUpForm.invalid ) + { + return; + } + + // Disable the form + this.signUpForm.disable(); + + // Hide the alert + this.showAlert = false; + + // Sign up + this._authService.signUp(this.signUpForm.value) + .subscribe( + (response) => { + + // Navigate to the confirmation required page + this._router.navigateByUrl('/confirmation-required'); + }, + (response) => { + + // Re-enable the form + this.signUpForm.enable(); + + // Reset the form + this.signUpNgForm.resetForm(); + + // Set the alert + this.alert = { + type : 'error', + message: 'Something went wrong, please try again.' + }; + + // Show the alert + this.showAlert = true; + } + ); + } +} diff --git a/src/app/modules/auth/sign-up/sign-up.module.ts b/src/app/modules/auth/sign-up/sign-up.module.ts new file mode 100644 index 00000000..03696386 --- /dev/null +++ b/src/app/modules/auth/sign-up/sign-up.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthSignUpComponent } from 'app/modules/auth/sign-up/sign-up.component'; +import { authSignupRoutes } from 'app/modules/auth/sign-up/sign-up.routing'; + +@NgModule({ + declarations: [ + AuthSignUpComponent + ], + imports : [ + RouterModule.forChild(authSignupRoutes), + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class AuthSignUpModule +{ +} diff --git a/src/app/modules/auth/sign-up/sign-up.routing.ts b/src/app/modules/auth/sign-up/sign-up.routing.ts new file mode 100644 index 00000000..f0c533c6 --- /dev/null +++ b/src/app/modules/auth/sign-up/sign-up.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthSignUpComponent } from 'app/modules/auth/sign-up/sign-up.component'; + +export const authSignupRoutes: Route[] = [ + { + path : '', + component: AuthSignUpComponent + } +]; diff --git a/src/app/modules/auth/unlock-session/unlock-session.component.html b/src/app/modules/auth/unlock-session/unlock-session.component.html new file mode 100644 index 00000000..520a99e8 --- /dev/null +++ b/src/app/modules/auth/unlock-session/unlock-session.component.html @@ -0,0 +1,144 @@ +
+
+
+ +
+ +
+ + +
Unlock your session
+
Your session is locked due to inactivity
+ + + + {{alert.message}} + + + +
+ + + + Full name + + + + + + Password + + + + Password is required + + + + + + + +
+ I'm not + {{name}} +
+ +
+
+
+ +
diff --git a/src/app/modules/auth/unlock-session/unlock-session.component.ts b/src/app/modules/auth/unlock-session/unlock-session.component.ts new file mode 100644 index 00000000..ca24fb95 --- /dev/null +++ b/src/app/modules/auth/unlock-session/unlock-session.component.ts @@ -0,0 +1,129 @@ +import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { FuseAnimations } from '@fuse/animations'; +import { AuthService } from 'app/core/auth/auth.service'; +import { UserService } from 'app/core/user/user.service'; +import { FuseAlertType } from '@fuse/components/alert'; + +@Component({ + selector : 'auth-unlock-session', + templateUrl : './unlock-session.component.html', + encapsulation: ViewEncapsulation.None, + animations : FuseAnimations +}) +export class AuthUnlockSessionComponent implements OnInit +{ + @ViewChild('unlockSessionNgForm') unlockSessionNgForm: NgForm; + + alert: { type: FuseAlertType, message: string } = { + type : 'success', + message: '' + }; + name: string; + showAlert: boolean = false; + unlockSessionForm: FormGroup; + private _email: string; + + /** + * Constructor + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _authService: AuthService, + private _formBuilder: FormBuilder, + private _router: Router, + private _userService: UserService + ) + { + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void + { + // Get the user's name + this._userService.user$.subscribe((user) => { + this.name = user.name; + this._email = user.email; + }); + + // Create the form + this.unlockSessionForm = this._formBuilder.group({ + name : [ + { + value : this.name, + disabled: true + } + ], + password: ['', Validators.required] + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Unlock + */ + unlock(): void + { + // Return if the form is invalid + if ( this.unlockSessionForm.invalid ) + { + return; + } + + // Disable the form + this.unlockSessionForm.disable(); + + // Hide the alert + this.showAlert = false; + + this._authService.unlockSession({ + email : this._email ?? '', + password: this.unlockSessionForm.get('password').value + }).subscribe( + () => { + + // Set the redirect url. + // The '/signed-in-redirect' is a dummy url to catch the request and redirect the user + // to the correct page after a successful sign in. This way, that url can be set via + // routing file and we don't have to touch here. + const redirectURL = this._activatedRoute.snapshot.queryParamMap.get('redirectURL') || '/signed-in-redirect'; + + // Navigate to the redirect url + this._router.navigateByUrl(redirectURL); + + }, + (response) => { + + // Re-enable the form + this.unlockSessionForm.enable(); + + // Reset the form + this.unlockSessionNgForm.resetForm({ + name: { + value : this.name, + disabled: true + } + }); + + // Set the alert + this.alert = { + type : 'error', + message: 'Invalid password' + }; + + // Show the alert + this.showAlert = true; + } + ); + } +} diff --git a/src/app/modules/auth/unlock-session/unlock-session.module.ts b/src/app/modules/auth/unlock-session/unlock-session.module.ts new file mode 100644 index 00000000..c3dff915 --- /dev/null +++ b/src/app/modules/auth/unlock-session/unlock-session.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { FuseCardModule } from '@fuse/components/card'; +import { FuseAlertModule } from '@fuse/components/alert'; +import { SharedModule } from 'app/shared/shared.module'; +import { AuthUnlockSessionComponent } from 'app/modules/auth/unlock-session/unlock-session.component'; +import { authUnlockSessionRoutes } from 'app/modules/auth/unlock-session/unlock-session.routing'; + +@NgModule({ + declarations: [ + AuthUnlockSessionComponent + ], + imports : [ + RouterModule.forChild(authUnlockSessionRoutes), + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + FuseCardModule, + FuseAlertModule, + SharedModule + ] +}) +export class AuthUnlockSessionModule +{ +} diff --git a/src/app/modules/auth/unlock-session/unlock-session.routing.ts b/src/app/modules/auth/unlock-session/unlock-session.routing.ts new file mode 100644 index 00000000..863aaffb --- /dev/null +++ b/src/app/modules/auth/unlock-session/unlock-session.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { AuthUnlockSessionComponent } from 'app/modules/auth/unlock-session/unlock-session.component'; + +export const authUnlockSessionRoutes: Route[] = [ + { + path : '', + component: AuthUnlockSessionComponent + } +]; diff --git a/src/app/modules/landing/home/home.component.html b/src/app/modules/landing/home/home.component.html new file mode 100644 index 00000000..19ac9664 --- /dev/null +++ b/src/app/modules/landing/home/home.component.html @@ -0,0 +1,31 @@ +
+
+
+ Logo image +

Landing Module

+

+ This can be the landing or the welcome page of your application. If you have an SSR (Server Side Rendering) setup, or if you don't need to have Search engine + visibility and optimizations, you can even use this page as your primary landing page. +

+

+ This is a separate "module", it has its own directory and routing setup and also it's completely separated from the actual application. This is also a simple example of + a multiple applications setup that uses the same codebase. You can have different entry points and essentially have different applications within the same codebase. +

+
+ +
+
diff --git a/src/app/modules/landing/home/home.component.ts b/src/app/modules/landing/home/home.component.ts new file mode 100644 index 00000000..bbbd5990 --- /dev/null +++ b/src/app/modules/landing/home/home.component.ts @@ -0,0 +1,16 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'landing-home', + templateUrl : './home.component.html', + encapsulation: ViewEncapsulation.None +}) +export class LandingHomeComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/modules/landing/home/home.module.ts b/src/app/modules/landing/home/home.module.ts new file mode 100644 index 00000000..770412b1 --- /dev/null +++ b/src/app/modules/landing/home/home.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { SharedModule } from 'app/shared/shared.module'; +import { LandingHomeComponent } from 'app/modules/landing/home/home.component'; +import { landingHomeRoutes } from 'app/modules/landing/home/home.routing'; + +@NgModule({ + declarations: [ + LandingHomeComponent + ], + imports : [ + RouterModule.forChild(landingHomeRoutes), + MatButtonModule, + MatIconModule, + SharedModule + ] +}) +export class LandingHomeModule +{ +} diff --git a/src/app/modules/landing/home/home.routing.ts b/src/app/modules/landing/home/home.routing.ts new file mode 100644 index 00000000..b172676c --- /dev/null +++ b/src/app/modules/landing/home/home.routing.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; +import { LandingHomeComponent } from 'app/modules/landing/home/home.component'; + +export const landingHomeRoutes: Route[] = [ + { + path : '', + component: LandingHomeComponent + } +]; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts new file mode 100644 index 00000000..9c22bbd1 --- /dev/null +++ b/src/app/shared/shared.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule + ], + exports: [ + CommonModule, + FormsModule, + ReactiveFormsModule + ] +}) +export class SharedModule +{ +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100755 index 00000000..e69de29b diff --git a/src/assets/fonts/inter/Inter-italic.var.woff2 b/src/assets/fonts/inter/Inter-italic.var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..03875311af6d9a8c7caf547c78363d131f01abdb GIT binary patch literal 244760 zcmZ^KbBs4U@aNjLZQHhOd!M!US=+X4+qP}n_CCw+z4y!gbC=w-&Ga+vOw%+?rkKBq z5-dQ#KtMpCJy<}<|8Z#34j|C(ivN-Q2mfEfNfyBkkI}&ktnw0+(hyeZ(uXh-R84in})h<^UlBotFV40#D?I44fp;McwV#dN;lJ6%1fK z<$+2uSzV)N@3POuzw&0cUJuCX6opMy*%jo>J_ndz+~FF_N?nY*FMFb`GMD%e3kkK% zy>T#usvLXma+*e9df8|9N$K$SFn$64FY?y&<7?Hfuj($p0_^Xyv86}gIn$(53A1GY z5iBNTj38OEOq#hj@pd;ODa7hvN-&F@r=P)!r--Dy!_hS5t05C4Y^=det}PbG zJ7?HfH4ANRUAF1g>czjHc3Eyj;W<_H;cG&8UowT@r^);{bK}Qu&V=wIYs5H&@|1C* zXRyw|8Nk_UF_;;h>GKQf4=hAKo_?RQjNH`hw@pZ=>TN!Jr@E-5r`Mmy9)eZ7HQVJD zR2Oe0U0khxfF1nmNFvtj>z#8jex9cHpGbbI(qAssuLspe7QyXIMXCEc7z#J*E zGn(N2+8bILzunM5IWw*;g&>T1bdF>G@z~i;4;8X`q8=aJ8e0y*B9UCl45g=3Ixk3t zRcQbXVe?;c@IhzPD0Jf^4ZsjID$pUYI3&PLqB< z^*Foil&Ts7d@Q~RXyimOt(R9PmXA% z;NA{-V!4^Rnq+^l!#SZ**Vu_qTD_^F84{K?4t2^57Gj+Z`8hF1um^`Bb`R{b_9Gkj z!JupWBkq4a{#*7}Vq`iweX!mY;+DYqkd7EzqQ^(!vVBUE%1NY6M0L<)EOH5iq8-;n zDhxHH`z5odmuQo8#*?yR-!8{akf8<4Ib}Ps9d|Aujk+%*Wte z4`qJ<<%!Bfm)Y2MI8>+vXej9mqB zD%zJ)hIjL45#eLf#yLVBmN7?&j&9QmpTnO!sFB59e zLD*pD#?zVi>lHpDmPX!7k}Un!nC1CVb#P-X!nn6N&GFa(-Ka$Uy_Iu3# zqTfhb3*oFYnv~T)qkjA3jen1FhZpp~UQC50r|cn*GqaEUOqr#Zzdu?79f$s=v{4B* z2W5FaRTicR2-WwRhhPjj-TGDnZBM??g@70zs(SsLEr9FZ7QWn4Iv>8o5}c6Ql>Ly* zNFQ2BaFrI_MDl#=E!X9w5q;PY)auq^p5nvS3iNFwEHHcj&IuGMDhGK6Ll@5qhh7d> zRX*v-eUZdgj6QhT>;?$BUxG1Ae2{5-MI|1K++TU>1SC1FJFFBTD?u4g;F${F+1Lq_ zdv)HzWlWg=QI5(?J7tXsxQ@Z;QCE)gJSK#`P9ATyZ(^)Q6j&2 zQT*TlpP5=;|%IzPVB86 ziAPjNW!XBk;oQ@+>oRc*n%?u0P^7W#Fy7c^vtR3sMYG_R$te9W>NWfh^D}pQ-SfaJ zAt(#tlqg8(Fxca#fdxJ^DAFhh2RrUZW-Fznh&gu+)adA?5Kx@eNMTGyA;_c>a#kZ! zs#zu_)bh*=$dY)>VG+opP|QO}AR$OZAxL3Jsa-2&95$7b`ZC(-%{9|qn*wew0uI{Q zt=fXu&kU`Vv262}ohxPb|Jj0@dW`yn$;MSzZ64}o?^jP zOzmbR!MfHMSH@P1JzY*cTYkBG>6%j_ig%QtaD)`jHA0Nw6w%Bz9quz`=`#k?*}Tt3n8RK1C?%Ol&iXxVZ!sdpZg;zB*1unM z%RcHhVGS=SA;gGsdMg8oBseA%D{^sW**jzb>koq=$YB6Isv?aAD#SPd2hv$9zQU`^@sSwnS{QG&EFVU;2vRW9iYi!~ogG1~r>Af?yA+&-V zx)^05>Jv?%CXq1+T;L`k|GrkgM|@k5D_4h{gq>?Fd-}Xz_ggf=>5nZHvxhC`o6HSl zP~#j&M469BVjR&(1t?n)F4^w;BbJwpH-cCa$v|PTK>qLwsg^sGp&$bK-+uaC?5Oz4 zABm?4iMD_2!-dBD&8=VWa6yh)`Cw9^2+38!26(JB{`!#%#UNx#u#%c>+WHFYN#@nm zFoSG*&>?ho!c8}18hx1dKD#h_w`3xUJwnwiAahHEg0J!rt^U)PgaDfNf0?fN>a&L0 zuwVzsm7dg8;kD`%SEO;zUa?f};z%YEUn4F#n`nU14sDRy_2QBBny&igqb9tV4bdvr z@pYbpl9K99NNcryH&vThg}@B~PZHs&>V1D-64*w9fm?Te+JDeRqO-)es8Z`R`ty zpS$(e^`Gl(>rCrdS4Kx+u#ZL{n_vw+B((eEJHxT!4ln)5sBo1vi}QB2v*j?IVIMxr zu(5TSbDDQDcNRmIDOHK$qJ6J z!v4~*AS=I%@;!X}FZ=J3UhXVjbe0H1LL96m0LzGK_lTh31;Gc?k{Z6hBdhvSF7td2 z8Egu5R1h4}gdH#uq+92iAk{g4xPeKshsbqQAsqifSgc~WwvIfg)MQY_pIZf)UDjJQ zhM!fnzfp&eQ0PSAye-fVrFBx(Uqy!-M77T;_Xw%R2`M!2ho?7Zc*34)TJ+aW(%FS2 zd;l8cX=9ipafF@#5%LOPZLX!w$s(Jk?Y7b*X}@oZ{w_EGwPf*|qa>|v)2p;zl}i5G zK&OvK#wqR$Ohx|%d&07Hxt@>B_YQDNiaEi}H6y#En8ezbN-`_SPJJ~emzG$X)tQu8 z)7s1?`$#e~CqI@=syVr)prw^w!y>(OPxir{zoL-tl1_qC6kPQxV8)p?^{k1R)XF<( zu)mYH!qUC{{WPwrb=n`H;r}H(|!pApp;qY z23cx|V1@?}=!j9|hS}D_&~*-J^x)SMTV0o#2ulB!TGfPKK5|C4*2wB>P|Mqmq?Bct zjG&R0u^pj;mSHiQj7X7|y+tB7|A$HCtxkRc`K-r3-uwQR^PQJF=%v>DL}Vl|r9t>x z!fGwiznLL!<=-_t8s@+PMS0&d&&^kA45#NmlkuZN{oksJWLahEQ1IhSu@_j_Dn!_6 z8fao7FHt(eHrCShh3Fk2X$L6U!?KQxv(ErS+5R_AH*YY$KF)msyDFsZ^1Alhu~sK-J88I`iQCTG7|yzBv9{9^SjHj9am)x% zjswzIVP+X{$&VC$_qM(SJz_X5+2TvIlXd+R1h8NvQ2^k!$k&9;ALdt5^ z8XRc{FnU4WD+HY;H;c4ZvAW7Op7O#y@S`|*0Yt5m^oQ)B39m#R9fpVsVT?!uA&7(9 z;OQh}_480(ieXqbIA?<>LG4b!tVog>jTW{GOtA-pFgY=>q!X{uDa1G$wnRkO{ykG;&WXwbbl(gJx`#dD>aj{v*%tL_4E%c9|jqlozm-K{raksY- zXXI?8MCirc3)qII8jZ{%EhiSQcf{g=BeJ#t$Cp#XOto}vNAc=F?!CySqf zL*9BkSIvK(5mGo3Hf%y85H=VTaR?G7@rbzIe>pPxWWB5X)ymNO%trTXt6pX5qdvd% zgL$>S0Wo9&3SKxM$d3A}9&oC~rmKb-UDQ?7Rotp^6#lO;p({*ADr7=a?o>?zX?qjZ z5$u5toesLM`>|(#)I0g+C-Tcjn~4&}o>pgQTQtGn0wXd>Zk6pHD;mdJ=; z{N}fRz0Z7U6eQ8jPH{fbqRvO_&36hb3zKhmP;D+YuYVtx{j@Wc9^uKyPKl+k3Bo6o z2FgOiHzAtE)K$vos7U9ji;^J2L?dMeo+z`MHOjS>JgM&s z@cp=q+|R=K?&~-pL#Ct(eL+iI_o?`T`nssU!!3D-z;l;&_a5fmv#TZt2*bosP`UoK zOQ?fu2e8sRg8Oopf*Ey8&sGfOG6k6P9a5}WQ+A!jl})&ce5X)plZwXFGY#~&8?mCaV#));-Vh9Y?08DA*#5ez3+JFRO9uQD~OVK0TDMB4#l711_8pNFkp0y!~2v}^g zaF{rLLnTDPUh?=WUL)%X)0C~R(%xMFr@%oh5zd5V%7jx0Cjc<4dINZKaCKC0*()XO zD#icr)Ux~TH$9ARvG2Xl_51p+YlcqLbOnS5Bm-PUg$*GF4o21)K|+p1J_Sb2jb={S zbaO)E3?a@>owudofp61naD& zpuawV=z$3X49e@=fAv$e!21hsUfzHZYyus%0sbmlZf2vvtMEh^w$uR)aJfL^2**%8 zHKG1}z1mB4UCCWu94jruU;{b8DHfs>69L$lny;GmSJb~rK4t2-s|eITcWF&7B6D0U zun14uLYOF!P$CvA#$gaZS?7Rkjit5z>y=P5%K-6+d8L)At#1w+JX{2Jn+qh6D6lLd z&?pF@alo=UptLH@8%|bK7VnlKas2D;WI(y3t6heCHFbqwrF}e2ZW$uyU7k>@RO4MW z*lCh5jt4g)tb(7M8G4GwO@kaD%@=@a_m*K*PY< zo(iZ7>dqlZfPf!S9!VM;mG-)P7FLLzJL9RGpO+=MH)6?l+kEmXE0i!$@Ra>H1Gy>y z&(Ym?Uf%R`uG0J<#xnjWf;0nh>lm}y1T-I5ufV-vi((8UlEjm_3o)C8+lV;%DV2TYvoGq2>^mfV~0Xge^L;+KKu)C~eOI=@=$ibo$LNJ|j)>Nz$fXucM=A~oNdAM#QWMgl{co-?(3Z{{81a~r z)Ijjhf9w3qAHy15Xom^U-6+PM=MNb9H$5w@9sN)B&(e2~N9QBS>YqpA8Q&{ZtZ%{G ze6PCG%_E~R3)^*i?JYWbi_iF0fV970orwu`>NL2`B+MV#`LDFTQeVd(AeA>;VXneJ zFHeR`7mT*7Hv;&u^X%Z?R+o`rvN3gxIwTX(FYzW(;#1^igNRAm2 zdFEcNhyC_9t8RNm#f03?2MQoZpAZQ&1|Esm6^3;MDA$ze1sX$e50CE4$$f>m_^G^q znsv3eqG%pQfrPRTfR=eV9+lnYZtxZFqL?T3}WK406H}T7x92osG zJL#ikE@y6RgrVfMg4pa6C?d>qYNUu&(8P%YfABHIw$}l&t&@K9=RN5sM8W^rB#lK* z6b_qgyOFE1rnY^$#KX@*axP>V!y=7g8iF#7fi8rS&p2nP&wb1l%v(p@Z>#q`tA;~H zMy4iFDM>kyfg(riQ##b|4(NK^iTN@lR(fftW1&i>0e+qaZrL0x(f01P_Dkw!PUl<4YH<9=48fDx9;{$%`+&-{K5 z&S1T~zE}aZ`8l4IPWK8}jCkp=80+s3Ki(J#7|i+4=j%$ukdr-WE2BnSW`%=b#*RDp zzsEZ7Gj{diiiijim12{U^3iF+k~K|Zg#N*586lz(zS?EspeImQ%LM%)+MY7r(=_H| zUTYxEC_xcDSh}CJe)3PW>r`*^5>r%Froka*vu`)up=Ax52KO5?s1~+iVU=&2{`qBC zH;*A9>LX$wK@uw+yWI6p;Qn%Od`at{y`OEbJy#8Zsz6327K1WFQTY|KmH&jS)DBfD z{%n*KKk!AbNL42f;1Q{MVjQkSWoZf~Ov3&DJIANsqC)YvdbnknlZNJ@ix{m(3 zt}Zq1q;W&=iu*J19jn_qOPkbhTRqneVT{p&Kk22ODwZw81tq<*BPuRi%Ncr>lukp;sZ#qoEBB83Dm7fVQ7+a&*(ptv zs-IvS*SSmDym0EdBXR%7fu*WHb3vDre#g?#1i+{I)Ba{K8^upDz^VLP{Py`-QZBKG&g(6&=!=lt zt+(cmv%FvaR=mPcW2L{mq`$aGQ|;X*&22a8w_f8t|KU|#_e=5i4)^Wd5d47^pu9o@b<`RU!&*xuVYdubG8ns);5q8B+>2=R#z(Xg6LceDD*OD&y522-O%e< z`uU>DLF3-j+gmORLeA5a;^~535nM8Qd89YJMIjHp3VgXfTkhQ1EdT3B$lifA&e=w97r|QFg&lV_wcF#WX~xWBh~R z1R^JC7^MadlF@D!^C}_X=KTSq3CEZ$trlDHZ1>{<=vf!cV8*_SIp6#6DM8O90Wc#J zlmU_eyMSxq{eVA2c_1EeV4oPJKt{P_e;|+?0f2BEEaY+fWno^RzzNHHsZtGx)^6D7 zBQ{;F6}~6C!(&V)HFn&CKzXPryWzh`?}==~Q7nvqkdXb3Xaa!(Zl=G4x3bt{2MRSs z>qFztGYHX%4CvLrbe zVG%Rc=Ifgn{mA?0Oi{Xq36yHvrqK$3OaIGN30de#!UKpHk}_GMII_B2BN+W}M@N6d zYkilz@@R^>0ePxA;X@%y#+wgn@Ga8}RdFnO$Eez}Tsu4K42v1OP1f>vtexI* z_6Cgt{GuFHWorv6ipDCgMl<39^gTEMH{_YnoisB>9BTRApHjQ|%^a{M^gTY^Zj%Af~mZaVVy8Vo_9`7Bf0yTgMTs zTHA?=EN$1t?Dgr~CNb-CeBPIv>H3sON=~iN-k@Ur0I;bQIK_8M2 zWWcu`VuY~o_Mq$qiYyT*At)%bP(nq7M7UHna&sdzE!+nAOhn{Xs_j4hArkk?szX#W z+b#(O6}(d{ey*#6?Uz#K2*XHLZ+koxhi5@mpudR`Vbm$vN^PIzTw$UEKydu1;vhL5 zAfYml+DPR<9)Aogua`S z{cpE~UvsS2bK}0}%YDyw`@ZJ8zWw)pdk+5C`)5c(0l)zUQ@Rtm;ZJl%^Pm7esd>?F zPb5RIOK~EDu-^1QU-S-5VITCAb>L2vmsF!VFmLh>+Cf9;Hyy`ylXo4xUV@F-0SBm#IyD;AhNPmNRP$zl^?!kX4hGdBLL^4?%?}5Jcg?eEV-UHtR zCVCMc5P_Y5UtkCPlL8y{v`W_YiC)DW{m}n81o03dF@jJ^bz_8}j?3j7E=WR-fG z@BDxd6v4Ly%>nt&uloaxUw7%gr`r|6AE{oOzD5k?LIxaIwuNZ5jK>%@x6cnahx)`U z#fA{J6=(Uz(LX{&I0u}xp6=$SIuNhDJZcT&$d&A2dJI_TBIfrMa2 z7GyhL7Wgu52S7*Df-waH+`6vY{z4JvrmerxnEGs;+d)C#}I z>kWpE8amii{^c~TZW6Heprly-u)w_H$F!vvMGQ4%G8*tlSkQon) zuHFICGC?Ki$jiNcyLy*?Uu%dCWxs=63sJ@-Cw5Urm7tdpSu>%CF}Oj5yBkf_4QG~R zYDYXymm-$aGVyK>dA~37b4Wg?kQyPb8MIr#SGN>=9b({PJLXVm~dLjL%(c%~1a1RFthVK&WjBpYqvJ%7f zMDnlhyz2UrD;n6bKr8y1E{3E1P)OZ_xsrR0KS{z)YFauoz2 zKk6MJAQqwj<{zH@l^m04blLd0J9gLoDB*{-q@B53hMGI~LH_S}LHIF~mLf(g0WGTv zXnu_!cI?k?dHupr`*E4RMC94&pV{Ksh4{o0;P%nEx%2sqFQoazd}+u4NX8S7QrNpH zI5}wpTWKo!)kb0dhP19jyH)D)U#%vDu@^DNYNFQbt7cu!3P>8BcwM-#qa-F%!jwlM z?cnx<$Qpv{#kMoV>Ft+9DsAf!=(gAyP*yjp?~yqe+9b7Bd}h{gHgA4x?HF`g{gSlP zTRYv=oEOeZ`-Lu^Fb6O^ef_*do>SXTWg{{Za+#coMkNWb5qiZa`oxqLUkGRe2bCCq z?Os9Tgb&!b*ap&fw&FcdM_tbgiamV!Q=kET&ZP$60D))*{pRai2C~JCpXaSS&ujw= zIsVoWAN>;^^vMi(3F%#P)bRW10VcUgj{SK}2lu7`vO2LCJJX}UUe?yTb(eU7%Sr6# zUM|%{f|Fg^nhYF)?4O7`gUsCyJQOR5;r+g$Qp%HPR6e6TH1|S{Z>I;6O3R=tbu5R?O&+YW86H@*-drEWxaj&qGp<$r#6%wz_MT*0v2{5Ou}Y_VGjj;&VoHyuPL^U;eTfEFZ0I2^6>G)~SOn2fQYc z+0Y#&c)A&5cZV)(){Vq4ilJ{itfX0mE{oy~nf^KJYK)ouhrIqQPCxl(Qj<@In^Z5j zfjXC5goj{_X?}Sd>dFN-8_Tq-dve9y40Rvb!w$#Rvf&Ijmc|b$51`$_% zB%~Q1vaT22tc_vctefI(1g%B?95W-zT?`1QQIP|l;Ks)ygu2m5k3uG65rJYzfdFI~ zyH-Wg26I3$cDmCNG-%+)X((RlW@*UYl7QQ9iQ`*7{^eWOZ(=ran`6=Cz649_p^n(p zSi8oJ9*H24VDw2yWrVmnx)aww?Rt=Px%=>p>JlcciB{&i+rA}r+O!vEf}^HjlTT+v zhO-khB6euU{WuuwziZG22d|UqQybG4v+!;!rea%OT$|u|XIok5>;c$B%jZ_+&sBVT z6Ra~)&XRZAcVM8SOHZR`ukA+p9w4MwpAU7$u)>hW~E&3@9>RVK_c_#$X+5x(gNvF9;Yp()}DVY!8^@UXU{q zK0OxrFG>@lio1f?AE#0NScYTn;g5d{RLBRRUrQ~t+FZj$=dDSgKMX`(zSyd`W%M81 zIrwSQ(QC~FRWWKNMqfLUOJMD<67H3sNX@Rfe#*}j4ALQw|0)aw)_f#KB*!7vNjWhe zLAXwVvOVl<^(rI0t>bnmqKxn$XQi6wiYN3t?3hV$)=4Fp$-G&VC8lm>F-O9s!Y&l^ z-mf;f#PG@~%x*_`{~iX8$Ftn2;|+2JxuNRq=W}^Zuzd+1(I<&5S0IM{{^ZE|C$KF= z{jHtuJ4*uT;rK9{nU;MYeCqt#hyW%u-?vjK5>Cyvras&)VL5YeXLd_^)SNF4>mT}a z2j_HqXHg{%oSeZQe@?#Gb`IM9Aa+Jb$p{WKd99h8VKi2<%+7{qO~D{6Ee;=iZ@|Yq z`?Th zvZ!ModRr==buoah2M-bU& zUyY?xQh-kr3U?gTMgSv@-s-DI7DLy#)Z`|mQ{Ybbk-{>69nnz4#w1*0mR6gpdw@2G z5UX;k6WXDYElM)@hvb%K4lPo|noOud)uWDF@+hi_1N5W_2suUaC9s-Z+848rmv1PK|8`5GxH+|u~?bAS2do;^V zb*_E6V+Jn)DU}AURf8Av>6Gk!fr~f^A$%-<``=a@(JMY%o#O2bsMwDztTMTm0y{pR zF)ef`MC2;+dOy0TgX&2hKu%N%_?_sGKB@jihOc}%Eg0{yix{C5 zp3M9p+0iYljWpnvg3g)q9A(7D;Gju1@wIc4Y!!E|9AZz@C9DmB zaF3Q~)LkLVs+34hNbRgnmx@9gIAD?(2^PIzm5b&~ZtKnsFC3jW^TBM)!)s-kV_0Vm zq7(sX#*7m;NwuLU%x~>ZcMhTa3*=#k^pIIaC#utcryr>k{={K?6H- z=;9o{YIwYd#fEW^wExt;W@j-@*7FVowyxbMlCTQe7kuwx3$gxH;boLZ*lpmk>m3ul zJrQYzNbNhAhFk_YYxYdATyKvy1LDULD3~-f*UVprN$XUw6CGb{rl}Z}gMBVMz}8+~ zu@D&6csch2+myG@JMXKaNhf)`8vc|1~E~Za>rQ@V9gR!-RiANe(jh?$z zawaUXCBYkuMdjif&*-&**(nN|o4H&u>~x!=y~1fp=X%@I)m=Ao1a6r%9s-Uvf$+)X zC{i(foMQW(ip7|quacE*lA4E$V!P%{c<;nYO=uaHCm%yOA$`vJbPI1WOq;+8tc$)S zJy~x~B9xZXy%s}+qf*-XP~uppz)B_&e*LG6WeB-hgQ*};&x%&&v2rr&tE`!E3OAT% zBG4Jt1*;9C6^uGX;Q@tqg4Bm_$hYWHEuGyXM*yDhYQyKWw@KJ~jfLX7%WZs~Zt$OS zsdfYP@F5y(h3NFR3*l*G-G_8a3&!TrM4Dbkj=uaceV|sU+|n?~_d%f9Ro1fh>vWAs zRot<@!5kBTR5_`;N@6JOvKG33Xo?B%jqP5?9^`|u7=Ly+ zYn!M(hs|Mc(||!<%8&C7h)m2nZX8T0;0hJXnrpW@TSar=HnF39l-e=dL3oMaMuenm z=u#xKuT07H0JX2DIdB8Xn95;cQ=B6tY%VhqeAWYS_pLcC!%FH(zkS!~Ip|c#bTTZ2 zOICCCCJPQO#gWsaC$#g~-M?GCHw^GoHdp(0%<~Z>Fkt{loSq z!Ej@?aIpjp+%-b^>>G2jM0|n%CDQbr1C!@N5{u4sTmw)QoH0;L*v;<`AKOb6wFtpHMhbdQaXxT&Ciqyw<}|s z&HE(FNhsRE7FN=kE7uxtBv861lA+E{DFmx}99|R{;OJ%Wo2l^TPC$59OWSW!(`X4* zj_WyWB4np`YSbW{{m?nw%=u;T9%80$)1T*$TL7Se*QMG6zc+qDnd+N3HLdU&TK$gE zm%Y^XJD}DT%j0&Vcz5s{nI8G_v2eeE@uky9`I%hEn-XG5NZicU>_~cMSWvA08e6!@ zJz>h-H}NO=&upz(E4<8rljJ%TTOis}YezI=Yew~|RaQ~ote@O4Azn|*Gy19CK@=!E#mazS5asVzGv4v?L}gelQj%1rSl=Q^nl z-Hx@Z*R6G^5&iiJcjQt02*quaP3w$1xKv1^wy8JEm;e5WC_}(+HkQ{~O)Z!FM$sgc zHzX~vlTqQO*&e+>@w}BBvafSviarbpgk87}%>-Y&qxaS22Se*9*Xcl0m!**q8?l?} zS?9^2iOzxA_MP~V0>Pe3ppU{2qcr(R9g*XFQzP&j1R~-Dp`5Zyxe+D^oNFsmM!zCJ z)8{3Fc&tlY*_m!%t6=zvgP0cQ%&U{GwRI1wfGGbcZ^ck=lA4={7}^KkJHeFr z&&}0qXadyogfYY3QlnlHgu3Uo($q!c3fg^hCB(QX1!*AC2-Dk^5?S2EW3;_%DKeML zBNKx?SORWK3|)dA!LT33Q4hkX&|fR9{g6;KFti9q7| zw=`ZQPZHnD)53jZ;h2?nF4@rrCq%(lwubbn^ECi!s)%dqIOvOczK{r$OWsv;GiUUh zrD#(;I;HT7hR1+((fCGuE!2>*aMeZ`>n1vGt)SN&b1Gr1;J@3D;3r$|r`)9rBo^WZ z2wa27yCm2bc(-YriigF%G>$abGwQ}c0nYoz-h6|v1AvV9@kMc3D8-Ak((WFBlK|JXUWk`f(f-0ycr z+}?e)DFzur|HNcA{3&U=JWR zF+k0u_#Oh~F;ncU0?L96I7+23Uf9#19W~CRsp0QndJ73Sut-hINeT7v$V;Bh(%0cW z$i{#_=@+_1=VYD7#m8d)5bkb@B`oqfCq;CryAsa}>SN~Fl&BQs!nC}$aMjFX6Ps$p z9x;((!Zl}g4yG0(x_o$Wm7C8tOZV>TI$8(H>oIPizWnx6(&*tJc{4VpjbEgT(sM^X z$yQSDJDwyma^5!&|KFC$N3qfxi}RJ;RY>>^jx|#=?YW{#wwjrRe{?$FB7Q zqZ?FQj{?m6ym}87si{;KG#B8yDOj-X#~-dC=k>kea=Sr)pYZoT)@0ZAcL{VKBGflD z`lH?t-wW2y%!6_}B)_Z%_2M^*h7jkn>5M}&!;1NOSt}OG7CVSXBRF_c!Xc3|VSi&- zx84f5-SLwC&3Q6?r#xjW++Byi5YYdFApppFV@o@?N&H3l(@PNQ_jCDYYFw{M0nOj$=dtvP%*0;eEuf+${b2{aAm!(!)IVdtCt|<$p4W}5 zGMsYG0x7N^rWSj53o41xa+1&H_DvBOJ1-vXjUvZU*bom%wjY-E>5cl5!u1Of);Y=( zXi^qa?8_LB$e>@kNC*AB4qf71Um<*y8!FCP;_k3jnquUoKCBSL1mKkGkx zZA*W-xT2iSjlKnB$K^nUZ0oX&maB@~Izf8#+3$~MdQWPfPLqaovRZUVwH08|FwnvG z<#NYm*gc3!75z@tFg4+DT zGG2Mt{;fox;kxH_`t5Hy*5$cNMf-kb#g}{%41mq#JA0O?eEiLO{kliFt`B-`whR|N zrxHmkP5a*GL3tl!O*KKg7u|{Pra1*yDqQ_uR*g@`PtPuv-2=h(ABW!;Z^2T(E5-bc z1(J3~9loYNbQ~DEK2iH^F&aJ22j_J3etut`4J_IQ?Yi8Pn>`Q%c;Ll z-AFsQhmi~V$C~{56u7RhYP%bM|J`rx08)O};$nX}ovnToVE9(vP&JX4CzW?_;Wf8o z`>p>0@_U;eFi$XdLi(-!Bc&d&|KU4X_oeQKJKQP8EBLU5jPA3;wfdzSdA1<%2VOqG zq{g?7w!dSlO6@gH3TXD0c;)+kjMu?#*Iog7GaIr~Y$9Xfd0A~ET!+{y7Y9Vm1**7A zY@GF!!_}@+ViCIzC=faoX7@#{xnC~UFA8Bc%wSgf*QQdN!~sn}QS4MnK-;I6LA7;S zw^=rE&z;91-UKwy)s%G}SCxdMr?E1p*;`+yS68zY;gSzhO zpR`T)9}YwGRepOLEkHc7o8-=TZ)1{0?RSEsft!~ke3EVn>o$YZ@3a3bX|*hW5H`ne zPe8JB+0r+6PCCMT(@55t9k>=HiX3u-^rqQVL`dI6vZ&JcW9$K@ZmWn67+1OWWG}@Q zUeA=~I)7aLwzhinkpDc5)kY3&_0Japj&m*yBvXEqR6 z*n+#PO$X%|t4F}%wmF#_M(~b9j)La7K-SASrnzquPTeR8 z=GzdybKJ-YdK?H`hKK%bTRQSwk}OR~_0wPPxoQusc~c}z;pD$j*_+;*4b8T;SRBF7 zaYX4iBYv_AyDB$K257oCdHRhxT)1I9xob{*sXqcQ$^H{Mqwgjq#QS&P3zh#da0a^m zPMrNE^QA<{=yP!fdt!?A4C=>^!HK#>1n1G^Al%*l@&`g-ixN#_SM(TLqww_*ohQEm zs#lRGcbMsg$&&-!Vn3;YZ+(6ED!jt+Un5NUx|+^u+Gqxzu5Ir2?!mj&_)erWuZ3}EQz3BLsd%AlZA_6KKZ9jyi0d{+>s`@lM=^JPHYl^YUn z&u>(7ez-Esnf?6%Soesue|*^Zj{B5pMJo(aveUWNQ5aUDygO-%RVD*_D;y45KIV4LP@T43_7U@JM9=;IfR!>+$2(sLXtU$D3zvFqIwzE+SdIRTAXFwZCQ!{N+nXu0Es+zaI|$! zq8gj<3ZOyIK7jvsSM}8IXL;%T>4f(>hXu2`=)GOFul=NOU+4-5gv%}Q%`CZUF>&jHv!E&Mz73QRF!hEJ8 zXp{POqJHiW;~g5SRmB{-acPE2%I343R$}+6A^j15=XZgL^z~rHo7uZTxa7c%-*U*5 zXUw=~Qn^Rgxkn!63rVdncerMNrss6u@e3ZNpiOS*c*L$w*XKz0YkqFTY(e5hmRHg4 zAT)S8-W&EZc~uu00oSPD@fU!1)_`Y;g##F0TXVs8?D*c1*jfI1mowdE8r73I>xhq1J)Jpm+KMpISQI5gaos|K!{nE;%Vby*i zx6u0_P%_U$fze?0oLFBWWM@14<{gE_Kg5S2Jri^w)RUJh6+bI^6Kcj1*Z{-5X*|(g zg}Q}7u2U$F0|Bie_4cOdp|VJVnxoBOV(&+a`JAfxoH22eHvx5NLds3hA}nvKYw_G> z${lW`UVJS+%una`^@?%f9Gpj}i*<%Bg}1Mgt>a-4WPiZ+H5YBMa3__ILuEjttvPy# z1EK~BbTp@UCJ(?K0Hisz^CHUZ%T3w}#dERtmo}V>Z>5k|v6DKI=A(a0%nmyXwC@yn z|4??{8yvqYu?r>jZESpkwZ@R&X30Pa*Z}F4JM_k+L;~Q|EISYY!~peQ2)6~HJ8ezN zl(mfy@p$^04&}P$Q%(DzM7C|)==zgy@qos*ZTm6A4P*$qYF~*ybA6YSN5gu8|2H_CqeUO1PmCzSQ}a5i9eq&0-;3Z( zDevngMTGiOGKZ!eb`_YtW3uj!!rvZ?iOo!|pN|ab$#`TuE=Nbq|6>0{{`+q}HyH>D z84uD`&fx0m3RUP`@A4@OM8Wy>qv%rxHa{{sIF32&xYzF``O0?JQShX_>EDQoc$(({ zyiR}7P5;X5s~pagF}^H*LOn(z-{UWNkXEnP(e5BV+6x^Kok6 zN#OGgaP9Dy%^N}6djH-nMc|5LG6YDjV-DNgdp|vZ!=3@?eiG-AABU>bHXOT=LRB$V zqi|wZ4PbY1UyP7MCr#i?GY5{^(_eZ;Yw==VoQzcUW3aA{J^VQKV*T;!8vvB62O2^fnc2U5?9xESSyf-;I6K;zCM z02?M$CJ0|!v^}tY_=p1QZjQM(n}*qBUhn1l;2rICOm=eG@3`!`>~=UEkHzu|L=eqO z(2r&_85dfWj9u+>-xB{X&fWn?lWyx0F59-*Wvh!_wq4a_+qP}nwr$(CjV^1d-+RAr z?o7=55%ZtO$dj4zL`LSxv-eqR>v>$eyA~%(JM)K$$mbV#dN9Tkr-#h7=?mm@Pkp46tc@_5TuXYKwjF7C7N-Vp^fd>1(;A6lXlFK&bN;E+kPUMsEcdR zYC(O0hE#gbNxlIc#@dhy;5ScwA%YpN&2NyesJ?t*G|N;-Soz z_Wcd~_coj3FA=X=QkBJH74R1;%1*qmj${o8IAz#`@yKDbLsA4 zrdM;iC<@6pmI z0FxPo;MGBo!}KyBH%3=sa|S>F3F6bW0YM5J(y?^`iWMx9HT{M%gGV;59=@_9Nuq{! zf%1h*CXR0Yvj$D7mc!23^B}oE{}#u8x&Xnyl{fxrI~MoOXQN9#7=| zy3}=&D3zQae)rEggf2kGw?F^@)SOk@=uoB=i-5i}HOXdEupF5H0GtdraH-P@g8=mC zd*qUSE1pc;@1KU2@ednlZnNyqSYc2+_ztboIg)a}`S1yA4MH}eXPANwNhdux7F zU)6$qQpq%a#nWV=!9658@Rnq;J>({ADd&FOQ$a6mQ%G^=X~Mt&7y-=OBjpB3d0yLu z7PS!UV~ff|HWUL@fAD&QbZjw-kBcwZi&tH__jfCxw8J^NzXzf_bh`sIkXRs#L=hF{ zQaxxq1S(aw_X6(sPDpS@yz~V_P`ER?Oq*%RvQnap$>wMV{%9;+=Mw68&!3g~5`Uim z{rMOT_T{$EYyEMp#lngR5w;7Ghm7rm5Rro+9fLAigF_b*HeGGjrmNnx@0M*YvN3yX z0YBM0@uRXxa(M!0iT~8yoJt8R7#o(RFm0J-T4lEv3$9u39&R4~%WvS?0e;U>n59#a z8$_DZ0ZzQC0bi;8{2kn+f2Ub`& z%%@kqWyLel{utu_*JL(-L+J#~BJs@@#uASs5z{(CU1A+|qkEd7a;e<1_Ie8D{W!e7 zs{8uWK*W6z*A+Pm$A=I&xmpDK*6p5AQhHFljfKa1+>~m56o?53fZpRVi&vZ)8^|c}-b=ZzxR&&uLhOd{3=oY6$C397Dkjh7I@MVv0=CenPST z=jTZv!B=e0;MI@gy;Q=Ng<5Q2^jVJsTkH{k?sM#Wyu@Mqmye||twyAZvbU+h&csQ= zaixEz$Qj&R6;u}{aY6X@=kxg}?-#fG?OElP1|Z)~&o3W{ivchK5MqiTWD+4J>S5@- zz5DXNyz8S>is<*6IzTh&&m{nAmMz#KB=a4>8TMUMxF(+YWa``Wy>35Ssi%cOo7Sw7``E&- zMn_$4H*ceo0J}eKm*c%Z-5>WBH9FZ40f4~qfCP1PfD!x8V6Z}wz1(}BzB@+a-kqZ`dz}}S87}VsqRnucU zILGX2>XKA$k=ss2s}C$s!!WOfKpwY3Jt{|;rpxio5!Lb+Phlm>qH1B}wqayu`;Xk<5yF$O1aP3$m5vDX4Z^#0X1VzV&gw|*th?`1{U zMTT5foy{!rMVjt7Get=&fxF;G2Fvj2+C8GjU(rd{VScttzIm}t+6{_l33 z{%mIdQ-yo?<@uS@a8jinn`}<(N5q~&CT?--3iOk$o4 zzC)ih;nR#W4?vive~9E>9S1D{$aerV29B>_F2i@713r>iN=2;9UV~Z=O}yU(D50eC zshYWpr7Zt8PAsi8eRS600PrEWcnQj6b-Fwp{r<2H&g}HhkFO6ePv-)F0Q!~lZ{x_n zl!@`>7xVx9hQe^dvM}WTQc;3p%8Gx*=7>-3|6qIh=L!B&Sw3~GUkVZ$A}TW5I!3@Y zE?Aigr!wBc1C3X(5D*9$K!Lr8q9|DYgS(J|NT~vavzU@->HUYdpaQX~M2VxQ;)&{i zXEoUzvW)SK_g^JcB)|VXfhK->sJXn$4L2juI)XBxRjkzP_k@nmllwp*kF~@IzmBdB zE>3RtBM0b!4BGe=m;@cV0G?(L{HLS{+nZw_&kJ>*bH)6FTY65%Qz*aAo9#cX^Ocw+ zKB;beD-C$|@qO3Lj*Yb~Xt+Ns z_+$5}jZO1TBY73+yPhf=nt~M*V&8>bbFn;9#=zs;k0!=j>8yRN`Kk&W;@I=FTt-EVjv=(|}OkbRh|X zz3*2$7Q5OVm1!Z2ZFavSTOB!9(0v~fxA{)A7wX=RD|YmxI5nrDIR5qX9J&3;WOAdPpZBrVEa5RCx)7ex=6pN_-pu;2% zyOh4umOVfi3DF|A)@|?!RJf#tL2ZjOonb6O!us$BarW>4+i#2!Vek2W+1ify4@&!2W2N7q4$ZQOi&b?7l*!2El4R5V8u2MWH++i+$|7yr8x z>Hgi;El1(dMm2lAusp=AT~B-pEMudtrZK6#LV}$5mcZW%m1uOZIEnlJDj(`_1*l37 z#bP;%BIY)-bbn&*RUTQ5bf-E%!;`2rN*DPuKk6(Eb~17Ppp5)plP&42?+yaD;Y@zork0ndwr2$!gyN(60Gojg0-&RK?+8B)QMd`- zf_f;LeZdQZD50FCefVibM4$$mZ94eDsW~p2>elhJck!QRuA` zhHA--j0kg&K72U;Nz-sM6S|Kc`DY^A=2cG^`JdwQWWXiTi-ZDXIswj6#jYH>4oZnz za)?!0$zNgzdUp&VhGXi#E=9v8NI)O6k-Am%;94o@D)5tL4*hMnU>L&CkN9UdD0!V>KgDsJ;hg=TV-DJ+Jnt>!=BbMkR=R?M zw%{VN_FYOdERtx%eM5sgd%DK!C)-ru7M;D4ZUDUB!?rm0GbuS;)>bdPBxQQ%5p ztKAMy`qj-y-y{}-5`h|0dDg&W(XpKq^6%DC1aB~5iw;o}9`d>s1Hy>O(AfkqU2jEc z2DQ4>Ch$nQ*~{0HiQ!0I^qWnmqMxSzw~mi4P{njeTZOg zKR|dtatH}yp!m0Ooch}`z7HKhR4e!+p6cYsc%Zb7jJHkX#4@4vde)WFp`eIa`#skz zV#fYY^n_jBoD<@>v+(M!m#g4xua`_-_XFz@-i0rzjgp;Ed4T+#i@md>D?mPafqzq+ z|Mnc*ICU=VP=I~U8oZF+Z4sB57-b8r76>WrsatI+N6Z>90!px(Eop`VRt6O$+Jb|r z1PeO3tm_JrZ}w@b!VB=PSDB=tuDnQLafFqkvBcHl_5`K}F*7l+V6<|7a`hfg9l&)3 z`Zn>aP|zrTyApt?5%%r`^~A_uEkJDvl=>8RLr;lbGc9nEDRjo&u)Vg<6_g2m_#t|v zb8yTdn8 zm6+otp-Q{V(I0SF2v^cF^g~^K&j*6v)tpXTa1R?2wUUNxdADT?T-2rQV~)mJ9fiKUKZC9&lwnTt8gmJ41I~ z@Zo?e(KS_1Fn6lCAuBG^d&oP%DzGn0iykYE|NK0*`dZ-a_L82cI_eb=8`WIIHJ7(^ zS;=4t9PcY1MDm=BLL#~<`vf4;XhB?QrLF3?N8UM1ds*KvM?+7+LLhd!F9Wkv9fAf{ zsY34}1r$6`-Uc9Ce$7RO=Ti9KO5wjvMh9B5$O6fGMnxjb)s6B6+_YN4_Q ztyj<&)|nv54j}P=5QL)Hf54mi1_5GGAxD+=XT*6v_2f9#)04APY#&0|{&^OB;B`uN zg#RzlRa{u@osiN0pH8vuBx}AH#4|tuzn&LF1PN4{|OY_9*W$82eRy~Hx&o!tHZq91ByeACghK(0v;}ij&TsdM zLn0K&DQT%1s_JU}J0Ya4J6UojFlfQ#2x10MiNeP8Y8Ky5hyE|8n+o+f>DkwMXHAou zRd-}z{@e)+na%j#GbaH7hAv&^*S!1Se`8TO7?o1Taj!;WCJd=ZTy}?p6|qd7Gg^(U zU~oLQgWBdT*K7Z1o|lVue6QETX5P=&W8QxWyTG^WQ08Cg9OoO1DwZw$<@P1Di&dRn zzvS82oBK5p<@XZCb$Pp1e+N~s{80IeN%>t-+UO$VT-q9=UE?nW;`s^sam_WV1oP}Ygi}ES!^{!8xO_X+ZO7YUQhzX&Odbv zU;ddV2hK3F7cq!}x3x&VYTUVa&?Ohe+(0R0+Bz>!XD@)hkJrE+Vjt_8RzO9U3DgHWg=t_}*dz(`~x2*Z=-qH`wZu5E9!F`-}6@~eH7?1+{v>3Gf z<4%jeuuI=c+&7yvq&|--YUHU%R1&AH5lcOVRpcrGMz8hAaq{EKI50pYcirYk`#$0` zcKcwM?o)tk8m?Mr%>rYs%mR33Zu@cUbKi;U41Ci3B}({Pt^^b8sNELEJ$W1WVm{OH zK>O1qVDqhemq0z=l#;RwUsbU)Vtg%g6wvL`J{cc(Bg9RycV`(im*}g-vop$7BR(-uj6K_z$A{)xFUFf^DRaSd~6=(BKf$RAz*?mXj zBze+dL7&K!D*N_}c@qJ;)o_WQGq-mDGbY;Iq{>E0B2OtY&jt^LtBMgX&T-G{ucX@j z>^g9XKeIo|s;rkR^QHZm2)Y(*wsq@=fU36_e}qAD^E#*pzq&-^rTAvO{=gC@=`23y zhIn-!<@^Dhcn9JfJe1LVi_NC$jU`?Kmn4QWFK7tk>SHKL62)8)$Y~8wd1C&2;efW^ z(;>VKJPfkmfr_2nlr2|nk6}=xpBEUx8{TUIUzWV{d>%a?w^!)=sNjF*obQGraa_ro zr(1m-JU!T=quM5t&+(sIn%s@=pMdvKmFC){5dT{j1WH6GW|J!!Azrg;*^myPex2h zdpG@g&7iWj4Kj${#OfYcf^LXq}Nc#e@|@V?^Vz~o}>2Btvwlk&MG8=si(>MFug%Q({nTV z$R~J;UfG`)P0W0rOS5$saN}Y<7fbMl#1fZ>wnB+ywS;2H95g%B_ciD1hj2rfBWw%3^N!&1JKoLlU_rXv7_`VdY!_~&krp58+++cszf9fNd7VsL zjbo*NBFcHiQ7*(hB&4q_>eOQ$7t8%#zIW9;ep$N!pP=m! z=egAqzt;}_tvkx~G#CBSYPA#aEUmbhje4|Mz6X>d|ADdvi0jJg{z?3mT3nT%tRW22 zvwH%iagEK~+iAp^TP2rF%2iuLXF|YsN1}n_M3^Spp|1)>)u?wmO^Ci3>ktOI=HpWE zs^C1tc+K2XKGewg#UgNbtXTR|N4ciY}< zA3z?{?Q&!hxHD44AJa84;yz>HEM^W${qzRFchP`21^SATy8RV{ynWii?=GY4t+kZ5 zz2I?P{*I~Mm-2W@*X!x|Xu2aqw>rGz25fh2Zz6lh*ZjLqIz%b;8@(Bd zON<`zz8D(u1J#HAA;p;6kPhS@m-@#|`E_)8VV158>Zr_pO%pM{#B_a0q;`hkI~k(D zrDEP4*V25Z^dnmJsf`9FLs1U`#H>lExUOg&#HZAsE4nmc?odk~ztlHGxMGID%D#eb zu(w z+qaU4IhhzeE0b+@I&%Z~>-o|n0g#TIDGUsSmWd%tJN?be_Zi1@S%D)RTdu#2>#Zk< zMg&&%Evu~n-+Xi$Z`=EfI{%NU^f9~{Px>!fBkE#aqsdIzn0Xq$+}9&r#jm>_aY^+l z)nP$koY>tC{FCiaE!bwRJ%fF9668MYp7}c_t($CMCWd_xkb6$u(TvsGsU+cdf4uKt zdWKrG`{a5N4@P#V-uLLe2!BlA6mNVIfF66Gvz}Cmi9k?w>m%reG-UJVIwcvYh{90U zeOp>SB^PwCK)C0($9-Yd((VTbeC-~3)r0Q-o%qj7vk0Ht4VSJu_fG}r5aq}Y2i1_( z>-*NDkq9#M+%r$Q1blddo-lzO#&z5uD)oATK5}_VyKIPp?!09YJAw|Rn_`6S;{(n# zHS)X0yPcm6#knVM)l)xC#dEz@-2{|8BY?x&(V%zY`sJewdZJ+cuEE?>u#BP^k=I!> zynD6HaN*W-L(uNssFzp!gq~G01jStB3&sijGUFOt#jrmH%A?;(#Mg0dRkOVMMpNS@u-ub`t(|-wk}^J9}l_M%QWmilfXu zLjPI^_WO2b;W^?!_iI@uvZ5XQJGM{!FHi3v5HI~Y=uWfBC_8efb$MHhc8KF+0Tc%U z$`m7tt>8lD{$s4~6Tw7Z1RM9#m~Q~7)38c%q%N%2nz&Y@o<&w+%o@}AD7Rv57Ury< z&`uCQ<>m0ER=DZ7jOXf6Aidc%2n`u%k{cKGj7*|8JEPd(Bdis{EGFE-Q|MEG*=Jf* zqbK3oH3h9Gu8A`SOm?VI1gcxwh+NVzE~~5e%5$tp_GdU_8KIJyjxAOlIaGoRY38gj zF5q<35@CHL23LpifPPWDSWU-D*GZ*;)OvByPPX`sB1vOVD1()Gq{J)W3T@Yc6#sJH5J zVbhV9EFSE~@M#uD`9g@7O*h%4IGuZjtTj}KweS2}&U2JlHjemtC&2ABz&$>u6ECOg z`|qApW7+qm=Nac&ej-N1G*L-VEEWa*k&_BwW?VpyTTD4b=m2yvY0AeDkY3DI9Kq}> z05SOf#M%h$()G@fmInPuXHJGeI;=m+Hfq~(Dx14R@UTPsUt+i#|Dp>I|KO2u=+%bqtpJhSmVT*awiVLEz1cB7K4OC&*?&-PVYbE2O9wq zN~3GMlZfNM9w>Oag&Fpp-%1I5ED1_f$N;PkG5B0d(u|vtpkF<{44~k(^otT^BSi zPOntSH)%e8^tWoVg_i){Q7z9)IBO9>Q^AB{4Aiz2*`;WtQ(;pFSEM?G`+P;EER6g- z80|Y|>1l(1R3UGaG5bfvjATp5k^rb)pu|a{;h#~cS0hy5I-}!-7Ap8Z^#9q=?#VHyv=S5+3qa85LHNRs}jWQ!tOvFN8q}DU_K{ebf*syc2sw8CnN+12Z|Z^p>%cCK(e4k z4Qg8#s<>#kgbN;|R8K(gv`Jx0auR!acx=TbqSfLwe;|3^CLpAt?AbYQVw*Kf3 zN7@2zNMi|crif?|(U++D!5|YHkb7NGhdQ9#cfKJRYt1WJV_8Xw5EHokHY$(*{-Z+Ssd^Udt0M z#DTi0^e~4tC3}M$>Gz9(xtJUHWMQ2-7HBfPVm5>6@>CGpZ9a-Z9Z5(cPY=x%G*5$} zmD1T&j(q00+yr5vMRK{nt#J~fW=cFf^73_~F_b(=bT2fQ_&Y07+WZU)H+En)iG5A) zr0sJI%lw2sr+>z=Gjga5I}>Ie2$!%^sCh=!ciK4zn6Tl5kXvAWiamftNDxt&Q8(-a zM2lDKtSN;+V9}i-xHA^fQ%r}z-%a56>`89=C-=i!VD#x}TL8kzrxS_Y@+Ung%cE7c z-5Zd>V<*BUjtfw~e{Cl?cNsvBs-y^Q}%P!D&lqx@ZCK#TN`w?&(^DzPSC z0m1&+F()Tgh6|H6$W__>h)bZdBrKR9p!8yM@uK%Pf@S8-fF-3vlNMthf!y=F(hc{f+6-Hb`s#h%|B>IfdfhILHN=xdxRd%>&kyNqq~w5 zsv}SDy#u&_SV=)x-NtB9Ig2#`hTJ&!mtC>4?LwJxgGRN0HT%MK_AP^QDYH%80uqG{ zyL4@MFzzYL6qm!kC5Fo}HHjV%Z6gfH`)$&V(nEd%BmIzOqG?!6z^7?UN()~Q4DsPb zD=BriY7+gCj|jCOy=zAGi|PzNBEk=f1*_p?M!zQnlFdj#l?iaP z#XL*OlyNYYoM1K-uUJ7-QgR^Vc@NEs)hCsm14lqIYFvQI&_GBV(b**e zOj5!ZZ_D_JNEiV|=^-W6TFMe6tp9COTQm7t=@#8&0%W=P)*yv!`er&$;snt9R%!Oa zO_M^eKNy4y-pg)_D9ny1*ro-4GV|k1Stmpn_`{QZ#bECg@r$d;oJ5{XISKTpcZ2}U zbPG2YAF4o#o+R-17*)O^>HJ&g+-Kp+5LFp#l^eHc}} zQo|$--9ja04gE@Zp4WqVx~|uw_J4baxT=otfk6<(F?IzBh+;#iGbmQzr2@XAj_Nry zkJ40VSL_A#LKo0dOaC3^falihz-HzAbfXv=Kts3p#eWp(HwGR_$LsJ36cE~5j4L92 zv)GK8=}o5w>+1&s9Xm9!huWcC3#6@JGH>)e`QTWyWZ61g7CM?qZf()^4*EJg!l{h{y}p2TF^Gm==bYUk6m$6!g=@tBND}qo#@w)dAik3XBN;@vb&Tz zR@-kzUM!8vmzs6;#NSR;TNyuzr^dRk`=<)c4EJ@~$nb{mHyVDWZ#hOpy}La3D3m+u z4j#2VF4wvf+_hzmm@Jcvy}-Uc4B34`A)x0a+!H0-YZ|z`4=x&4K5Ymku&dH2wnT8M zl`_>6G3Pdt{n4$VmDH^xtk7*_D9T+$37@eHbp)~q*YdMK2mBsw2WA*ad((~~y$NcbQx=Ht)!m2|F%p|YWNwu`f zWLzdvM@u4^tEYb%%;Xx76p?nh*3cY$gbQSSqsxXr2rLVdYcN+OB70xSWNei#ZijYTE5*|LJ zQs$RO3;lQ)1*KVC0Mi;8}(J^ggGQT~6@<`Zhu znRKD?GdRC?akR#KoL6JeGMMy$BpMVMQYzxvHMB8W7#B=tO5stRFLc`Pp2letFCt6Z z_<|dGGBwTUH-2`g@^}GesPj9zJP2Sx7>xTU8jMGAgX4MJCT4g}dK9lO?U32rh`KdH zlE+~-yz!zkgkxIPlQm(X14Ta3Aka;`)5mxK)lK`fp`c^~_a6Jc5h1AHP!(;No&i>p z>qv)ssS`+0#vDS$D0d4_K5TQ%9%P@Rd1RS^28*R>R4L{m=f z+l5zJqAnRa&MuOkZ5Ez%KFogCnyqHh-Zsm-i=6v~JJ*jptB<=JpQ$X{ivG}NebFRp zobJ?qRhLz`RnEiV>H1Oh+74IUIplM+i~QA812maWW8xL;#s_Z0X9Em#`IZY2Wd79j z$D!TXWSB9?*-aDAD-(EZVV%YL{PAKZ>grkga$@Sbk4=!3q%?B7Wnv@iNOOKF%5|CCI3U?0sy_dE6G3m-4zJ$2Qq!0+sAAKDlhFKiFI9l<0X3nY zc2tU{a+-E_jD)<;ltUT`w!SKTK>f*2-b~VxV5N_Rv%<^Fe9gFR;(S0OPakJd<2#DQ zV|Rs+nH&jCQZP?ue;C{e(L%Dq`0x6GD1cZgI=|@qVsaBb%XLB-%!q0iLS-JjgHcoBwY@8^mF z=IZR#;eB>hG+~`2{Upr2p$73X8K~3hagP2Jg?;F>l+sVK_3H)~wMoOVaWghkv{%Dn z*36kA1*J`_)w!FB{q;my5vtONZpv*u#aO1}82c4Dn}tlz)SomBu@Z|rIZ-RIQLBvG zDPP>I%;DpY=Gi^*?P!Bck&ra@$NU&m7?TJnQ-3IaU8mJ~5K z6|b3ID1w!6lk55oKnmxB1<5Ki;?f#)3fkCl(&g-0f4?Y{+`TJIP>}xEzZtGu)8$pU zG9~|cEb`i6GDG#?T|ebFR@C%q$}RKwOf;P~bq;N7>`O-mIO;keEEt$LER*ydNhoHL z!4pL$z{fBL(c2!}8a!;IXNNS`no7&=peIQo26G!q%NU;w%k>IA)FvBzjvD+22dB;W zXP}ofg3N3do2lp>_w|kcd&kQB;=l;*6EU$-0(xYzI?!k3p#`mX7ntIE1@2FYCln30 zDbKa3;pxXOmBte<0VRsB^T^8)^smIvZklV_9^J$C2X`!3?;Ptd#JUf55xZw(rs$b~ z%Gn!=Y71U}xqi2mDP&JpQ>)sktuD*aw~qXxL#Y$G_d<0@A&sb%bQ zqJd^48WSk^CBdm_9Jqz1hQDBqo%5|mgyEML5rsVC9B897^4f{ZBw(!0!eGGH!naD? zjE&dNcI@#?NcVp(fE|a9o?**qpAh}xd^|3M3w}8s^Ezuk7wleV!}@{;nB7_h#369P z+gx&=-#yg6TMaF@jJAhXPL~scJj|ITep3@8I!P2YCxG_A2Zp6o%E?D{SA;~7+JTQf zv_TrHfp{664^f$N%@#aGi^SpuD^Ce|I`wXVXTL?-Q4Qs)D%l4EwEVM`f*;xm;!HH; zn5OU?=l)7Ql~9NS633L=S1P^N_lquolDS9lDH&3wEdc_Rp+bn|ytDkum6BR1L#vFU zKv7m!PVumCi?V$U>FvynirRX^tjTJ}{!D>iVJa?AB+oA*t^PxjG*>!-H0)ly18TfI zQ3P&Q5;W32UGYFRlcDrEuxFK6z;~{v=L!#JQ zpT%tHrD-lATLpK}3j(?P3AIGd9L#8gBjZUB_ zk^!k~WaZ^)h6$h_1?rAICpR%*L!ML%Z60*<$#ywMv zhLxQLnXX>I8KC{|p&KmfVoO3_%I~c#RAF6OSHn~FRnw{PPOQtn;kzBXt!%TnfP4t( zL7@JX0q}ndmrD3o8gT?#`KZM_W_P-K!K{VEp^5xmE}W1cK}?BlsaGgKJKz21&Tdx$(Zm*M*~>w3s|>(BN0Ps55b#N$yNI zW2M?}n*m5gP~_b$|2o%m?q3uRPU=mj%E6=FAZEOI;%aR4=2+wju@;k zD>(zRaC4q#=U-A!qiq&Iktq2I!pT-~MWSifV6II%UY zF;C{GHw?o>!=w;&Cwh(jOhRPZ@y=Hi_$`y4nPq=p`p|ctD=+_?=@|jgWXZWRXFA|q z=if$B3^T>kYezh;dI}jEZkTh;sdaZrDBy@O8viN#k#!YN!5?EZ^mAsw-4+Z*h(C?z zo-h9TkWemE086(%9sCn)(E-~5PU-~*?-mDhR57A~)~}z$cM+Huq^1aa z#DPIGp3=cD7#*hTP((FA2!NbPb|jM&i|NFu`Iz%p3;~10gk@1#ZsbAF{;v?wl<=O3 z9|2qw!R|bk1tliqbFA&Zr`U<;A7{u_yuB$H^N3mZh#BIDSz=b%z>6$mC^J70BC5{6 zYAmmuj;YQp9u zoE1AdhPx~Reu)f;9!xzLKp`G^RQza;nkr&F?v;pc}^W#Kw6nPk`>C=xNTH~;{8 zrusFx6QgxIhQPIvXJkmXwr3FAPFwNLs6_QsP+ zRV$tRi(2JW{RCyJZ0xIA`bHfO(F%KrBq(T1S`(L5o%1J;LupYwzyBV!^5VERT$Vj? zmX}De!9Wc{y8>a9ECZcbl4ySkGm|&hWV9_|!zYNXs&7qvNu_FcY%^>GUxnlaHqMG} zB4M$)cx?^aqAgIFNW!v{*0SPtgG#Us5qC9rPSBN7)7;wI&Dbr6ULE#z^=cFpv?zEF zb>5gCjMcR~w2GaWv)`5hlKjJ=7e^$6j%^INR1$7mbz6O#x6NfTaHOE)ZktVZ`W;>4Lr@$0_Zva|4ZBH6{ceLu*kW-BB#;0AO!dicI!iL(=`z;& zF*I^)>`-bCq+;T6AOJq8sY>RiN%)4z(svbhkOVOja+9}Igr$@uKp``P7_*{%03Zfd z$02C`%Qq;t<%XWfCX{>`FY{?xk{1FK1rZPCm=D+vghU>)fatu=S6&Tt+weC78Y4?+ zVa&DK*B#7^k{A=;HL!zkZAg0oxHLmZh)9D>OlUQq9r2~h$tzbyPybTAIsgIm)(#b4H5Kzm*XXrOpBjP<5puj-IX}+qurD} z1dDdmb@b8~^-e}hu|j(zz@(HkT~zvL#0&nStR6&qiE6!)L8645vtEh50mM$scczX? zlarxjVG=y4>U7WEvc8Ib;uR_$RCB{jHWpH`Vp(=jTE33Un2^3T9dXF4t#^Qv?pTkoOwO(OYqk)V_7KJKHE|xst2T}NQ!aj2~ z_SQfl>M<%vT4<02&g#wt4N>8a6K2CsZ-U#8z$U{G6~qjNyMVMa4*Z<45Kn-W7;J^9 zrwS=T-Qyz43^vku3#OlSq2aN^CFg4RpaNB%SKyOn6IBLbHbcTG^l1z@w+8P)H#e>* zzt~HYN7%&Xalo0x63$XXlz^I>eU`eT!D9CvnH?9%4TGBU`=oR4_vy6RM40gSQfHdZ zy8v0_6aoS{Gcm-dLe=H!rSzUA5;y2|kzYAl-g#U!aYCNAQTn_-XKe}A8 z-|md5UeO)W9BS^=|qwqte4pKqpZjpyaa zC`Nbu>Kn&gb$i>OvkrqGun7cssnz4_Ds6wcU0xbF^c21~)_;MpyNGF%nW~jwFAAHs z%!0UAnFdC%(XClD5?oP)k}GXeKI+|64_=%k3&`9w?49mcR$J=lHk*tdFsiUFgidc4 z+N5G4jz5PNlmfjiDK8>-XQuF3JV~5c9x{16Ervjh*W`PEECnjnoxpAGg{lI1vC)8f ziAIeSy%vXd^;(3VkWuF1^fbpxM_*D9{W=O+$3uSNCdG5-!JaPGrW-Q<`qd>4#f{-0 z4F94=FU4*cvqDL?dX)1qz_C|8am2nrNzG9_;M`KURzFdMMq4CJ$Hei5tc#NIN=t-9 z$Dh_Ipxz-q1#Hj@u}dFFeFsfqQW%4($KeM-S>8lr__$2aS%or3eoFr#e~4~4!jk;5 z!xRCfv~NPs>$$(aPO8sk%`e5n%tK*mFx<6tb@xEED_-3=bM+6j4n`GN^!^68 zwVN_c4nIXns_ih9=*?hd{H+uhDJx*3MfZd?%<4&+zF6~zvzyhMwhaRih6*&?;R+Ye zD*Qaf3ZqaDt}S{L@Nua*>bjlChu#~wDR$GM377d8h+H8EDsgP)H@4(+&^;YdJ5rjh zsOAF?QTf=fjcq8Wcf+-?xhmS=!&mz9smaO8GvQ_jZ~T$bdR(z zZ)KOhA`@BeA!f_zTeakuZRv^6AOd0n3$r9t8h$tlIbbv=y%0_|{^-I@e@>Jc-$3GR zcs?H2We2Y2QGJq~@&7Q)Xf#z_tM%yrZob$T^xvm>jJ#SqG~b)9kTAWb%aS&o3Zj{C zvUM3(vYbGAOtmB~Qt}*qNHIMyb+1Y7<_39Hrk%RDQJbSBzqB>{f^8;f{H$zjB3rck*2bzr8-{#-%Fm^b>`no!Fj7cB+sWiSuV()C&`SStL7t6|Q z7kB6V!F3hCEEwbvEVcT}dwO$(uD5W#0LIA9_3V|K6Lxt$Giil@Qs|k132#fsQlOoHpw$2}GBLda|0et$wNA~e>JC1%5 zJdwV7#eDTf_3JO>-Sw@1@ne?%DW(9en*s^lUQAG=2p2;BQi#&e*)Fi`{}LB65>3hR z&=f>!=fsr4sc=!4^7gm3u+D?OExh;OJuLi7cNvQCvh*sFEBu)vy^%Mn$Zl*|6vZ98 z<3)K=OHu!ZPs~AsqUjt0o4XMzo^r-3_rtU1IPB@#0d^1#hc*l|bFKv+&OlDEWuWc~m!g!PLAJM!^ zk5e=s5Y3RhNVv72!;wyou;zE@!=MEO_KnkU>N00?oK!O`K!wr!X zTXBpi5m!2rn9?Xok}N5bCK(cvoTw1hqIT4kfjr9D^MoXuvL&Mp6wAiYnNB=1>Q1~X zPX2UH>a%Exw&;z1W*`ov%@lM@BXI;sCD{G3TYjlA$rLlpG0zG+z1T~=+H3M<*(I1L ziYcXxvIu zW~PXuOIiW&0tE#cA|xp9sgI0V8Ou0`C(_uwv+#_HH9yoevtmBYJsmdJgSWwdqNqfPn{TO1;6hmhZhaw)>%SN@n8A z-nMnTl(6KedobM}zaNv<{XOU2^^SMg&i7jXw{6h0^L` z<$ml--}RNhlKK}aa`m4 z(_Tj?Gz{smJqqd#pdE1~C|FWm_DVATId~P2t3h4^a4l$H5S)B1vB=?}Nr3A?Kq8>$ z_>GWmq`V(tH$#E#9Jv+3tpt%Hw*lM^f&$zzyAv2h7r&DTrtT$X2KxPw--O(oC{{}9 zEdXz;fQCgt4)J#Yco(pUC`anM*h!A~_kqeW^#Nc%MD`INE&vbG7EfMa$O6zG2jr8$ zeiGzQGTkDupN7zG%6e8tMVIR;|#glelE;=xXmeOIz0$$EVdGta$9JN;P*g?_Qd-p288-{W#i5moF7d z7mA^w(o&I&+Klw4r@mt9vl45J*?5Omh?nVVmn7R2tci7OvQS+wft+0oQbixI;`aHP zDvrKPf1@D%rSB@1ZWe>Y)-)%#imAWO&DWUc1y^(-^cec}Oy z4|t&Z#b`c)|0q*XYG(JX3<}10waX6X2^65z^G0FHeXNCk$f#iH#~!GzvKj`MT87mb z@xXN*h|5KmDa!f+@*toY3(hN8Vr3M7Dp)Ds6MkJ76xx zATle@IZt_ny335z^fy@AdRi5=_-@o`+mR8Ux86ENAxhSErmGyczIuN&0edn9+f@e^ z|J?ZRn(pWaieG|}O$P{%48(3r$l~#q$u<$gWy1+tvY6#Uaww8XI}oRh7DE(=r9;SG z(Pv6t*dl=~Vhjdh6BVy-6IU`QT|72 zPsu4xN-0au0?ItKDjtQhZgJw3P>M{H7PU)NywVSq1TS=9(aOHyg_maKvdrLmUmd9b zg;RBMZOb2_?BxdA?IoZ=kgTFpi#gZQsHQ64Oq+7`-Kj-H_G=4~&qm>@iL7gS_Z}q# z{9F$oqzE;p+M$&il+?Dpg#l_^m8?EMGEAxbuCOIc@L_^Mgy4q@3JS41wo!JJS8bw> zn;)p?q@;sXbVOazV1O!B)q+5lPACpBrQM)`b~v9RA37g%$}!t?DLydgHXEdV0(DuH zV0w6qN?Pt=dsMVTcM(!n3ih{-$UxeV)zl;loXvsn8)2^v#_U5?Zt@Y0eW>FeQ5K8WiP<0NcU?Y2 z9@@0H{0sPuZ3`#d1lwF^c6AE%x^5O~IvAvkq4xAi5M?VZ-@!^vRk4Ic3yR!$1+gTP zzSvS@yIxhcd}yzeD3xWB_C2GtgwitV@9Q5;Uc3; z#S&{>vt0;3rl@R`ge(AI$K_O#{hW&`3C*H(4_`WEZ~103d&kVcENL9%Y(SaN+|ih- zK$(u?HE>VMYx|Obyn8d*ym0UmO*ab8wGi{ebaiUw;T~BVi(6?`wU_C1jTsGA7FOB~ zoop2bUFz_|p7N1f{bh2^mQI(2b-_A365B@{7c8jwz+rv@kL_OhA!@4cvAX)NNT^WL z(Ynjf`9AfC#G|%-VuA?Pi(HQqck=pyldQrFCkWW#^rT6{pF?>#_Ki+Cj8j6bNDQ-O zqu#bc@Q_Um#r@euGUG z@#Q3?KyZipf>6*vO4-8Kq7g#BhDjXeX(U#WAn1KF$|+vSjDCwuxriR(9UeB3lwWtd zfr`VEl;^gD{DxZ9A~|Imq^$As!Q?#sRa5Qn52th@Yb#_DJOr5mS`knMi&gaqnm7bk zqmv{MjuX*RgHuhSP#L2=j__HD;0MQzj*4cjY26A5l6CH8v>zW!GzP5B4KU`xSnQ(m z&+z2qbEQGqhs#RutbU}jN+p`)nePo+AdU8`QKew#)|qxg?Yn8pw_%VD_eo4w<0$6& z5UM5Qlc-wKzelA!?f<55;D&S&RiUvrHSzJwogCFnLkA-2qxC0l;*n zXAzln*rf`VFOuVp7hyz@3j|}7uY9#Zk#tC}wVuOQ5n70_iPXGEfd_Bz2qJQdEm&Vu zYc+z~^%zIIdsJAhD2;mV@O?qzK?sJYXynjh4GVOCpv|);VAMQ3aKja3%S-3E^r+{D z=J0&*4j&NZ^C3H|;t;3$TXXa=;7mGZh)i>)0mnpK75?C~Is&Cs>Zg^>U=~WHrop(YM2C$w7nUCeS#9c;N2hcIrj7frio1$ns7C(_cybuKN?f14J|P)j~A z<`aY8h8Gq)S{oK@$ZzrYyxUmuYB9{JTPLSAI`~V?QZYbrk3NbrqtT`_UP#JXwrCu; z_#=nWuLo@2bloe>icZf-uL>Vd_hXWkt(cO33sRb%~7G?2qY^CnFm=~*wDRPYC2+eJI zxQnwyi{bEBJI$JAW^-6;q=T7uSpE8{lg{x*Ao+M|Wi_b<)Wx7k2(FQfZoG$uQvWC}8en2N4o zS{nUUL^DxLMi@NoL+3|{!LGN@w9rQW=tH)>x)4q+bzMuK=BNRl%$%_3U}ntfn?x4D zLJw0W8IAWCv>efOOY26a1f-RFQO0Dm9dS|>ywMVMY+kNq)iqU0*;?@>OkGqB4T;^% zwmEzEK18m@q9_nM3|5sJ>C9Zj%%td|Om-?AM`%>0D00LJhaWOqyC3%~=|$dn4%I?b zqs1hVltE+fxVMofjSYk;xJ*!E@NYMq804T;S{C|Q6rfkC;Iveei2^jDI z1ms-C`v>d(4YmZ}tR6$7n6GG~jQC%LmHMuSWdIY<0Dvu!1rQ+600CeVqyxa_2m`)t zkAni(2!&A|wb5K>{f#zV001DikrcDn;<&mNx7gR>6>KejJ+38a!?lDxyq0LF!^9IC z0&)@<0Jd>ASu2bC-UwLvkE$5|2WVRW1zclJ;7}ud-|uthXpZ0bPt3%RU~&gK6?5^F zJjZVTx6N?bZk<^LOR&n8WHqgx^^+E3owh!LCTPI|8wS`31*k&T;~CsTjulRX^o}Hzrf*eLx-x(kh*# z)1(t7n=+DAQp0a?$s6wY#?_2ZxX1T&a$o_K32)0kVmCGY68!Zf2}6OuB- z2xEkZ8c@J`mA-1$_4&-g~WyVE9_&^S5NwpxKd!&&nj`0zp;rx zwzLLafLKW~K&7ej(BG~w5HOJO`%{nqqk0KkSPuvejKG1gyz<&`2^a_vfh}+$fdi-^ zXo(TNf*5_gL>m&w;M)s;B*JTHa(eT`WukONizLt*MVB=x2@w5PQU|uLR&W!(qRmgf z2@MO61Qg`1Ed%S}5{@_I7KVchQocWz=C%2$a)mAVN0^6**ddtstCM=Pq&>YnBorxW zhxF!#gi4B=i@}-=fdw+z2~hkz;G+h_LiBUbSp}7D-%v0wPH)OW<$`zY8?s~XH(Rp? zTvy4a1lH%qf>3ri>Abgs`P8rw;P?0m9-sf;a&*&E;NSf5ogL}Fl;%t!EOJxzNW>4k zw1Rm&c|gIui1?G6;ezvT$xU)rhyFMSb_c;G^{YoacmenLU%|y734)8kf9K7-Q303S zHran*Z_!HOeRvLeeU38n7Yxg^!VG{%vhUW&YF**gzoo$R)wFAx_f_Yi=pR#Wy$n0Q ztAF`AzQcFuh+%&*v%gVT@;~_@d)uXk%A)LnGJw@|!0z`00MPWaYG>6`pi+I*R$KS9 z{YO-0WZV$|OoOqXug0aawiB-atq(!y@M^-m7_(F}PFeLRnv@Cpw+ zE}liqyPB`Az27@LBKd&VPxT*I!$Lc*KlXR}&-^Lp%35{DH7&D>OY@H_4D=_uoMN}& zdpg_i2Dgm){^gf#1KL5Wdf@$D-AiPW*a(P7a2PV3>BVh~vBtUNvMXBW*fb6&b zIUy7;R0(Ba_-R6fXAr7Rsv6{LPk{~;>PV4J)EG*wVRz9G+Ks2#R9Z}<)pXi~(QXC{ zHnZEz1uuES^c#byHeKjI=VF4$BD!E9M3XVzfv%#)=QY=`!y|l*_*RxK7_lx zJJoCe$M=>0z($Dqm%5PT>FXd*ugfW!{+w$+mDHNx(^=ScfZvW?%B7aJbRX_V*v0a^ zPYr2uQ@Uq1pa8>Q5BAwh=Z1T=Pqi@_)d8LVT5}1kwldvZYXXe^B+wDhP z6*N>OT20c`;<|bCnGZ~7>J0CEcc!}K-Cct|?LLnZgI84eKoo8w(NYa<)zMLdLr3;t zpFO{~d(gw-w1z#}RB7j<9`$(SHrkU35)6brqO8{Bs=$haOI!{1zI>A_zvwxRIL|}g zKVNN%Ifl<^cb0PO?{DjUd%Ly#6|6P4SGwI%o4SA8mo08#V)geYg74tDUJ{3Epu`&q zp3`f3)of4wx^DM5JSSex|LOm{R!tUOr%k?lH{h zg|~SD^S}GoC1^QEf0vKFw|8*2w5RWNV)ytCRCr(mw|D0kc!~RUpWY8YVbjEG3)|S{ zR_oMg9q*2Gdk2%od`|ZYQy(?)rG4$W1s5~Uc7M})(Bc`>9OJ+t-T{f zeSfdFvQJH{b=R8i-&^PnlRMbHW=qC)U8{wE-xNP5H!X;ZU44u#Y5x_92n~{o6Jy)s zAT-&jc%@yxu5YdMD?=y7C{CD8T%BN^5_f{leEpeFy6=b3%*_f1_71n>RT9K3$(-u{ z&5!!O38*F4Gbb`^g4~T@Tasakd_2QWZkQt->)6CLgb)*+h}uWczy?Psd!iDZ_#`AT zNhz{7B`J+(^5h6KWsmU=+vh)1uBWl#5Br!O%Qdv^Vv1${rYd*7l~t^0HFpyCXYkk_ z`{S5(+xIvV_qZPSqE4n!KBhDZ>| z#5MDu@w}0nzL}d1D#gragH8!*34RDd7^0AdEaXd)zVv4x!yA!18OwO3Gn~0BW?7+Z z2wC^cI-MDF`qVaqc*Rc`Ksp*?!+$SGFO{h<#)uH>|JTyZYmcS zSN!XJH`n)Wuls$wp7;H7t8tBu46=4g=yP{jmAgxdURm9*p&oaxK387V-t2S(x`XE* z-{XG*h-cyn=A0nSd`r)zl_M1S95{O9`rjP{nGPa74Sr^)=~kxYRzsODq0YBUEb%q9 z`&!@mwY>{Avl9%O3l_Z*>>LJXYeSQp3%`v9-mUi|S@h(^XMP%QZJKZWBJU2SEbaa9 zlyt%+8wGmyG&;1czWUbO(EEAa?>=<7MYJ-Q_5)F##HUPR8}^K!u#3*R-xuH0$5v_?`Ty-N`;!qk57LxrwDri6dA?}e#jUrVx4~A2(@wFmG6_o6HIm3R zG?OVcwSt^RrrB^~vk%|`J@n+r1;gYBHTwmj$B2+pp7yX)ZX2IPAR#hyXA z=TPkh^!v!$`nt7niD9FShdMihb(mwsYi(} zlc{B(+6Qd?t;9gZ#TCT#o*r0NBYO3}btOzVmQ)WKX` zEY!nNELQ4c?LKTYV8l{JEo01b#;st&N+zvh%4&`s=fnw4o#f1^7yNiH`K3Jm6T~2F zVGl<*!xirEj2FwtFMv}k=r=lb>DHrHpZ@bobYc=4ZsHQ3gjsa##HlmqE?nkw%2Scb zRHZsKsZE`q{OlLM`pxg&cpKgq8SR%E^Ou&OmoEQ{P0ou;{fi$yqGk~-B(0)n5qkU+ z5JmzMl;F8-#HcajCQO>ThBT%r&1p$%+S2a553U$9uH>qTK(QP{ym}4V>Wz41*sQb7 zo}VN%%!Gw?6U7=ZXnNJoF(R*om*kb^SK;4df>f+)o18nYxI@hobC7uA{j$&E6MmMS z3#-}G=!iM_{p@4^K3?u7|69hq$3BH8A}^$^euOiaI4{G`L}I^mi-NjPA4iJhhwJrr zmnKTI7+i7U|KIqM?OFW2=(pp|zDw`?>-D?pYZqrs()_+DsH>sxC5-np0hvS0ekeHkzRmAtZhJ$pxsY!>h9 zeY@=f@`hq^hhN#DnzgT}rfSYTbSsaW@7&Ri+;K-(MUi7}%1*3$|jof~^^kA|wq-H_ z+c9{+_P613#}3Di3~{g%qZ#bX$O5}Cg2Ao~ZLr&IguG$*kDG^1{hxaP_6n=L+c&)S z>%fSvgD}Fu!Hg(y2qP67%E$nRG19={3_)rtU0XzW9 zfd^t6@SvOh7H}+h2(AGS#SP$LxDz}a_kl;?Rq#lLG3 zgIALW@EYdjqWZ^2{(-ii~!+ZZF@?TmQv4klmlPR12@SK|k~n*jyyVbTHb zWzqugW6}lhzYUQaK5)l}8tcPleI&1s*6U*(x<1~?eWFiyMW5+&eQG}c*nWKhl?=Z4 z?Kf9ndVZyoyS^GI4Za3HfUh%hz&B2gPTzcfC)Hiw4cr6Y!-wGe*ch`>(}GJu~VJn*xd$lvhu4=MMHew9PN?$_D%n|@c@^?RrR{DClnKmMvG{ptA2 z-RRd}VH5y=!^i;s&d3G-_|>TTXa6qw`VSlj{)>me{|FQKKkkPBSOtI}gbm@uY5;^s z{|7-}4FDn{90&%dKqRCBk-@1D1*t+*a2iBA6~EAd(;>zwE==G&h=mLxHWdwVkPgHJ z*FZev4DrFWkN~+rLU0` zAuV_zq(d-B4_*TqP#I(dH$x^=3Yo!YAq#4Ptl)Ey4Ru0x@Oj9Ax*#X`0^~wHkQ;mv z@}PRiOJzX5O_Pv6)DhTe77B(nLedHp-dYKYL^7i9bo3Gv>4@)i3?(8PN$CViQTY(E z=@5R1dZc&ShB9%C>`re`F3yqP>D^Evu2I|>0H~bcs7U{z>bGr|8jS@|T}q=NV?)hv zkGZsL#(~=Tjn2*@P`8ND`;BY7^c6V~X6I07ThZ9bVbGpxgbtfSpkqzrv~xUku6bN`PKB(7o32 z*f||~);3-{!=QKVuy(5sSXbWE%U-a7N`j3v8Eo3@51Xr) zmRE=1+HyACq(loT4e=47d!=B1<^8RUVv=b{2l4I{&g&AzVsomSr%& z6|fcnR}lbk4SWf%t6sPvmD$`G7jD%t+dF5%ojPZC=PbBa*X-|{4G-#`!<}>BQ9W}k z=fV>d15d#^06aq|0MEgC-~~blcnJ;zULgv24W0u(A}IU>UIag@4EROZ^L3|H_$}4> zzB3-YNo{Ure0X;j*FBmVKA<`HgNlMb!KLsQGKY`g#qc-Egnz&t@UOiEpTs@?WDvmr zUlCLP!I*0~>+h!y1Ig_~C^pj{!eM5icZp4)P9s z8KKlSs5|f#gjWBc3#uawOn@+<2ExLG2pdKt9IT0OVGP2#~ zgbxw=0EvR#Kw=xtMB*uo#N&JCk_4-e)XjEpf_!uveK@4=eRRnH$0AucjpXPPB>y`e ze$+$uqxksVd?{&klx10@f@P2@Oh#&00ja}tq_KGrX+}I+sx72#?I0aVkM6F$kzPva zzYNwcLo^XGx^>l?j6b^COb*j~6f?^#mCQ3w`DLMzWm(Etso9Y=m5yvkFS51vke!OM z&!PO~SnD_`ZpeA7Oytt;a&3RPwKwkn*GAV;p3k3_S3j0_FUzNYeT9k^LP#Ru9=~Nej;Z2l*4^Speg|cWGludJ?99jtF z(tIe7dPDh4HK>3-Lxn^E6;Uu$Y@eeN&8*Tkr%Y9V%CR)6pt(_{&5NpJv8uCPHCauq zdIidM60w2TBF9$I`xP)s9$K4PDNXE3fg8q zLpwAs+NC4V9&Lm6|D4=DmCwWE(NRbFb=+~z*GZUc(J7sX&gf`#PP3s4#umC{9HJ}6 z8M>wg(8qKdJ+qV}*KRI&;)x1%>Rj~HQ{|p{>9JQ{;a+=fsCtc6_p9)1HUu#fMR_sI zA{;lj1>rM5#bKW24{e2c znbI&Hy@C1ZNi0AeU_ojh3(?J3m~O%%bUGHLF0dHgipA+VEW!L4OVU$ViuS`0S{Q$z z#<4UVgk@-TEK7p{%eBu}9{a~UQJ{d3A`Smq)2nr~%3{u-wiG>vtzMmCeSFqo^X12( z{S%bH0b{0J4&L!qh%j^=?)$TPH6n#MDQq_1n$Dg;F}l< z?Qz=1OPt=vfhq1d18fP-yy1kqv&!yha)d|XT=)m)i92z=PNqQk1}=m|xCk5qE{4pw zL`vdPole#Z-H`Wwjg8Vs#~he!k-rfu;EZI4GyBpwrc`tEdYgYPq>^h9@x)6e1uu(ZRum{+C1rSxnGvs3hj`=H?$hR{?ftuU zLW=S3*>iI3-En`NnOuiOHQ*z<4Ifi6_=Ls+d`e~GGg<|of7LtiKv&`iS`q)C6Yx)@ ziGQJa{CIM1`h7gzXV&W-P zV239Y!a$2C_#qaB2#FLSq(WF^Aq~06N+`g)3FV*kJfDO1R#W%Tz39*3V#ro=gfaBR z6lTn^hZjd&kq-BdiG=XPSKs1qcm#HeAcBn~lyGAsvTJD~+T;>zZi%6WO*#?r|->{8d>bfR-bHR0|2hq9m9qBO$aq38l(O80|sAsR|N7`;bT~heXk; zB$^%|G4wQvr2|MD4G$##?EGhfBZ--hBujCUqKSd-WMTqVs+`HuLcqS>k3;Z{=B%2e-g zJE>`P)keAM`m*YyUJZSlMpYtdqKQfKS?8+--A!7nAJWErPTJ4n>cD(KIyY{Tu69;; z7^|o6t2eCG*TL!!dku8B2E&=5oodN&G;5@r8C8XoG3thl(}84y8YGk3{DVvdp6Q2c zh80g{H9vFzgInegt|k0-4C_w{6!NbWhg7o{$YhN;bh>kS#<; zw!sl(2T_q-@HDcgqRGB!=RjRe4yk%_MAwjGYKWXL|0Ji>069Bn?XPput&48wQWPau zv<$h1V&o(Jfqa5q%rq* zef@yv$WOdXe&KoYNJWs}XSLU#s+Z_jueQ%$wg1{<8Qr5;SPFFf~ujr{%9g(op{k58WI9eCkBc}Gv7#{|lf zJyxI@iuB(vb(k=z>VZsk0r&l_ zkI6wpQ}1_vry3pIg71B=83V(d-}}ABX8IHKJI_#k(FI?H=9@11E_6Tiv7f^BOMmcN zIR5AhC$VzYRTts9>W^;1ch~nGV(Y1YdWjvNe}Uo#*=AVW5i>$Xj2R9W55kN|iKPss zC5|yREAgChcu5eT2+l;& zCrNTH%RXx~F0@)-bUK%Mz3&Et7e=EWCMF6c$;;~+AD@5X=l6dE1S|^*DmmeV9fAYE zwP}(q%Z+VQAhdBDIzqM>GYIiUsfaQEa_&(G|4HddDgSHjxi3C{rs_^ZTWn0bF$m_X3bgQSKE$E62Fk0ILGdy#aU?3GOW* zDkHgffGqz}+LzZ=u{#*03dsE}h z!QTavF05PR^oOmt7_vN~%3>?%@aQehnmwY=5>cxM?q-Rp{Ucs19qMxU_Lii&e$7eu zdXEnJHFQa3*>LchWhDH_G75fT8U6TK+<8CcnRu?!6Q8FDFUyC_kt`n(ZI+LjqgXy6 z<}9BwN3+ZzK`b+wV_0TkewNwHu`F{)4$EBTIF@;&p5?PQ$7AAc>B47OU;N`Or}c}4 z4Sh4bM?r;4gQ5=1_ewgnh&kdYh+~}?cK+SFPbRQCET=9~ovt6|oZxJg%{VAO7sA=a zQ^6B8F2~Oa4s^p5?le@K9C7lhIJKGTw9}?LQ|D$m;(Ol5Gt<8=8tqbDo$hg87jYI) zapOi?-E`AD0k_R{#~lmYb%lF>!+LUy&;7JUF=|#kJ1_QG=(V?YcrR$TkdWRQ zHR{_RguH`_|3aQX#mA8EKt(v>QXpqB_HN{YSy1Y*TquU{M4%YMlc1P_gQ5664#Ipa zZAe=)@}pJ!clg)@n8?n~(}A8Z!BN4JQ-uhzm{X|TTwI2A6Ty*C!oodJng&0E5+0lf zrCE3vptO3nmYCDJWr{sE7Dwp@+8JQ{-(>dOe;YLvNYg zN965L`aaL5-x;!GM-RuyDhdeM@892&&g;CTN5kXHz5tkDzi7*jKPuY5=NF9)oN!HD4G zAkLM$NMxc2J~XRi$i^~(BaY|y5e&j@wKw8N6(t?=J^fPf?gP|wt)``g=^tzN$;-?w z?an&v^PMjT3%G2F$9z8TK_DPY$f_cWiSyQt5);nl-l^K>nEO>dlhBXcT;p5ke`LDe z-|{J_qsXu^tIl@YN+56(iAGZ>wzZ$|VNkb*6+qoT_$}0fpDZUth-I7=I{96@1P?;J zN#uu64}bcI$Z9cdyJ*pNb*#XxQ128x4E5e&Sy1mA`83o=dU&5aU6%|)HBH^JG@DJa z+vPsI&;Ou)p>VBKx+AZQQG|l{D z^NVGD;y90a-XlTqS`@vKB==<*(rCQZYCY8H{M6SSQl0OS?t1tC^z`i2*LR13fqh`G z`ymhyL5rI^Wz_3 zKYTn`w#^<+EfdlP$YS|E+=d za0?&s;#E4Df#;uz$VcYc2w3(k7vu2%| zGpFe+_i;Cz`-H$vXnZ|AyFPeW6Wdmd;(F>l6M+1nMI+B(dgP4LY*Rw=3h1SH-FQoj|#mH`Phy5 zeO%~c$R|SE0r_NTCm^2+Z4czrp`C%ejJRUub(bkNo7oN=m}Z*hD)rxtfAehS6IsHT zW&AG(@UJ9pnm4-FbxbB3^I6w@Z#x?w+0PCx=fZBTu6F#HuE)N&KIU|H?!4{Zy>mQx z@Ty0Tw)6)g_nR86Q4C)WjZ&m~Xq2BTR8(lYYNRKtQQO>8S9e-NLshq24{2-rtve#s zK%*NjQPAiOH>^f~lWAZ;ZD^>pM@IU6HO9N$H!;!BQ_rt3Gjqzk);E1V8;%m3JY{F{lSkDb{4N2S=?BtPdVR8v5nCgiH+uANZiw!vMf~gaCm}kPdVn_^V+EMrH|n zWNj>nMGTk@&Z8563+#XgFo6#|Is^|LA;PSNZ?g+(=0A9hnC8y}=3fGUjcfH!9`Xvl z*$Ylu4ZGF=FaSV6-oJ2n9_l3cK60A?6L*yy*(QN+?# z0o$k;`O%`{>vEcL>_~$S8W7#TKa9U29j2FJ znTP-}v*s6hjRM5(I)JDKaiz9hu&9@L2ArqjV!}BACXCLqppz|aH$h**6ec}TZ?<~3 zOr>BrW>}z7bDZ$S01#I5D+9>T29qDy@`Xg{S)rq%Q$`S6@CAd2^G(}*GTRpXqhQ4` zCAGkQvlYadxZnSP0%jn>lz{!rVm>WwJNoMWI5F3>zf2J*Mr`7py2W1q4dPc2(k%@lOs#SgFGXc>MB~*=&Ov}Rc>>F zOy~gMIs5XZ6qbwkWY3f#k7A_(ja5q)}|-ZhytixQ5GFNMr>g4$j8OH14nYn zi2bSRo~$a(l$z#q^U6LHymRAB+Kf!=sR??|QQi_?Z z4S{GvfYIQ{zAG(JdDVy#0CVF!S16rB#^WKY$GkUMv4Z)cMs2lA=M`MemFg6V03X+p zB&38mmsG;~oNV}3t*;wr00S4E-^OcsxUnBc>kh+Z1q%`!^C0pB*!vlsUjFdr;BLtM zb#A!S64Dm&V_kcFE}#wtM%>E00+Bb9IR+RgJbD1*?F*S?g3KrVuvN2prxooH^Zl;y) zSPq7SvTwOmN@L^$M>&&ZR57#OZ9;^AkTpD>CQb5-eo<--t)Zv`iXUsT1hOKR2A-GS zP18HDQdD;)bg|{0WE_pk*))yLm1+Eeq2IQXPb$lpM(ZtQ*927CSgb96Of?KDgusl8 z7vTN9{)Q}sfMtpaqAjlcXy!<3CgIseY;O6@yN)<~o$#?Ka)x8(bSAOoODa!!S3vFH zBBP}WYU@^R3G$gdELgcGW~8q4Lqs2&#AfmW>A66CJax3V4n8*y z&a9vDi?_mADd)l!T@A2qSP(+)c}qg2+6Z@+sK>_Wt$ci3*M&?&Zes-Nuavf!7MN~K zj2f_DQJ;mVnCT^yo0S&LAmGieE6b9~Fefd5B^nbDg29j1obd&O942Tj40GAqQGf1D z!*TgM3^yVsp3W1_n#m&`SHgl(^HJQ{U)(k<*raX&$7r!Bnp`Pho|lPYN~AG{=y+YH zm6t~TJVi;9FfB1U1xM$RExdIgO(0RsjXiDbB4{s{x1n|d++ZB#H~0!j;O3U&NL2>$-y!tM3u ze1K4iw#tF2QT4w6<$`d{>=NM?DoKubQ&ADHM`V)%ammh_j0>=D5&64jsvCo3^?4!u zb4BK-gGM{!f&MJGPDq!ZEGf{j)IB0Cs=!MbK zmyAV;48<*lJcbgu(40+Rd7+?T05xoR7w?IC#~pSA*@PQP^s36_y?2K?sxTxd5BFYr z=}-j*`R4fu3<(#zsd@ITq5=Co0@vqghaaz~Ov9Kud z_V~r+(~7qZWPh*viXY}ZUT9qdSh|f`iDRvp&tA2gZ5_j724R|62IUYTi`;2{TX3BnCLt@Y(wnhwQ9FwA3A1$VFPQ*2r>lMoBcL^3)$WB*CN=Eh?YfJVR zWDzpTlg1PrG>QSl*n-8}FQU=_MQVYF3#g~pWjgp#WR!PLxN&r)d_t{I0xQ=;`>8DR zB`f_*LGNG%|A*k_hF$W0`UX(RX%(&ip6fd;$CJ~rf%TM1FHsTsIDcM@OlfAm%ZS&g z%v%}6*UFUO8zedohAIhN%IkjMv5&=$RZh&sx3kCQr~C>LcfhmlHV~(+r$mc7D$Scb zreJJt^3T1y!Iq$9TViV=ttrCfWEw*?1%bGW(o#T2uS@0W0(_K#Jwq<$C_G^@caZYM zmI=YLDEOBeb6&9lJpY{`$BeL$2QxfIYS>y(R=GqulJnwaWJj_d3!1wMOf&$)o3qvk zK74Gx4gb!|N*s7O!?n3AehxV861=F-W#9vf8!3f{ z;dQDkWNIWQ-%tPE1iYrmD6`lLqSC;V{2FX$#Up&4z5-KmY;{2QoxP$Bp`_w4Or`n@ z;tKRi^Aj)xXL{|WNK>jNFHu&7Qq>F=5G~Jj@U3N+ShgQnK>|C1gkN4oTPn2yOK)*bG)3Qnm^(+2u|f8CK!Sk8z*M|Ybuh!v z-=xTWFFFR4U(Uya38`D0w+3S0069R$zeoPXLS8x$r7f&LuB3kXO_{ocjc14gO)u9A z<-0RMYy&&yn+pfw@1^cWp~x9=9~Wcv1?A-Tc$Q++glO4RzPP85 zjhj&@Y!{-#GEZ=N?xe^A0x`ettftljj!{3I6Q-kzm?}h0H=uJ8of6 zx~@XEQuMA4LlKX z>2Y-0$8-vZQZx%sBPTK~k73LGM4vfdwu)bA*AaymjAEnOjGFo6*(Z3i<*+W{H&!L{ zRO0}3>h=5?+uDqxCcXEiUf6C*K_W3nW3xNnl-$oB5IW#%HDQbRtY+Zu(#!_gX zxZ)J?t+@QV55n=E=YPxu5%$J0{Q8j~_zEJtXW_Y7jG`A26eVjQwZ$BTgZT%y`&2)| zs4k}5KBNIwil1WvlJM0>sb@<1`XJaGvqWRa;CO398*HD08-S&fFv@krZx}oYOWnrU zAhgr&an$tQo0QW1S~+?16XBr*<~ET25nZGz!DxS=ejrq3`%PEdqgced&d4)roc)ML zfZcR6Js+I?Nbwu^BEnca^kE%GLK35>>tG`GpiqX4xqHwIw=3XYi&Kye!%@Dv-fSjZ z)WjT?R-y%t>4Lhp-_=mI=Dy?)3{mft46KhY&)efOpdpWxHG70@;sa~*eV6#JBderywk1$NmDCF9xFUq za1!?w`_YC2LGuJ3`#nYKld5mo-B6Ej?W`5|G`gCxRa0>R*jgNii#%D957aQfdY>NL@6qh?i|B(TKqe z9QcMxuRMZTcQ%^SX)A!w3>_Pk7_V?;5I*B5_a|eZGkXJNg!OglnpW3pyuW!eUZPB{ zSfO1I&)lVZGJ|i)l9RJ%|0shzsMf)0cG|W`W{7^WEL5}-aXBE;f`Lv+WIIzSIEs+U z3eMV?wSdD&_bxGMz}J|wE1YEx zLoPuD%Us4bcesO6p=W5Z60s1=Zx2)3soQFChLXaXZ0ZbG{6zb137uL6d_w%{~zBwv4b01 zSBf&il}zsKvO$9c??r+|NX?3(DzkZAx~io?nkU|xSiqE1u$^N%W4F;Hdh4tDA>D=z z3T$|U$C^3JtX5f9WhU52$wBJH3zES>P$?C3B{9wTYa==} zHSoq(UdSyE1#C3uHqy627Z;oO#Q+7F<1~jei?8nkAV2<78o!H;EBVBUsZmSWXZbm+ z*^v{%x z{JRt7_-E2g@`~7DRW09&oanQeo?>oETvRitj$tveR#|@LIKV=w9*U7eBX9^XI69oq zB%U+>hZsN(czdw8=9K9SP3S~r_))`2Rq z78{;3JDe6z=~Ob2Rz|VGKfXDxIKsq0t;8!=mDKS;|0)yNi!{>G*J`)#IW7r&Od-YR z7rQ5Pu{hc$=JIEpMtfZ|U!mu&aiEU@#K9ADBMCT6$zB8Rgz8N5qWPY}$%e@5I5zLe zZl~9aH-MHjDQg7;Th*mr5aKM7!$V$_tWiw=ks%H!Rx0&4*5#7vYy$Vk}0+Myn2glf%nd}4dj_DZa+%Rz1)&2G*0a80t=z2~qIr(Fc z4alLLm7^(69h;T8GBVh;F6SNTy+%0gUsYzL9u{Ea!f*R{mY!SqdOa~D7Vj*M?gNn4 z$gl-CN~0RX%j>~QO{yxb__OgRuQeBYg0%{H7n4-n#Hr|H-2ht`3V}z$PdE%w-aDZd z)s~2!2sX(ra$E5}2MpHoEO_eY8GRH43^x!oJSEzEiV7K8J&}tz{ zOxrL7Oz`sr+8w#Rkv_C=08-;0(&~)?u-SLKCN?IE^Ed(_KTR=0gy!ctxHRC#`F43f zv7DU2WXh$53dG0OGXTCyWqFzP#{nkRo+<}kfN=ud?9oC<1p zFteW7#sZ>;IvKX%mBQWUbVbS}h9Luz(BTK3i1&6sadcpnB?gPN(85z*16Xu~}7zAMa_E+kw-XFp$h-jPl{Vb>)R)7)Z5DVrOA?80JLhmhkQP_0}?; zXqI*O?}>+n6dbNJveYp(&colZLnS1Lis0c&Gtb*zK~xw76u`(V$lkb>YDFO`41zI$ zv7O5OQw!J0P`)MQ@E;4^?Ji`)T#g&lAWl5eE9*Frxp&!rT zE@ZV#s-tO`dJWSZR-(_VQH5SM;d-yr(EJRomPp+}g;c2Idd2o$o5FEm5{`{w;!5XX zZg<=`b!hd~hC2*9^Nk#L!B-OG$`fNbJ-(_eXD578nWoA3m00JBeM@cVN#+f4WM3vR zZ-b>L_p<6oJ~!7BfwmUWX55-7z?WyPfi5wbFCL-sMk0-j%uj!_8JIP3K7r<(=h&Dy zoHk&N@x%KMw)iBbU#!1l^Y;$+FMt{Qocv+;CV_5&A5sr}Bs1l#+St-#MVKY)`O_-z8pDRkv zzdc2QMf(qjHclk%g#8|OQ;hmSr%Sy^a_#ZaP%hW~Y#c*E+dou#{1hjB)LS=nE*_ik zr{Gae4pd{rsOy!?U(UzjsC%~yV+wo~BgEM&h0UCt)m(cX>Ioa-gRa4hvmPgILcLV$ zd$~5Y<~UI~Wi7DQu*(9q>hry|14Pc$EIso(LBETT#d%FPBGdv`@CKVwp zXVHw=ve=n0lIY6OIkuoZ;qI#nmblO}oR)y0utO^ABtah)C5gI3p-ic={gFgkrN@)T zxAoDBUC~QZeQZ2~qzLI^7a+J9Yt=Mw z-AZP-R4}l2BV}N@fLD72Im*2&spUeL3=z$aj9$2}Y-1#*nVM3e^KuwMKMi4%=-- z;OJc>@AU);3`>$J`oS8ZC1dFx?`92%|svu~R~#E!$vcEt$DCbi9S6N&wA zz|(;WRsI4Tn*{X=$}dQSb7dx_GTYfpNagg43)+dkvpz_1j3-N=*@&mJw*d<@GtK`h zLH%9kaZ|pq8bhhwf9)HP$$NzyK7-kx%Q%5NRI7=q1jHD&Z&Ds)9F~AP^%W!rj6*Am zMUF4?730pPpyWOvEzCij3hd#@l(lgF?0A1_8zvHuanOQf0P`gGf^ZST4)JndZ;uxx z)(R@Jvw`iGrbM$N(BXciqxIRA41ua3G`BmYiCMME5OB08sXZtq4rmTMRjSxYx#!i5 zm?FLs+8{v{B&0~Itdm+?)=w-f2DufFz2IC4=y-alyG@oeaQC7`q%7V_+QW9Lt;4A zu;2vDo1Q(SW*GtxL6(9&5Ro*-z0}_0(`UFX-&4f%5k+e~+@hxlKFA5Kr>SHk-YqM)mtS!}Y z+;vt^THnDlng={%eem+5%&StN^@D>*FbTM06gytul?^tK-nR+}m^2blcqroV&$FTR*lN=2EM-NSBz^+UU|?6&cYe&#|(%rZ>Y?W}f?rX~=uGYI%upT>xnQ$aR7 z$u~Wm)tRSyLMS!n!Ag@G&dKX!C=1yXB;lV!a;dv#yV%P?OciW zI5GCVXo-t^3I@i#C!oj;e8dz}l#W~J_IH-b#WM-3j$mW+rN$OswVu(&;v%3o#-_D% zyINl&cOgECp`Cq)b5+^hYyue4!>nBV=C;N2h|<6VG@cqI);ur$i&XwPGO}VT(cV1F zAGf7|^&2p=VdAaTtK?&|N!zw8r3O*%cB-JR61KWm$y6@*E7;1itXgP`mwHxmk@Slx zWpco#67(e@Ym`vgf@>^-%X6$O9Ld<4uyE-l77eU7xCiolWIDCYeTc;=%;%ZP6YeKK zio4rUJ2OT}r=pRsW-))E&=-j52uKYMVk1CZ=2qwligX6cP~kfSnrt!r^R`s$_Hmn{ z@(!RG$~7fmR8D;MdX#2ir8n|;T1a_Ztq@R|s!=(+o^R@@at`E50Ytk+86|3|jVH(f z-((yoYK^smwsV@jwgPncbgs*9-Ob2xnLXJ%d@nz~+pS4pVvK41j_*SF>*bhTL#jbp z_$bcm_E8Tytx$`1?}?smC4k#>2v#TEP)oyYX&ZmNr4e@^R*&dCI0n$PvQzctt^sEW zubHV_tMuM0gf2G6Lgr9mTx7__0>YHb4Wn%A?ug_2&^iWrTpx~*7I`;!i7X@iez;Ec zV5A~6_1K-=E(2|cwb~#Be5NSJ%;3gBF~obBQ96eP#;thbf8B#~$K6Be9SN`h`yKa5 z+6mgSU^MZ?c0n479oK#@g=6@Q~U`HyzIMSiRc@acz@{`t!fI$*P?Hbdk;VWu{sZgDpM2b@mO znZa|{E)trjbJ;ofU$U{{{($Z{c)E*Il=I5EV%dj#7;Vfw5hIfWpy1M3^KGj#^r`@% z?u#KhaaNRAP;T0?6Te1_D=y~>l!y2(JnJ|Aqi)`mE;o;*{0;LxjPbDs8hn{3Z@6Ce zq7BuVKD#p>xbMYpvN|h$UiMrJNt8pmlwf-(Qz2NXSuR@5?{@jaEu`pd0{((Ppp2Yj5gmA;AD-Sm<0hKpII@AloPQ| zWNAp@Fr?e-`gM2OTPekmLn3_+71^r`!?+{4MP>F6yDv5=%7%WR5x zZr$$^-B))6DvJr2g7R5b`KQ^NS|1?(UATm5Q6^uH8K92@?X-_eLjzCId zx*Edz6%-gdL0Vdn$H+I-!+5BX1!4ufAzk2|3kA?E|MyC<@yFDkpG_b|S;T-4uYJd( z)G8gE$;~7ti(~KXRCApXi_B{6EWKpO_Yzd8Siai~rgh|{FD9kOIO+T}5M`1MX=Flz zJ%!Qj&L*2Bdck-UNv2I${?MRj(6$BmNev6!hX6&Ty-+XB43vw6%n8&0IwpAgJrz_t zumKndHmkoM0;sr91+ijZ9UySj{E0pkqk9KDO@i54q2|tK9JU&;9toE`5P`ulvCxkI zEfMN?RVXM1gzKX7(Ca^|#VJmpjd37!^(ZF=9a4|O4ij&xm5#o^tczg-4m|Rfd!AJC6#j_Qnbd3jMC?@h@$7ib`!TQ>E!R}7UYWo~dq z+pE9lI;kJIrPh@y7GUag6TuxF=yT&!Le+zIIpXNN|4wM4?M!SHGuNKs7YyZ-NCw)8 zyKeJ*aXr@GcqN0JeDd5NWY!WcgKWlAK~|26eK@vD86wE+u__&_W7h`;L^l);q_=xnLplV4|5*BO-QqRIVA3s_pV1MJ)gfMn8*Gw_O$b^xLa*+vd zqe5QQ-r!j3@K>k6fL)hGJc&H-@aOmcuYdc${J3Ag`|-ym8ze_Rc4fmj(K}lnY)IjQ zB#I9~aDBYAGV_LkV&Qh6=LPgN@KvY#Q=?jnnKQYcjY#u3H#!l$IjqW)s}d<(MO+7_ z<<1fN^pl0i9VM-{;;o{I!>0-<(p@!m79 z2&l|`vB=&0@w`EodIOmExH~>HapI2SH0r65F-q5^H11+03(#-l{8}Pj<-sO9%tI9u z=oh{k)PrJtp@RF)GWEzrT`nsvuk7$;zH_xEan`h(Ip)o#(o@g|010CSbUr50W5}vN$)_SeC6@kn4k~RWNY*!{Kpwx7Dbqe1{AD$=p;gey%4j7kj^tWWsL6l@uo|^X&x& z-N!{U2FpE(;+U}R#v9o=^&59TUCAf##dO%rB3nQ^`9-ybS~0-$oGj*R9g4X<5Jgf- zB1Gd5A?dxP?}kkDHkdR_FB8o+MEro1l}gSTiX-6{!R;g#V_(*#^c<_#J2qBWU4cAp zlg%QXA--X<*Nt_i#3g7kOvnjAIE)bny{gj6_|yr^ff^d~^VjDzqL#=!{V$IUv9$NCikjo9&3W?yvxT&vFBcTa_9L1vn| z$04r~2lTKSl9{g+mKC^YbSv5}URNXO2v~_>07CHIiM}frsa1oA;4Jtk4zJ7U`nFaG z5Waf@yKK5|-h}sd(r2(4+Oe^yDU5A-toLRvK(}2Fz5_agoL70fc4OWoLf^JPu$MF_ z0T(9rtP*r-2I=3IU&&lDdqgc*EqKatr!9d)>kmXZ76Bp}kH3OXZ3s;v06=4vuEXfU z$X1L{yO=O~p_kMq!A!raBid;=dwCo~+c4-2%t1&nPKM{E5?}2mHwkB_R9=DMSD`kD za^w5ue$DqiXe~s-9z2Z;nfL>32ER!{b#;Y`#;U2lYV&0-vpL^Wf2TKt(D^QP)Iahh z8H+s$$BwlUJ?N8=Nb~>5pk{*D>OJLa7dzT7x{`WwBYhy5$^+G9dq$J09~@=FUTK0n z4t0ajjiYK4tNEmZj6c>e0&v>esA1TB|sbmN0Pu4$hriu4k=1w<<7)mlj6F z>9?jB4Z~(Xus!}j*CdRwnVa4cc|8~!ZJ+2;&cra;95$BcD09VMYRssBUga*# zwQr8~;OJBe=_*N-8wlRn^nw|FYF;ygO^R~FQW@p(Z! zxt;a`^EN!oUgX*z8YU#WFm?dI+l4)6KKO>GnY*2&;=M$cHpndY5{1ll<#ez?FMN3S zcJPD#$Um0rrm7c`D?}O+U>7$nEf92G-GMwy=?EVL&`|vV@1e zn!xD&JaW~|A0Hz4#vFg+)ZLr$o~|UVsI5r2(jTPKlP^rb&-%@|DSz23#3CAV(`b_++Z1oAAtU)3~NJkGG+$12QW8ITpTJ&SwA&<`%dU1(x z9qHP{eg}p-6PVp>=&V7Xn9Fp^O{XY8Om*YZQ?!-B9>!=qf+ABMVM3CHbrtS^@E)I3 zsr$mFFLLnX>aYg1bE8#h?#6&XXei&b+_0H#Y91Qvw zBwXMgf)FXIEq$%;0X@P*!*uZh$;r&BEkORG$1)1PtVNK=Xths;fmeSMB#B$G*i-dH zp!2JavwW(Gm)UPVQ_alBG7Ifm^2*XO?5rnaO-i|A!9~3&p5vmq-d{fdtcEj;18olp z`&(c2v9!ZMGTaTt$>EL{Y~ZJoU%lNe&h$?>M*>_uNWlk+J$K){@sTzToq0XLV~3#u z(lD$CEo`-KH;ns6bU6>|GET&C8vi72I6aKA_?7wB=ehiVl_?>#98R_HLU@+!>A3U*t0V(enDJXz1i(Ur z$}xSdI-HjG^%ZgmxBcgfsQO31q>>EtG|=&{RhR*lk)@p~*CvKx{&)bU7`8nRtNrFx zHymfv?DbHMa5<3&1q<7(kXJWR3ytsJ`64W;A;Yv7g_0(>lmzy-#-oQg581u*!4XP+ z9!v%woXQj*ZM81qp8nB?U1N5tafxl%@B+=)s}+dwkyHXzBoL50=#5CUsN$0kR!sFT z7gsA(eK5+NN+js-?nIU~I#Q}e7Is3on=an_t1II|bqOb@mC^;Bhf7Psv-J8{uZO<* zk9;Y(VXyUas>xSIwifP^*~=5`{G&9BK)KG~oiN*>{(}x5&|ahmnAfot|At3bnHG=u zVThNhL}O9n8ksALWiY4+R3V@mBQnCmtG zS7kJDfv(o2W_V9M!h$RezAFoz6J%Jm)=~p1lf%e%Oo}dGw)j;AD+6^^`U322iZ*Sj zLhWm*?VU6oYei~_L0oiQ*1vl+mV}39;C%9u|Iz`3mZK?%;;6mD1HxT7%fEaf1iS!@ zVvP&!z||4)iwl3shFR|{5blBTd`r4^yaJ!|y^>QF?7tyxzO62eF#P+CnuJIW$mLQ* z_M>3RpoHVci3LZQwT^_(8IO3d0|uk(@TYO`I^ z4I-KT&s%cftsRr)gqY*r#;qq4_%uy>4GdfaH*Yz${{!ht+hAQx6vTv_F7B5mtVm(9 zusO)hBsMk>Vrrm!{qOG`0->)lzUG0gUUnT*r`FtnpCYhH37Ix$NJ3BZ1|m=BoScwl z>s)j?JG#EsI(#WYk48!Atcdhy7jPqk*f_2g!XB}op;HK4bU_A}WSANAF}ehnP4QDy z(V2(qg{{wSFAFxta)@6!ZQrj-i$TvCsxH_FZ8hw-$7g$j>e~Lb=>&GqWgk| z0a7Her`}HfOZ+tGv?X8h6W?@#2}oP0LAn62a3!XvZeFu1rguYN4Q|H&UOmA#Qxwnw+y73|zO!0*W3Pv@FaepyE6S+LED5Xa=Dz_&UmiZ+_-dFyaw-0>?(VRx zEzB^_8A(W&KxKs6d3$;uc$<7p1lew1aSw!fL+3%oRX6TMq))1!24Z&%2V(!cH!6-e zmlb)*IA@YD_0noS^9Dk1_Ss#&EqY`h;I%CZYh+zm;j zFkEbYVQRiBJxk)qURa{u=;jo zC!(FHkD&!0$7;3KXE(|a_v~=wH>3SW>KWd^kGf<^x#iXO^GlMwCKr}8TyA{khJkn% z{a}&s*?i;?V*$|lbI{r$t{4~c_>F&cECL=F0dGtFVam@~mzmOPgY>N(-X_onj+&Uc z`m#X~LNeh-Vi=MIIom?z1jd({=+Ci9-HWxtnHVTX7*%F)&w&H!5M#7O6{7~@#(!e1@QE!t{4$%IKp%@{!I)5UOE_cznh91g#m=m zCO}x#w4eDcw8Aa&28xDlcY}S6jAv-M-@)N1ajtuss%vgsy=BOw!_KzCK+^_S3KvAz z#RL}}PIgJgf9C2o)9KlbBo(kKyMe)(MuBzTC9}G*cZ?pD-yEEDFJo1XG?I~}b~uAl zk$n$cDs*aMKFbbsK>OD@d-kbu{ z%$NYn7O|q(WM#HJ8etIDdC=^D-CE?527r|;A%AtG4v}PVdj81HT>(2DO#M$TESA+Q z^z#aIN!>M$pZJl9{eWHA$&@|z@XWpzW^~;`o}ue4-pt+hAE0!`K#r%p`83;8|1yeD$`j7yI`Y?Ue@@)*U>2% z9Yf+{MxZIj;8>9z1ks`n;o3||7Anp?gC< z4xSym17xS=^N)Q#g^o3^=oGk$&G^&w)RopKL+@$w6is9=OWgj?Zx_yDGV_`aJOL;;rmw zq?~G~hiLJo?{XF#I{Z))11p0ieBu})K)aVA+2=Qw3>upLqbvhvBZ?{}9Fht@r_`T^ zQK)&zf=jL;nhQazs*R7l2ORlNAm-cAarHAte^MpD27`60_LZ-p`QxLyXPN>mG7um{2* ziKlBq>at)((9!tnK2mn_e5kk(l$WF;_1;gN-YH(Fd`GyM=S;w+%@N=ycLMejuKHi{ zamOZUH_=%b?RikKVfO4_3v30g*sUScm8+d+qP>S1-Z@_B_TbkI<_Eu~v&d9r2E%Fr z@JwwyLlg(9h~>gOE6~UC2=Oe0S*3$)1$Z$DYEda2tg)v%W1t3N@v&n$hC+&j${1KK zt;P%HK}{Qka52RMY>+F5**yM7oq7A8->KUL4h7EQZjc^H?ORgUf5>QWhXnQOICTPA z=91UB>I-t((@SV|(*-KE=b1DcuU^%Rl-3BrR3?QxoD`F=;Q&Mpn$XnLDq>%ONC$>XH8S!!XC90@w+NgFp$Oqpf8Et`v8W?x7A?&?u}(l1sz-^#GX|m z23p$v#y@g^S|x`{ys|_Y)#ajoFF`n$M{XalDnm`w)HbD7iWp>*bn+Xuf)gk3lZ*lt93uN(nD_Uy_oOuj5B1e zyfpiuwTiWUQ_C;z!67tO@4W=A{RRGQ8)S zSIWv|Qu^3(naOZ#N%>+`&dy|srBrO8@5(xFAuv>ag_oj|2LdXFcir8|z<$6ku4LH_ zPnR_WIPp!Kz2|EFpe}hMuC^7HE!P#v;Zl~w3qI6QQM^=KxE*8>fQ4-&B>k6mO$7%w zrGSWHZUT?+EDDR(DP_l1@tM`flli#K%Q5YZK$Y-(o&8A)oG;CvagEP$wBT~zZX*C@ zxX)o-evs~4+jp;nz3(l4u`$CvGsxz5H`eB^6`tLW_i+XTq_>^O_mSWjWf;7{k@xum z{1nKMLCQA8V5*$n8ONiaRH}At9@8T1`reWHqr-xifvSXKWR+5J4O<+4hWixxsW22f zcPYVZhWFjY#!vC7Pj?6mGR?E8yOLgB%PV5HH@>*BeF>-F%-wTC8Z8X|*rak{H)itK ztWeQQFllX$5?*Bdb?#wXV-YyZy=y$W^Mral^PPc#dzHNh2Vd=4m6aIVPiivMT3qq6 zs$eHBVM!$xSGxd~2aICS=y5atwRB*V4N8sf2*fU8KP<~#2|5PY3%pIPv=&#aR24{h zn_#KMP?xx9sjOHAgcSH}MEs!!r7`giOo}Y*Hck32021&xIKmUuvT((j|7UWVZ;$Wp zqLL0ajZk^D&1px+DS3C$x+Y0wg z7edXIXN-4!TN0R=-8ve{|ARGEid!FjIEFXg(&$%Auq#n?nL~}FvFJ9_PaOb~L9VO{2Wl4Zzvhg~`jwR*~agWSV zjn@*EF8E7pyE)3oauKcLaWi63vDbA_v$ichIjzN+lQzrFz6L9xNTJtn##T&X4AoQf z_+dU$Dz&)QRaSURJK}w)Tzb3(3wMHN+*e%9?f|{HIJwuM-uD&~UPPR`g3C3esv=S| z|0=9rP^O^$oFBKnx*t&Pr%2{b18LCxKtQ%=oe(_9r|b=RzglVb1YqZE z=iY>p?=8+9UZ^KIC!w6W3~7U!XD~AEs|NLU|C+2DOw*#5=dr5O4z-Lk4vK2Q}4T@41CPDP&O%{CPi?*`;I6D=!}t|Fk9%A70~Da8pIW zQ@I4&evV2S@U7^RUAM;-yI?o>gRlMIy^4ka$7HO7_u?BUTI4qNd`nI@+7wo>lv?r? z?M1ugU%QKnDxX)1{;1co#F9@PxgZ;ZHH1aYj;%@ztvHdK{{NL5me0o}DRO=?cm3{? z<95j^T^pJFxwTI)w(N6bZ{3q*GT{2==tYAZY??FFHQ5q7zCF8-%rcT%CqE(Cb*_|I z)o^2o&Z$+UYO20c8_24qe7Hi)0mCp@qqE4~_$ofLCfDz!SSKz~-dwWEO;xagl)Cia z=FXaVels_gqGPHhdT@J29}p?@R_un}A-@L&k}AkC?dLx%&0c*BrZ=Ef3lYc~Go{Pb zV)vQH8B{gYD^zS?0*=DJmyZiQ`F|_leh+9Z1~`<7Shh(iRRKbhfd{EPlCD5&I~=y> zB-dxM(J0$kCRD&>u1^%4fHd} ztto8^qMS#{g$HENtgMpW*3`IbK8I^O2bZd8a0|$7Q$1H9!vF@VX))4JJM$!}O#Y9? zs4umxRY3(GL5Fh$tX1|rql2=E#d|ZiTjb0Obem?Vk4kMkf0x2(!%XQNnWQ3~HNnD* zA(9})1~`vUu7cs+bH>c# z1mTwf;wp;sM}cu!154TGI zpI5A^CM9yBLt34%jr1p6?VRK3m~tXB4;*jFM_|o;wJW`{>jIh345w0jmCYmcWWQ{a zq#dY6vJkW5Wdh35PkuBOmy=T1hbK9-$zTR5Q%eM*dMa%I-XWMG0||7vs|&r7X>Vzd zDK*W7s{M}1N6MJNZlT`HsB0AObx(0gi_=nfsS%@v0xoK z8onEgG427*{ggQ+9xh|;A$NN_HYpcTNe7xnsL3(qcvn8WmB`q^RKZl%U_eQ2H0DpQ z?8R=L&eb+MeTK*?rIv767sO-kFP!_OEWHo9b1!{82IuE@|Fkz;Z&CN%nvdJy!@0(f zEoD$`2ht)ox!hgT_<2wab8tRd?!c8Uy0GQ)!jksGoZn(ZA%v`B?A+sCfP#Nd%fh8g zcE)#vZ>TIQ!ri#pi|f9(VQzas%$|^h_%W`|gOOpO>*TA6Y5vA7;cJ4$-AkP0!HkMw zsk`}=Co}dc%XWCW>|B5&-^3PCBeK4)K=nxxLv4j+FYAiyQywLOU*!S6q#DC$TYHLd zOY}4^ReA3;IePW?iR%Zj#*esK8l6_W-${2%i;`c$s2(qgY;W0nciy`AhVi=svv_|# z&Xm4;_X}wd5!D;;Mv<*!>A~TQvcVmrIe`X?`#!8@It+bYc{ac<8R_h^sQekMP*C{C zs@==vN^42^N>$O$REee3!{TyRS>ekvu}t*{OV2S-U2@VGV;SY$xt{f+3QdyY52XLQ z6r$qM|69r*&cM3PE8C0GA#Yqt3;c5zZV==f7vJ>}G{T7H*gUA02gIUM13$)` zb3Bw@S}0h7oH;xh1n79KNewacSbDCOkmBX4*7PxvMo9{Zh2CShD)p|rs&A;cT%3~6 zQ^$uCSda8Pop9Q98cMJCkV{K$K9-$pAcV4k>N*i#1!X5!W`#(OC0oUqFURz>zzyMh zb?_Pm7MSJ}7zVPdMcs1EtgBcj@F` zJklDAvzhnhVH-h*l(nKg(Pysd2UYt;;KU+%k~=vWPb<{Vee^CO{p!;XJ&LIJXwuQH zHNKCEnqX8hJ73Q}KWy&%-ox=C#d{^crDT$Kl<|!OHxoN$xbm|sc80-bU3feF`0#s4 zgS8-A!3Jgb3kz#5)iap4nwNwDPv{aKIhfBU98f%dW}) z_>DJLFwk1_>LBtQvt#7`wX2vZT~Jdnt69-uAvizLa`x{V$R^66_rO*kg;Jv%*wbq3 zK7*MbJ(so?nDPXbQ}ZK5RJuL2K;94@p2FZI+O)zM2!EjePe6UaQ`>#4h4WdqJn_vq z#Uc_H8qa6)VjL=9$4S=EU?0MnFhv{Ea;_j%+&2KYLGcD9Y78nlWNWkny&Zm|OzJ7h zky%}yv@VqzAg_qQ*yD{+2qqW0=Bo?3QCnm7R9|$OO!y96T#|ggRdhdf{{0{rI2$bm0TGPn9dEq&x6Y0tn~<8% zrr^}>1(n+SJlDdXT~p4Vq!%c#&F0}ryjL|@=_JD4#;1hH*6k;rVO{{EkY~DJ8dOr4 zAT?SUuCk~%w*1s;tgO;h%3IUm2!r0!wuRS<@9~M}dMss~6JqjcV$DrZ0Bs&3!rjx$ z!PijI1JPza)i&xpM#i*QuQikk!WkjAJHmv*nK04qvIVPHfsu$W`%<0CpQzpk606nl zfkOHsS2;q1sch7ibU#j%Su7A6V4cndf04p-O5T_`z_VQ<8YSg{4ScXe$xYMo8?S1E z+~I8-PSM~EUel%Kj_Cp=73OOxv$@)1o1x{X7apON1(Pmn`M?geu3D52 z5(r}+qfNTg}^wv-o<Nh|P(JQfUHT7p9Vtp(m2xGEy&l$^0AoO13bv`+83ODDhoNNdcea#{|v zYM&fVe%?9cSLAChuV>*;&ls?2U~vMnk`V$tEX+g=mu?(NfZk_vOj8Z?0`4r9!zC=q zLpf~sb0ri6oq0?YG{R|7AmsdYa-kBilLx}Aba#RE89>^R1dUggPOh(6eMfBfcF|fE zNwh_mHUx@8Q2=}ra&^C!X=H32w&4I(mIh`kgx|b0>WyGF3IM&Kbh`~~HWGmPbz-lY zhM<>+FnU)t?8auJCWnA>n&Qb{U2j)=V5ay}#N^}sZ|2`P->&u0S&M#ShCgaeKbO!`PhCNe zf(TpPEZF*eaGU-m7IS(-91JzCV{0T??z1Bj!?=;Tueba*VB*?V`-jrLb1O|=|nWgEyeoD?#(Ne>iu-FP{l#aJd^A# zC=S$K+^+&XUJ|Z{^}b9vuwm>7^oAgr(m3Z3%Rn?U)iveJFV9Xr6hjUtEFV#^+ZH8Q z)J0vxV-^5~2gIt}DkJ5#e+AvwVWi#VJ!fJ&+b(HH@^k=2K)Sy(wiL#S!Y)}voaR=^ z=hX+=#soE-A_w^iP6WmJ`;e56J6zy`Jp=?;0-2kLV7FB2V652}Q0&>I)u%G`OPsVT zPzhsD$S6_scQi>y5hJDYrVW6(0sbtZ4STVD?r{_ZWgRqif<-Bz( z@v|>pr>_nD>}CPvC(E7}?-~wSP4F%=UGJiO-~1nx3!-fuXiActzByg}>7{LU!_ps# zrg!{~H&}FsmM;ddL;zQ0SABDaDj?gn9|H;5#T}-lg1KiN_E#UGp$E`STbK8*Gx1vE zj_&6=bGnV=Y~9Hym5;M*s2@mkjj~F8Q&NQKcB`6|m8JDQGq6OJ@Z zFzP^{BoEiN>Y7;C1=|JVqMG|})}&&p8ThK16xH4zSnQOZFesa0yMXb(ZpsWc#fl6K;lWT`S53JKZX?! zePWANVMc6no7MBt&Z=julDmctKITuIszWTQxzu68{9t6@9 zutA&UU%&J`FtHa=!BJkD+Z1|Ex&DcCW+9!gTV210I@tH=s{NZhwJq!pEkLZWf0zAP z)3kq`tIB1Qt}=)n-6Y$jI%tNJ3bkfcpm-ZoV(5ouFCph-03GH^}-L#?lCPM zuEC@KIu`Wmqt0W-Sd0-=*t3|qq!%BbjTvnXAz)7)cxq{fE-nvydSPD48P>WPU;WkP zCl^4%^W)tItQ~E(F1>8Bcsq$*D3}~5({xcd+Pmv=Y`@&?p7$Gg=cxTq&a!*gtjW=| zW%1XMW?!Q1Y#%wUAJFv06^+)@SE|uE<7F%K+TZ4m#p4-<){AE-Ovh?J)c0_^ZGPhBQo`=ICY-92O1&uHuDG*-KXL&?e-|9U`|_F0z{ zuKsbA`CE6O{^Re;{*1z_4spUoFY!eShcjag;=e1CdtjTg%LagNt* zLsP-hN}BVHmbubJQO;k;26~mt%Fb(j>0)`#zlearbN^Fc){=H~G=mjXrXv^3U|Itk z8y4I7?*r5QhheQeO((z~!l0e2-ej_v6^VV1z4@MMF*Z@$AITX+8R^nEE$G*(5ezm_ zp(BAk*>O?H&pK-5Q~OvFPvBHrY;<3W_)f?qCkFenLPz7IGQ700viH`jVBo6tPR_o+ z>#-h;x# zcfbkpCMc9K)&*N8SDuDQ`!bn3S&P6CE_No z-?yfR!>hW~8bq(R2{p&G-T-CQu9+;uR7jhQBIb%O zlJL4fXe#MudfOTz!o_jk>h>|Ci6xcd_+Qr_So?96B6kSG?O$>W#`ih8Tr;5LTmQM0 zQC~fs4kM9Kb4=R}qzHJ>JjFK-Au(z-T`HV=6Z^;`+4EK<$#z{*@`kC>BWUYfE4@)d zF!;xo*hbudQ>N5KV{N@LPy`*nlu=*%NMJzRaHyRcM;2V~`ko(i7is7+uc{4SRd$2x zsQfo}?!1oQrXLLl94`B>4Zco?k*J0J6-_tbltn*_;eRX&-TD_YDkW(SgXUnJ zhW@@v{#EJJKW%8IFKnfG9v;SPvcW*A22-pK_p(9Jkedo%96YNs(_ZZ3dP@gdsCh3Q-Sg{dGxhY~ z|1&A&MRA{#;9rlM-JTx)|1PC~Kr)WCe(3JndOEIClheOFuB3Iw-92A|1sE(a z5aG2{QjTfZCM+otHHAM$!yT`=jClp3YztaPwt77=+u28EEwb)xCRFXU*9(r&L%XNj zG5s{p)BDf|WL9De%EGr5o^;iqV<{>so~Nb@qy}sFr$a}1l{YP;QWQmt+D8>LqbTY8 ztbS?JQ)DC3@a5yv;7s0aO$VC$1D15Q{m1so5w&JkN5|u~eJ$9JPG=6miU?#}d3q_q zq98sZ&?1a+*3E*WhNUzL-wkk0MbR zggA$i%esj8RkQcU!ipEDESi%Zr zWsZMz)<|yR8-(ZUFd(#V>C4R@Yl{5=SCNLq0v`j0;k|sUaOmaM+eN~M#fATKr0ocL z?C5-Hok6RxJ?3Ecb$HpGzoQ9>Ji3o{fWIsmcDxLI;%+gWz1!`F_I>ZZr`wH!&SwJc zhf9tQ0}sWPN8^>hiVip4I`*%+(AP!r7`Ol7lUW&Uj_2vW1xSH#u}qwsJuFW6S{kcW zcn&jd`TgSgac?66+%OP?f`BF(j8*w3gkeJ--bArsIHh8S2bO(`I}&oFnjP6CxPy5G z7!VlD)WgUY-vOPoYwGgZT1av?L^ZBzV}?>U*m$ci+fwanY#!g|*uQzbiK`cY20d~c zEYq>;K}FMT*iV(dy02KBt=gYg3(~%?x8e+}8TdJ0W_47k-g%ko%Icxo=d^m?Mao$n z(WrkfudL(bw-q#J8A1inpUXb>dmtRk1AarM=v(v^o|sn{WFSP|e+|3y3g+{$l7NA1 zrwpXX`@g{aypgrqb#(CidJ(D`xbz2E?i!2IIGvC5Bdfwy8rflC< z!AP$uU*iHRnP?8syKn79x6}egudj3vm zFkWE%yyYyk@fe)fvX9r>vwhiaN9+geU#qDex9>kt87&kZKq94aV3c|UKgejmQ4?b) zHe=Q%aGMD#3wVE%mmkt)n=A4iv0yr^n)C!TrA{ zmp^`;dHSvLY^>RkWc{@&anccUEemv+z_xwT!pf1fCdpn;*>l=U91#ORzfuxWCSv+e!9;95p!xeFrKq;9vi8vID>RJlUspfR5`laZ1L>X|>^O#Wy@9k` z|82JNygE{yudXQPHY+$d1OIusC>GIe4`!DutKXhX%*j4GG%c6)UW=d8rowc-F3s?ej{X! z=@3vbFkm@Ih(WQM-J$_zzKNQ(-7)^H!K{E*A{RD0(#wB)0WwV`gW*@`cHvqzL7rw9 zfdED~vk!H_9=&V;jwzPv#ovN@Coxchtq#G|*=Xs8;%lngV}w7jqQDu=P+Lsv@##_+ z9j-W6m3spSAmE0>zF?>iS^l{>Y}2+*1aD}tgn>>$=x{(IQ!{^2#yu1Sv%3Y*5(=2S zMm7|1T^wT(D99DWyl-Xhsrme-zmTk8+NCL!Ng!h&P5g{1y<_;L`}_;h!zoy9#JV&d zT#FE-$#ZWgIaR%VMK1_Zv*2kORa;l4{nHa4`?;sB8)e}?n5}OVQiCfBeaN5=JR8XS z0iP;Usq$K`Z!#Lipk68i8PZ}PQHDeuO*Vh1bzZX!?0etwmmu%4#j_mLhF=&?+|{}I zzs?m%Yuk`EPxI>+>+9E=3S^y*by+kZcuzVcY;C+EfKg~g6)DM|F=)MOCcHBs`v{yHHzRr3<`U|l^w#ms#qN(vXP(msN3jws9!q}*A7KI)ymg-d$lx4 zI2)}tR2P!Edq+D?>!NhT*uXq)6+NRq+4KV9)Ro0v1!#q746-}@&BX{^BihfAx69l*lbwB` z(R8CrAF8mOdY8p|@cp!cAwNp@Err4zzM}W(Vlf8tPm2m1VU$zK(e5CHH9h>otuq|} z{SQ@g`nEkwpj1q2bfQYMw@$it3kYXHiJ8;d>Rd{g8^+8r6vyp&uWJF$-C0$R)@?jC z4Zpb1-(r+`)IPY$EC4O14dASX=!MrgT526tPP)Yq$h~9?RsBOOT3k z!zokq&7Ofq0I@c}!fuxok>4dS_IHV;u`Kf7r1`{?3zE>JvP0rZX)+7-{0DSkLs$Q{ z^$DtB!sj>_qOw@*M4=B*N^S#%{t%;Mt_jG~ogsXB;t*{rXKbz-kun&fw>mShfe7tB z?g8$2bK!l2XN(Mf*~xSS8xaC&$7sXf6uZPBFOF_Y9AepVeEhqdZ|p;$E@kGN(`uZ- zamg}u5W8e{2ligF9GW&<0%~BPgo2>P`M`uu7{yX{WpQD?fs8l5Cf}U_M|Q`aC*Y9- za1{mt7T&J!XFQA&g4{qk)Vk0GuCjdV4#7+!pHOxn^~%AK@5i*+V{I?|G=7oXbf6`| z@^F~GEWjZ5?DvR2_4RSI7>yYQ{(PUey%b~^yGgI30LZ^&InMTA>yWa7!pCmujc^8U zXzbw|VaT%Vljen7RhNEN=S?~0!cP;OS{CMg59D8xSK|FIK(HZ%MeDYpPp+S`XKnju z;{h(nb+@0Yw0(@@a|J3E-A%Qz_Mz8J)ukUD98%dOJ~WiD=$mMn8ENaq zE{ReUPbnQz*;%V7BneDXj9DSXFek`jTvNVaz%i-fY82(N0(u?+p~OX*xMWSzspu@p z9Vpv_*2+oNteOM8BnN|aesV23qpfe`>vasoMnNdnKpt!DR>9T=X1r(i+#A}9wiz~V zk7~{OFd2e#(J|w6CWGmIXE` zQ9Y%7X}C*kV-v~(>p`G=CI^8xf2XTO3(4U{ytf6XOEZ0g_i%~W(85QAZD1} zm(|($E(_U8#QPt-IYI_UjT2n8)j}}YE4QsTLOM9wH7JffAq|qP6@UlE=ZaRa6}T0G zTDKUmYK%2T98nigHFVp6QbyLr)d|`w?h)zniyLQ-u;v(LqoMS5)@-pH-rK*$~^pXm;IPF=+H1C{Lwy2d3RnVVWsz+Do-?jc5>FB?c5< zJf}s4R@Sa3V>!Y*afEN2k$QR~)%$xo7@U)865cg^7a#_}Kb-sB?r$n~nToaLC#CY0 ztnc%ef7b{@%QA|`x>F6Q4VQTszf532q{fHuU?&CMJAT1_Altsa*w&yf{ld0@8uo&R zw{KLOe7EsU^-k9#UAolZVobrty>vOCYzd+%ShC|3m?l4m^i~Eyy}O1hzNkMQtJ=5H zVjH32_=AsMf}b8OIbgS}JC&~YwzatqdG-s8=X0(u<@CSTrp=U5Qv`@G82LCjBjTLf z>PzgWZsqS7-Uv&C-Q5B1jr$|SpXrB&&pl1Dlf=c6lAl8d@{9=p;v9%O#qicDow}wJ5KwXxS zJ9paRhO~lCIL*LOd<)$x9KHIZoxM%lL8tD0{D;Zu3DlhYCI+?o&q)3Zv@S?$eB05G zTu+V1x?30&+T^-Q$)r%z4bHczTtEkmMjiS}6|Lh(%wDVGFYGP7ufk^3M9tk!%%DB+ z!HSIN2K2fR1!>x;^0fQ7f_YnJW9bR^F|K;`$iZRY!UI7#frVK2*g}3)a#h%s;P>>d zmli2TF1}X!?)SUBnyy~_*^vEZ(>%k@y6&FlkBoB5%s;k-3*5mi#8HJ!)h6!uxx?Qc z!Htf*5U!@4T~w)|mxtcH9G~QW{Y+UFqg}BJy(Dz%lN8VvCY=!GhJvC25L^nKU;@9P zKMUI%WbsQd^XTL8q9{0`$*zK!F5|R+{sF@szAinn>bIqsefiZ!DF%_x=saux+Ja+w z@!3yx!N6k4vTy!H7?nzmyLio)pS8-YxTy?6$0O>l5tM23dk0hbEy^Ss(Z96PnUgq} z$U6rkLHPj{Rj$CFgmB_%T`w$>j5hgN>wDj8PAd7fX@NmX(ACrOA+W+Sd-6&Hr}Gtu za3doxA0s&XY^8u}WQU^bSpV)PJP;d*7@6iZ?@QPMzq7fC@-!ip+o9xhDsa%FgsU&R zMNE%zp|!PKs?I^ozl-;ZOpel>RZ`0oLdn2}LKFZk^-xJOePye$#Z(4ugE7h5X7mT+ zReSfj+>RHZXV|dbJGXbP-E+ungkBXm(I1tNaJN`AuEJte1&s}`6XNa`=8OPptch%V zT-E%>FuzL!N`UbL1+=3-5t?^z!@D^u)bz0qznFfKc?gzIV2exGF6k~_30)9cayGN- zXo9n*YPXkK@0prAXM3LpGWcB&zm!(g+>7%Xrc;ro+fVXn6E5vJY5m?%q;6>rN{W4- z@o-!$o!qsitvmdGLviIt%|A;cafQHH29Q3zuDE)dfPfBUhi)^0kO6^?Y5#<5qc=59 zj5GoqIZrH(1R)WblVekGmH$>A?DoT+7k$~GCX0~)&O!)>G+pW_@MyN?m#CL~zIFn2jIq^j$) zf^TPcM%rZ&vTq{!)FQRG(9z4Ik)8>4Hu1hBXp_}usrV7z6q9Hl6=YaKL6QN}P{#&@ z-62tS++H|pz8b?LjMrs`-0^Sj0J^I+FBet3GM`8Y=+HW+iDGMB6TCNn7vJQV{xC<* zSpl4BWQr!B{ncjH0tp>jCG+H%}R$0_&UB~7v+r}gPf2`fI zDN2De^mREJ-Quu~{J6VK>9e?IuDZ0u-nAT7qAY^2TUeFUIXC3=hf}w4*)_`d8GLb= zQ`gSiHaMei`0#hh2o`}=7QsubTFUKX_pxWO3kK{0@BvvOUpG5`{Obky#9@GDK-~TpwOHfJ^*cIB#-7-<7Qe7{8YrQ&?&ArKDKSR4wna9W(d_r_j z9CwsXqqD4DAI=2^1PA6290;tt8>LMb0xXDrEp3|i^Q!8tZ~T9$ByOPrvWNA;PB=iH>E9AhO>kqR#19DI=pd|+%w)u!!%gT0wr6PxJ{lrUuF0kN3zaSy^wdE0+`Rc z;xa`9EVOka405nGf`HcuiiA;%c9i~PjUM&GKZ@Iy#p6-{w^X9EEpC5U#AxXs76_01 zVa-N~+oHrDo)QY1#LV-DMrq>dSAJ{xZ^TO^kRGlBsvWN52h`oDIKiqIyOJ`rA~0ro zuUc_jL6)=V6GK~Soiq%CUFk903X%o7n-E~9#$ZUa;>y+HEFTIMO(TSLo^$mp1g@qh zSma*u>PVo0A6f(qcLifuq!hC^!Mr3OJO^0yh?-vAfjaNn?qQ?C65(%<%Q4TXXd$p+ zkco=tU?c#zI*1k;PHFO*@~YUbG~_k8**LJCHcT~60FNz9OpKDV;E7!{2RxM{myd_V zzPlC^TPApTX4FE6qR?abMk%laSm>+pYW0rVoA%`nFJFniZ1wZ^TX(!$-J+wbX$L|xcPA^CK1(M08zJy0UA?>c?jSWdxRy-w z{TP2NC~Y4P1}-Dr$47^}f`co(eQ6(441yB(vk`1Sk2fBnKWvWMx)&xh5s$z7x4Bnk zd&Pg4*aA)!GS7Vv>Jpd&!CV#N0tX9RSK$h%ibFiMg&N`~KD0KYf1nL6?S}({`eyhBss7;WlfT}QZKc3@ zCa|0_ui!22FI-CG&2HxWvDtq#H9nx9Dr!_ZPIk(=8-f|J_iFU={t$9*&;HzB*!-m@ zMggZ)J8wSp#C;U7wRVqQ5=YQ{`M9xZmjp;FgSN)Tlpc0f5*d+E3jF~=! zAvSBKXLtPRXkx3GeCIjMXiIz*8p=88+KIxF)?tf)PkDe8?~9-Hkh zS1-3?%F0xr3myI;g!>NKa@^-YEEhbiO#?5n*L9ANx-~tD5@ib^UeoRQxGghR@APZl3hIIoxB-pd(m|m$h7!*uBvJFS zEzFap6>jN4hcDPijHVW}R9r;XBdsP&{|z9&3o0WG?ThbHN?$%wM*XskoPM^(i#%3D zg*U+!DGdqSf(B7U2-Gw!P|^elSpY#)%;Ttc!Flnw*cJiN{-}QlwmQwj25@tFidx}6 zBBs%Pe3R6X!0@`pySw|!=9Z$mV5BS_gHa{~Spk2Z02k4}r(G)8>oUw$&hN$PpVM_l zq96Y0Z$h?j(WLyG+LQl2q_i5|wg1xdSDTCX;RMW{hAVR~7EqEc?HDDBVtJ9}KEf;8 z)L^GDi~!0a7_-EsQLae%e*|4*gfw68-%QDJP#U(;gY)7s_XdTiEKv(9%3F3gd#eljZMV!jqCy zN%OuDz1|E;wU>W!?21Op7FwL+MYc)OFAV&3*wy#dzSH?_W$;?5!Jl@*pF2 zN1Kba^@<&j9nrs9Pqu<888GYdY&RlQb4Z02wm(pTfZs6BHqSgZh$FPyGa2A38<(>? zQkhPZnbcf>SE`O4ru>lW_6AGUD%NGFo&i%aCecHxQF&k#s6H3I-hm&524$1aG0-#y z0_lLnir$rymTNusens`TBSiN(ORC@f|AI&PzyfaaY>@VI^y1Y$|2=oD*#BwwTwGUW z`~;1P2n)7;I9V3+G`72(J5Hstggbuz*aplrAo9SdM2*2@8_+V#nNgC#(0}q*%ht{e zt6_i>14aQG7*cX^u@6tAc+|B-PV|93^9k~on zE9sj?iSVuQH>fCKh``b_3PRHvQ)gg!f_0Z-ARa$HaUqOud8W&}yZh|}K^K9$EuVx*J1(#I%ZIa1nW1drFKm_UZXd9@0h)5%;r2PcsWEe*obSx8e^bH<4yyo0i~DYzf` zPd)G;0G%O4N;d@oLDM2zzN+S%BvDJ0P23=r$Z(r}NH7JULvBwNLF9+n+Z|^Z(M@a^ z$eqMbYKdt_l16U=`k*o*WhXFkwf8OX??q(RD3%HT#Oh^C4^)DTBvg)Cd8A0p=c9 zGS>hTvB_+2g5B2r;Ya=V%MNQ?PXP=9mI# zJ+kPOMyNzB;7K!RplFKXA>Bi?ny5(gO*2cXJ(p+l4rxGpPyDk`o#YjP3n5I&AYXH3 z!%69sCv^**ZV^+-e(AXMQ|zhH-jnaA6JxuOPggHtVY7|$S|&6^6d%?pOK4U{%MK5f z;~Qo5P>2Q*(5dt;wSV{IoJ)h{=Q4m2zn`HXR0(!?N}>k@CU!b0uEO{nN(+oian*_@ z9pidO&*siRO@dNgNt7HH2y8J64^mu|UjpD6ST-VfBk66wBL-p%pff~B>Fuve=IA8? zMtQ=2L+(q06tAh)ZJ%3>Yy#3$M+6h70{?`Yq0tqRzch=1d0DeG^V*U1zFFyT09`gCedV3GUKmYl~e*_Zn|6u^oUV~z644_MJ z8bL{)Oaf94?CCfEe&%|_XO|B;^uu4@#2C5m+JTFFI#Mw5UeAabO4sT$M&Iha#(vrH z1z0h_9Q|RA9%GX`o-WF3<^e$j$X}>923MSEp0Qg|+{yoF^>6-|Lpqls3Dp7N3EeS@JXvU@ivp2iE%!VdLX-JqKQ`ks zLy=#klTJ#Wkdkt5(g+f$hf3;9N6}#eHm=G0vl?y6p5FMd4S{r7Y`1;g7!C| z6s~Y4AO!2Jv)-Y#P!E+ltrsE?*$C+@ERW)9EO|`erww?~N}(b(zpo+^iO?bJs|b+d zI9IVj7SwuWn48r?)ay>`@UaF?~{8{t&8qK6pDEE~C$P`)@On4hSbKe%;9r5DNF9VMkxARV8w2v@Q*N4wz{3|XZr3bY{Re3X{1L4N z*r}cNNmL}TWm52=u&Xjk*m5XJQI1xCP{U`YOT`H+U@>SZSV=^y*Lw7YSvDf~Dw@g> z=~?7G3))hR0`^Ffgt1hY+QWrpRL*BZ2*6e|}Y7zMyr6TS@za^glq2!bhxPNU=oD4OSymQ4rl z+`2W2Xfh*$5=t`S34ccV*+?0~4xgOv5rNQGgUFbf zzKEVC)5NPCQ%C`|sG)t{A6%z&>BSWt!9HNtqtcVR9(UAq4&RX(F~1#~jK^nOd8Rd7 zW)yeRJ2O1cl9+jVbxKYEV86<4m2o37nZ3+` z-2pCA{+n_2&w*O0d83uFFhn+dq)|~IS#+tR_}HXw7q2u0mMpa9u@Hz|)atV^0?FE( zx8xonw&Na-jS}>+*x?p&2NFV46om?U*C$GWKZF?b4WrawIn;t9O;faZiB+ue!Sq^1 z=Z-L%P130Zt?}xN?Sa5+kQ%HPIsjnFfFu5ZvF)*b3?smg|8<;#5PO2y6}AzFV-|dy+#2Bs)9N{a^cdmfafC=F*ulnS-OWk^)1m3RtjU6jgO<3-L|&Z!>+)Jl}{ioQ{{(pk3Y z$lFCH$+hL|Ndu=OLrFNjn>xjoYHpab zQNRJH$Wv3v6!zz-sbuzf`PmR7!GRCGC8jjCg%;T53mnIfrMB;`Gdt=$9QPDaWM80* z)!bTQF&S&n?1eSV>A}Gq6%IJ(0eS@}KU+{t$|+|;u7}wRz|rX7waRQ749CiF<%7VR zU3}fbq$q-iisryu9kx>+F!WE@?tS0j1lf9VY^<3}@Wxn=w5Ijz;Z&1EJFMG5yP!Sa zX$rfb8qwFiskZKVj|24f>^YrlD??O_)H4f#l?zTSV$-4p3Rfp z6MPYVTJJgS4dW!uPr{Z6I!(je_;5(sP6QpU{H<{YE=o;1WvPl^*3`pPJh(mNbo|6Q zV^SYK1_m5| ze>@YAxIjFZ4Pf1CKk#^Z@YW-@U2Z}^TyQum5yAo+JT!_ifjLWtJ4HuCaZl{HJCKR&=QKE{#8UXI`UoMKM7Y7tCZQ0(oNNTsZN2b)BP<2uAh! zxH?x8e!j&S#(70IoeDH~LzSirKPvJ26lKcwMhW|9K1jMxJGm(nWfJZcpmli^D&dul zay{md281VlpPpOemX-~3-K;{V=KkVFP3+AnLsS@q3MPsZ680d20_q#C)G`p0P_hvm zuvf;{PwGt6`C=w5I|q>;=ICYhw-I*_x?-LfIpBG*Gg~pE9^t7FGhy;b@LYDp;)j)aiQ$gc^apWIC zWo0ugeF9NL2ZYbi$`_Kc0!E&Lb7;w=WJJ;+y_Con5hMAZzUT}(GtRMVwIg3Ps}l5V z`nQv)T|!;MADM6Jxmk`5)USQR3R;u>|2!b-GRiHa4YUOyo4*JEIm#Wprb!s9%=x{* z#KfQHx!CQYyu^P_uO%NPi_%$MbQ#lv7yDDI2PiVvW zEO1#~5^KB*${pkC{*-FKqiLSdt`$%bmQ~(`m&4`p6C?3S!5Ao~S8=1xaMKXubo1w@ zx3+aVdZtNvhg4^2EfiFqhi-6tU)}pRIuA{1= zR*KC$D0!4wZ=1=RQx!8|0nmn`j=+Kky#VA`LO|@T7nyz8g%3^#0Fc_X71{wX z`qk0)>w7K)m471qS{d}Eq6Q$0{YKM2e{QQX_n*9@Ojc_RM!Mf&#P#rjV&DZJy8@yk zmBJ51$TK81iFL+Bz=E&@CNbi8%KMsDH9#$BJfW-gTJy)m|uqQ>U!LqUwlFfaCW@uK?>{j0jj;7Vv1KhpT$JQt=aCn8o}bK)wb*R5nc9nQhN75;zUPM>;hr`3D4LY zsQwS=yj}$J^bQRLTq+JGF@3zU!6hIC0p;OtVbdS;%e63ts2zB_DrvbTJg6aJY>x2r7S0g?(X;0?D3Wuj%#Xgd6lv{t7s)W7q=rxxrs69wGH9oaRlRG zyU!kNig+MVRc!v74N_fRjk$oL%J2`$8;)=GFs~_xHUJjogf^o`nxKaRdY|@A;-NQ2 z0Bt6S7aLA%dg*eDfeyJitOYAPC#^wDq^jo&;NGpDL8T+Xg1C)DGW>+xu*rqd&w{1T z5~&fWp+U=@)vLjv`i-(-E@6~bN(bA<7PtxPekJSimt%>ewTOPFM;Bt_6D%GYX#4i0 z=xBC2;k?F^ep=CQh4(hTJI-^AUfR>20a}7I*v>*ROD{b$#$!$?l22#kb$*Invf!Dd zR|_SiBEMeBp+b8 zUj6L{VS9YtjNR)?1_n_O1}%~6|5iV;XYZu-^#ag0Nn^h zm_}n)X7n%)0cR7zF_Y*=XSHsX@-M2wu%UhWe-kpOUn$uFPL8lx0Na7qmI+3S-iv4y z(!nG;(P}z0aL+egR)E_y=l4-P?)z?IhGIHU-X{uh!?HpI9=0e0)8x%_qF_&?p;cD@ zC-=ODaJ&A=*N+3z`1#++ebKSQN;63d$O7f4E?Vq0wjb?|Z9@*T5HYpggqs(y!MrNJ zhehiwTRJ~Yk%LfMXy%$QUwlTRJnUV7;o54$l&0m*r6)S4_C!!%&tMoa5P)0+BT*W0 z-dV|7+d!Y1|ES})7TBqdy2;%DVZp;Kovh~5M|JZxj~`z@1Cgo5UIz^*L>TAzVbqry z@aasOV-X%9n?m|lRKH6e+!DcuAfrrNV9KCu7Ip4hJykul9XM6pu@V30+ura)&n~Gt zx%9o5R61APUh?Y%ffrJ=iMvoTZtS9Wn&u7w`jcI|EyKp&9$X)?0AVFqo)w(rfYOyV zpC;WUF?sAvatp=FvIpm&xU(-v15%x=rpfua!4epA%#MdKJ5pi8S`w96=S#O@PytVN@J>E-Uh~@v%Gjz7LP-@rTl4cY;SHR}dC^jdboR`FO5>>Ub~1y+0=1 zo5j0SD!cqzo&WDI2txDg6MIh8ebkV#`+xiuojH0>tEPUF-OIMGzkOved(1PgN-39I z=-JuFC|mhQ@;fSDEq>sdd=6d?S0zZUJ0`sP-y+h)cGLZ}3GE-8JXX^4i+A67V=oLK zZ9b4jmd&lji96N1?`Sv=@U#apPU0`BFnV{BX>PjhR5AdZ6`q?v!QYtee$l|i{g!9rs?1OSvM}B>Eck0jpTp1J$l9d5<0z5=usx+g z2dk|09d}(MFEMUf_CS(`aiCKy*LQMGs}^jJeoaPqj6}ikWAl1FhYj4-*cA8f&)7o) z4`zSYgsqwhHjGE#Ds3136?=9Z&cLP^%!J9$W3$8C4NAPu3TA6D5XeN|CQwq|*u%%| zdt%I&bCoa4pzecy2v8{zo0I8_voXZf3iMkbP=vwXTmNkces95@E%RW^j|f;^*3(pu zR1O`0OtX>$6X8wwOkd3qPzL=6xL&e8d17qN__q&duEbjoD3Lm~8yPX<;>;%abO9oU zN%B~qm!6oQynfKzFaihMg*nXlS zqpTLb=|^Ry=1?e7)pY`V#s;4O_FT|ArCfb@Lqp8!c>KXWeR>iln_XNQK?;~HotH-% z?4QoLIV$;BaE6z5?W>)%2@COpKmzTXonjtwyvJSl`wF*iILIDAuY7Z|>@zC26-MO@ z&GgTYY8-2u_=H-RM)#Fv9{{<4AGM4bAe4cM*@%xrg6*>b#DX_A7&XE&OTA%FShL}T z6~aIx;py^<$485=tl}1vVrVC~)rKdE+5%7QC)Hed#nWwK(VS-5mk>0~Ppw=6nMQEd z-76Pde^rl9aVj4;B5rmY=8MxRlz{aVv`$P+0? zVQ9bYOsL)ZCnHHO16>?q`f?UizCx72gOT^c1f?53S9;^2sn=Lywxih1*Wt?bzu=93 z1z*iFx{huOhaC!B@g=&mXKTR%ckTVvEi`HLoxi{>n7fd5+t)jOAvJaNInz|l{KsPU z=1$R%XD0@H(-t(WrUd;50yAUm_H`DuwF+a@5zU4tT6(2VbKRfQUHGxH#-Ni4EzxMP zyibA}v))pqQdV~J@EJMi77~`FfS4q=s*$1xMb+-vhim2CZZQcAJlTSghGf4%)}8hW z=a6qoFtdB_^lRP2!yvbNWy5=mA79YyOSgWLZjDym`43|DHoVOaM4%qyVGv3`jo47@ zZ?TTe_PxywK%n$4Ar^56vltUoazFaeH|AH68eWZ%F8na;jJl6{z5hawe^i4H2a_BCF&MZDAJo)(}mR3^}_-;bzVP2 zC)`o9m~j0)m(g$UIj!ouzY83i#6WWem1T+oS=dum7pMR?U_ga-*7i9GyV;qh_={!L zHCHQ&WIkJ5fL-la=F;f@p3vV{27xU0o=1De+olQIAaKHdn~~*%d*i$zL^Gbuluy@7 zD=#vvTc92as&2U-1T2}Kd48fBx`?;wIZH12_)J@K5D{zv!w>#_EOhJ2Z)N}fHg2@l zzS(_m#&;aVpV!p+Po(#m1>Y-n9dO!Sk>2C9y~ItY-g^Xic4hzR|Fov&pvN$s|Jwjn zLlXfxR#$sV>*ihj-WMz}yPvXRaRdbrg$i zoo;;c8z|M?p0mMHHc8tKUQ4U^NWuTk9`^HIaCTbL*Y?-uQ?B^f0qbwrCO_SIJlL^o z(I+Q8eiba(09Zh$zdY+gsROS`YK?0K;S4CRy5^BDkXZl=moX5Joig6*!tc;Wt}Vw6 zJ>HOO%6FqlcV>R!?p?KK`B==%BFm%n0l-uzFL*9I7U_8qWy z+iq{x*!2ceyH{SPw&1tDT9;H|}M*?e9g5cF#cCgU`>`2K9?6F5h?k=i=R2e0)#MRLohYAa1uq0mt%} zr>F6g3l~-E$zsmL!M-C=1vUMz4)ASp7w%U=}TM4+b^{VD=7@f&$9}N zjvG2uwjO%Imot^~>bAAQE{O7{R$k;gq zbG6yQC!ERj+0|u+@|v>t3-LCs3(q9Di_0y4zi{VP|Mlu}vzlXTEnq=`PtW)U#hBK?w|7>R$NxK zW5u4L*;^Bh@#7Fvx|>7$VJ-WqM9`CO$X+*+`$?>>bmLjQ5eWo3)3#Fm>;1;*F~*iL zv_U@%2m(|ydq(@(BC7;WR<8_^?umEDr8oEc6J78YMC<(a_SNMfy#?zU}9gI-=@cqPwu_&e)8(#^IUh)z8z{(u<^n7Br zXG=*dRTPpVpmrBi7T@wI$bkp}Ai;?_)>1M{OZ{}mb1Ah`(%YW7W2|p_DOF0C>gF|#OJPwCfJ$j{G*ZoH7LA-~Sc6XEZ_!sVu4_;pRSRDS1 z+JaN-PV`sQjMT9{F;4AnLa>;B71e;C!v_C6kAYh$T?ixjKD8GqRhC7z;IQ7 z9+pfQVx|BOe;9!yWwJsMENRm9hlrg~irJwmg>`3r*SKN^>6I zSn_7HC%#62bQ0m0?u~D*Ph?3dGCiXuyWlO!g?%*Y%t1z4TuAaBfkP>gFCBIE>?NK$ zqxF$qpTayk$(#d{UXM4ey&vWhsIF7Px zn5)W_iV`*3~TeYG)5*M1xHaR)E2cJ51pFjIH`xZrqd zKPNT+Np|+%$mVvndg^3&VVXTTu_+;-A4wErFenxd@}WCK?C9Jr)$3Kh2UgaPx{g85 z&nO-TgY`J4gV-T~flmbVuieY>fB(VJB*AUXtl$&Bb`>y@UGbHjlSvRLEU zRqZH9&^chd1Tj1!L+bwV!~eohXd+~ZKVtKHt6mwp@lME>7WFE~=}Zr?X(o_=61v)is$AmMk3hX~n>$%QKuI2K&ZcHR`oA zgJ9=|!c@^*ib&=3JLdzZF2^2t`sg{!ksvw)DKls<8=>S)us+LlSkDf_a5m0XfgiMh znOknSQoVwuRGmjwDv)jaKMm&iYTKPV9d9F-i_1=pbd?`RLB#OfZ(?vP(-Vd4WdKg% zdio;lfeGtyW-l61h7@3!!ePBvNR z_Sm!gkJwp<$3t+kYKH1qpOA`iH75FJTTNZY^Li~hF16~*S6X%5Z{!|o+_0K) zJ@rF(oBL}G_KVeDc~l0U2klRuk-Uo)7nb#8P*@sWcW#m7^V6(1hN=v*Z}5bLpKo{((X=uv_P zdW_Dn)t&Qjda&00p*Z{-)Pk$7YwjcZQj+7YtD0f@y%$*8jr z+QzDEe zx_jxMO$egKd-f$6<*@ntdFvfo(cyn4b7C9o#`Ip5^!?7yLkc2dh%Ov2yHZfIfC!GY zoB8G2j8&F-HOvsOEiO`XJgA7o1JgD$?ceNXB(d3>Z@h4*ZfxVlDgU8tnug!)^H@w-{iyf9nSU!m+J!IJwBvK-yzhfYb|` z;E>V`c+@#FqRZBTZ6X~D;uo#KHS zD?`6{8sPM3q5Y#cOe&=p7hB*XsiV@<1|)F+{;>?kwEio*4pp)Mmn;BR9#1JEaZv^7 zT#_Ln=9wRLAIXfM_yL&(y~DqAlCHr^>E&bB^m8UA)upp7Gx16V6n9&oq#St3V}?5rwE%4>xai6+@ffAiUAC+u zTLOGpOEsEEHUcK#^`<*5CG9WQqstBvC_j`_0WCUZr^PC4@aQe;>+4f(B2h+%WewZ>SiD zBgA{vz#JSjmVAmwW%oUn7I#TFG#Qvu6~o zI8}-3qyAMFBA0f9H@=EZ?7Jt~Om`yyi=vU~M$SB!`1+#F1T5uVQ!x|l3F);W=9~i4 z>*r$!iB|NIg$H&_ci%uc@w4M*l9P5|iT~L6RX1Tf{JvKS2G-x25`U68=>-)Qy zP6W`eMr!*xe>Mv6vmARO^$~_mwAbR8GXdinto9Wd{)Xrk$PNc^6Gj9(boxO%^;`3$ z<6LJI&jrfrUI-Pjq|O67tt`rh(>O0Bz%c^ivK=aQ*+jgPir0G_ZfPkM4eZ#NjHX4u z1Q^IetMUM|92Wqxj*F2zdghk5FNNnKGMKY0VH8aO;&b=$yjk@?J!Jf-_yh z=ry_yPjw&4Xv()R<4_-fPMl+Z)&BvzcHpsZU=0S5!vKH8>W#9O?HqJ)`hG zoB9eUjRe9Un4Hl(b6PaHg0Z%fO`Ekd3u?ZXO!{dx;wMJmzVhS!pu)l_w)ZQv*E8&; zh_-J!oX@5AoYx%i6YuV;xL_QaMUqT<54JkKB8 z+qa7Lj9mWtM?h-Vc0AcU=dem^hWvG1PJG zoqqA#{{NkB1>LeZpUrH{0ywht%%EJ%Hn+LZfxmRajB@L+Sl;TEc($Sh*)nq5*fL0E zjSJR-O@li!@Ri96^Npp|bpK{*yu zmE##4-0YcBMYwCgU71Qb8d9C(6}`nPxtcJ!>F;ihpLpwF1{_BXXbHBJ_AMsBHmtVT zHvH!$J}Moo%jKi*Ft4_N6CattIiZj9wg_`q4N6Ndz>T@LS9{-qSo))6>;%td{m3C# zl`BA%AsZV)GE0I|;Q?yMDD`Xm&;ZK3O#hF$vx$i&)GG{PICMHuW3($KF;u}sFjR(tu)6iD z5Nwcp{=vhvM$WJ2L_2jAj{mE$Rv9cWBgv0)=UQ;2dIo&iu`>3Qq}#Rrbw8h=cGn6san&%POAHd0|y^3=8U9pXP|Q5jh({flA`SF$s*pCMW^q& zau@yS6hL@{>Wm1*J12X^gh5k&Go3s^R%no$=ez%VGY;^rtbhLgS#RlbTxv}h93&W% zqBAYeq}5)Aml6!g(OH(xqSM*iYOAc>%|nld*Hv4&0bZ|-y#-=r5U!Z2iy+-3ID_(nO&!u z7h&kq->g4iMP5 z_X1roj|pi?Fefm&0j-j?sn$0R#R~~#cD!8gX$Gef$&jbo{TGE;~U}_dl`M&#=SD1*F|Kk4BolxL#bEcOBW(r10l9FG9EU z3TGE!VhM{HI`VNffM=`1q?=!t14UaltSgg^_IgN65C9-rt)m+Hs-JkOf z%j~XHM@3>vibMv-+7TzoLZnFO({2Q8QL{+Uv&va@kgI}SL6no_2|dX#a>0}Zr5<9s zIefJSF%WBwJE)*nT7rHS!9?1CLHLVSM;Z#kFd7E$?@p!lrg?TBPt*SR&TPhxmYu(Gu9@4Z;=;tX6hu8Yr36sCPYP!A`YfR%I3Ap$l zVAuPU?Bq&ONaL{-eGmgw$>^r&v-BfU<;}1Eyi+>i2p+b=HNX|IL^F2`F%AVSGnH{^ zMI_u^RtE^y$gEGf@2k65@8!z%7EI3D%3EFTHn>*Pa}*02*bp1ue-vukfo%_?0P#e@cFjs(Kj>e$Z=XI6`JGmdlibJ>WSEsSjYckH%1)C?kCAsb09;dvHO5Ij_ z$`EzyD~rqvXrA;g?g_STC4Ob_HZ0}=?zl{iaheF?OHRyd?uEt@cUDz+5N(Ni9~|`d z1Z5@X^+?C&<<*sui7Nh;9@uJ(=3$WdI`J?yF3op0-+||l%C5+4annm}G1|&EU30B6 z6veVHv5!M5GwWRUpx9lZMHfF?$EZ^%o#E<-csBu5!dD@;(TzEeFs~`G0U@PMcT)*_ zQ+e5^&k{-52hvfg^(kJWWjgcNX+?B}4NL>#JSu-L#;zmH>p;O>gtek@`5^}Kz*O6< zl;UnI=PeS=%G;ufu{fRgmL2LUf}ex)cl{cCO^rvFU~YnH{of}?;x>OZeg=6hBhPlf z*Wf>)4;(+Y3x8gjLeSWfPiKf)uAN6z!tCm%YHq2QG)583^%Tl&FHqXbLab8PUMOWgOgr)CR5{|BPL&P zM;TR@A1N}f%2widzJhJ&r59`S&gLl{B|uO7p<{W-`hD|X?(S!Bhx-vZ*K|B*`R4|l zV3@D0bt(=5Rf0a4nmm@+tO4>7Gs2uNHL25~bRy^b4bP}{R=i(9y3W6pARH>Jr<2fz0Vf(n}4$Pz7g2kVXjE`S?w0CKF5opZ73L#w{`HJ>haJQ&HLek9E7CWl@Zt?M2u`HW!iGh^+rwUPxg6=*x`KJZR*O>hDSp=%{ zJBnQYct-1)gO;b`slF2nT2Gwr@m^xD$D0@VFMV1&RO&2S@*9(mpme9CZqLfUWA$&dF%+n5O?`GTz zj2_r$XFW`@`OMvSK@N=ctql-;O%T40Z8o2a#Cbh$KbgqH!HC_;8wKI!`KJaPZhY1qR?5n9=8+SRkIOp2S z4cm)HgMp&tjpE4oydiPy58xe@ZP4fx2K2!eKEJU3VKa=UZS9Sh}rpjB_VI& zQ`S0imgy!%agJwf#dMdJfS4}+{5RHg;|)Zg;-RIn)}>C5JX~hh%vN59u(iyRfOKva zefySl9REtkMtb13vIMj3})R~DLbS!eHnf0wbmkU8I3a&vO`NQQ#8*@U{-+T^3P+cHm{F2_LeLV$(0|5W_G)Yy6! zhEj!93P=UpLwqEKt|;H7@O4FNMe_)ZUj~#}nMG(tF(Ei)gJrvt&h;n+ly$BoM0qKF z{%Zb-gnW$hB>*g?`3*w2ShMf?yG|6^#K4_=X(LZ5JYe}ie0oI}DqthE3m1u7g}4m7 z)V11Riu>@_&V(HW%8H8(&P$kzE1S^_Um%*-bCpdx&a+D9I@0t$1YFv@J=K;cibe9$ z#i+&DE)j4!Od-8CwHGc(c!VNIbnZuaZ97Q6g^C_kLOZR^^;)ehqx@4kkE>P3r<$W*qV;n8wQfhn{C~?1Y%ftazJipp=4Ds;TXG~2`SIFmwZl;)G|OItScJ^ z(urLL0udpWD3C?R*3B;>`0v4G7Yi(xpua~tI(tW5CE2T7Gll5f9aWVcrzvFw*MS%U zfce=G_}c89RaL}HKJq3|Z#N~=1*rxqmg4PjZt?3fG#8(@H+l*;fe?q zxy2EPIy^I4Y@Qt8xjWnz%ig^wLs`@XQ3r32DX}Cv2OY?9it$R9?~WgVszWn5SlXy? z42$j#%90C4q$3YPu_ab?&Kc#n#CWGDf#Vc9uK>=YgZlSJiJ@z++M41C_P@kER|N!o ztx?ZA7fKM=8hzhD*ld_^Mae4B=;Ws}C|P=lpC4fR8+-G_2#^X+_uO6`LQ{Cd+RF?e znqA#Gg3QRcoU%eCRkz;t6MiN?ilg=Wkn!R1RK%r#pyYgRI^j=pdAdVtI<4k{0})O` z&%_KanD!_Fy_8_|WjPeu>$RLTlW*@g(=!3m3St#3x#{I+h`jPPL+pLuvvu8$AqT89qir@fL={kRnYKlYB@OUKgkPogJ5%>pD?6&~_HJ6}?z-?p>`jm{|>IITlQ9V8_rxCikNpzr$p$Y>g#cDNvdDyd-rR=R+< zIm+84Y&!Zw9ME>us}1@54g^puIsZtr4{{m!bym{Y^msbt<=68$Vp_NWMuOIp6+)V_ z3t{BhA}Iub!|@40S9zNa7{WVCiT-|FLUg%CU+BP9{0KS2EhT^!7%lGSO>%zN!7CK0 z64|==y0;>y8B#X1e{YidRNB_y{2rbxVUe#g+Z&d$b$&>J+!0%C2iPVsr$`Dx_Sf+1@#9%L~AfsxJj1a+MX zZgUF1mq1kBa;-w1wLTncuy5_sOO)~(XIb6b8)`ni?-|2n`=t5GUu)Vc{kt+;)M0YP zGyA*>s7BAcDD*tEy(c0hW=XgHHzA0hmTqmEd^VjZ6`(u@kdErpmCfFL&u*U3m4#>y z7Vrw!1NIK~s~!SP$(lxjyIi!&xyjdbS1N<}_jp|Fgh$;z>R*%+)Z&~olROQHWaeZC-%T`S`4zHWv&_1I= ze|}pkYl(q1BLr}BxXz}pT-P1I>3SEWP|e+Mb_!1D^zhZ?PX!UH-T!T~B6rr)_qchM z4;k3KC1foddx3NTD8Rg6!N^Db^VG{V2 zGGtECOWbeU_Y-&1OKB%kujD3mnCDn$kdI;pW6uqRXChVWX*B*V`3r`)Qf@4`arx5e zFO6SHg^_IK)!CR(mYqW$t=&a=;(b+Mt< zUE>LE+WPi(bIuOKFYUbQ;bP|B3|>3BVEx%z)=={Nj)K4_?5`UsWWHuF%Ya(_)>c^4 zjM2O|(svSVw8zTO$9)_7!L{a?c)}|APRlds>X2zY1E!gm0In(Hp3D}hu{nTp5x_qR zK{C=Znd|=eq!+SQf6D!_?Hu>6YuNp}6Hh*@Sx)f+M%E6d55ES=%ln%TIC{=HIUoj3 zuWy?|uN*uGkj=3rv~oR=arm&D<(4C7DilqUTO$bW&ka|@3lHbX)7=1PcCiaV9w`=O zWE3OF9hrv`)p$Jd?;CY6>a`M)D60fU?aDr!6zX8-k+xn3Bi}5}5TzBv$X%HS5<_jz zxU1Wku;OK834+>FirT@&^Thfe*?6<04iY3f1u|t$WOVA|-fEy5Jg=8iQx+ly{J(MD zD9gymu4SD;;5wUl;m?KIuGLRQqUY7q&RUUL)s&4tvCH2s z()4gIjG_+Fi|UVlHGTMzyw5HRc-}}hb*QuHK#214r%F5xJ>PPb=@6s3|K=4I-_IlH zTD5N)ekozi)mBaE83jw|kT`NEwRU8un=-XU1-nkdfW55HcG~T`m=?3TqlXVih)D6o zyIU1ff>ws%<*sz8?DHo{qzO~K>RY5wOnS!}Z9UJsThabcP8tXmM*T32SX8Qwn@5=S z!9+yQ@p%{pYl`%;)kz`enl~^{fl`fY5fi0GS;tD!;%v23h`EG@PA{XB8n+Mv_0!mB zhL3w6(?8ov159Ksz6*ae_WCBuyKbth?gBngkJhsp4_!&^K#cXPm4^bfY*#&ynWY$A z$4KS6cnbJqy=!F^Mu(q#1SC-ZwDM5e^XrSr>6J^Oudm(#f7m8HO~+WgxOj-rt|ol< z>>ZG0wASLQe%9GY7%D@RwB&3SjHK4+?0%T53;?nuJEIW z1e0`5yl59pJ5gdpobo>hfWP8%dw|p(vezTTnpx(nmHh|Y0GkBj$) zfzB8n%@^R{A?!|mBIcmq_IOYcc5?S|0z($-Gr0^(D2zO{qt-U_qeuLL;Izzmfg&P1 zo8y9mDN%|n0oDO~P9Ixn;gk=fQi+G^Z<2%ChnBTeOi}gHwUS}74-(m&psq@-96-ro zc6uI-!VgyzsM!%d6oW5|6jE*g3J?Y5RS14xW`<9SrExilAIh6C3yqfD+{Or`DDjH5_pMdiW+4 zf=dV_l~&z-Eg-P^$^=qCB~_j4_NKd~ow4KAG9aT9oVb**L`9Ln2eN6zL>>$zkjUA< zsiqWQzfFX1j6x6Jq(X2>XAm3lDuiaDBF+wokZTV2gmNoPxd4?T)v*kjhK3`NU0UrfdbQkmXb zaj1AR8|_V@anfNVIkmU4fj!J?ymkZGgv#xSem^E@EELPg{p8mP47NXlNs*~}@}fNs zzM2tq$`G{JAmz*atQ-_#dBg`7J(-FCb@i(Bwx|1-+wODBwUz!)CwCx%P!gO z+m=Z&&s3O{5;))W`KoAPOfwaeRj0Bp09JP4U+YAVVk%kA0CHFgfr_hg*r;ROEBKMU zPDZU}y(kigrmf0%q8Df0CT+^8YyNqyn8@7MY^jWOi1yM-K*V@c1Q`g(Sg532f&h`0 z@6I(kWE_qug1VI0pn@I2v=EXaPxi(W9mti2yuLgb2v^Rh<(jR{lpRd8ftV&;9Bj>) zA+UUNa(PsaT%wm8F6h7k4y;zsTR>8&HA5s>v8wyLY2<}*X;y)T`cUfFc^dcLuumIi zMP~;Ez(sCNxS2m=u^IbjcC<>jr*|D~nzB7+;z8huO5aTqZW19H$#Cp{Gpk=?R-xmwT75x^9+2zDTB+S;{`65Wu;R$M-k! zzn`{5>D^q*yjvpt*7I$$UEH;hce_6Ia6P`#B*6dvQSZmD0iM>_x!BI_?mc&4aVx6m z=088`{g>F^F44YV){hgH#+q?_iRZ`k+r4xI%QqZ<4s0Q)y$tktd`h9GSHz_jboiUy z=gUC;fZ8cMyLnQOEPtO$Ckm|QH5XWol{40CRf3pHr@neNuS)UK0j`SdXsy6#Z7xc2 zN$FIV`M$whRy*-lFNp2Gf?>FA7BeB!%%>~aOX0x6Bx`;FWfMpEtCDsUR~2RJvsI) z2IYL^Z77`r`u%f?=M&xO!?~iuVu=DCpAv{UiFXNqhWjF>^Kse>c*w=C5q0r<9}&_f zb>8ZHa9@p+#RTaGOp$BU8l3k*qz?4zFr#Yh>d6$!oVGcBftOZzE8FD>omTgDVeVZD zY11c9)7%Y{vpHJlTYrD1f{{wfWdk<|%+Q95`Zaugo_>d4OVWZ$&S`%kL&%hJo-Xs@ytKJ(LZ5RrCA-(1#Y)!_QcV7ZF%(+L!*0Fl0 z+!J!B;rtrAz`N(#CNyW(^+TcL`*Q>oMH1d2%Aldrt6x(X&!esgPT8RN&wuMVXa848 zU|IT)!DG6xt^rfyIw9;4tg9`93VMgZJNvcADWk0!3q^~R90H`3;D;%lO#KH(6eJ%s zEJx6VYj|k?hZYV)uYX0Z;5~sSH%K}t)*M`0&m8|JMI3(H zqcfu2!zcQJ9pNPUy3g@H_7<~md0g;!QFK~|9oS0sLhQmHBbLk}R*H9Pfs@mX^eR75 z2ruf$wYFdo9UWbc9x2D;wyHfuHT%@A)-xUQs;X%srb+|DBh{Z$yOL@E^@qAh-z}pj zl}y13PSgWMw$3DpoPLLwt&OvnoW6%ivT?NCmGzhPG{xHXOz<#LA8-SViyYMeVs{9X z)!Ltl{68RVm6|v1{Re6)8V8H4{$;fxyhzMstm*pvq+Fhdz}53CyrdG@Qgh> zDzbF@a1gL_U_r__UbiQpt%4L{e4)j7%jtd{*?Chd$6jXaLleA?rWf z8lmxa|M9WVg0xQ40%Elu5J+H6MmNZ-3d~50cHCwvi4N-SKToM^?hqV#NH3w$537C< z#_F2Zew@K7K>F)Zpx#nl{O#^{vy|2vcaRa6QnV+Uc;6$-LCUzgj8%6^DrwWuh8*gm z;Ssv1IdJ!F1~0BsQb$?UGS*ma zEXlWDqO<1n)c3tQ8>Zy`_*9>I%A{aBrOO_3L(5!Qh3fXvu6i$F&`sIKgW10I z@K=by92;xKrAOg1WAgg#h_)LTMC`fWr>U^)G(UN#u{FhL%znCyv7;&QzOlzxG4kFW z;)*aNR>P=$C2JVy8;~}s0xcsL8Jy;Uk%U?Atezgorp^hlN7@-{szqh@XEo{mhXc*a zH&3EjZQu3A`f(_+?OWFmKW$#Bm+c*C`(Iew+ja@bUXAdnBVF^eYMtGiCZtf^IH8p( zvj$Ja5I@}Yl8@WlR|lLfPFuU;`XdHxn_%J-Bij@%_*FT6iz0l)PogldWn@RcOFZz6 zLoH7!l?}9cS_L)Rjw26Etc7LMDj2_HG~A>V!&eSVA}xN&e9FS&1xiJO5Aq+vmLnS* z2Kv(KRzvW&(75 z*AU~Kw^)W+sb_clwSxo&n8#Hne96J<>X}oTq2#@#A$c-DC{krzc zhj&ztg{b*IC-Zt`|H{JVhaInks>d+1+rJ&8PCx)(_iZfQg{Zr%J4YvYk39~sSQx$e z?EN>z12|Cq!@+|?FLuPdIoNp6-h5nic3j=p`WCD*2M+9SO_}NB%n+m9(Q~Z&Q$Y4_ z#oLNTLr2dAk-b@8+dBAxb>+Z8%Na=D_wD(Z!sg2s+K(UO;M{RR&)geKz86{+Vf%r= z(I7A`fHHaZuv)~pWT+l?v(ee0<=Hml*voMZgY_>nR%Ps3z^||cfSa+ka#gL*9j-qj z=>5(T3IAre>|8n5u^-EjoV?c2cErifI>+oyMgAV+jI1YO^#A_W`KERRXeMvpWsoV%&sQD0JK z$G>jA0_g(aZh?X%$Cmei$00P91gH_M4N2FZlOxcH(tMNt#|@2mQ@8o7U%4^4$X+SO zQ7UKYs+B7rxiciM$u(;wr_!~Kw!@x|LU+&2JtJ@Af*bF+?DA6={lC>kcE4v36t;e^ z6N6Kh9 z_y?nj3UbCC?Ag{nI@uj~79AnyJGCm&sSNn6%h*WMn&HGDLhxoQkrAR=$a z0|lSqYf~q}J{#q2j@npl&2_F4AspH~*ItQ#fFH zE7ffonnNqt$D`)^M(3-H(YHG08*msSMu;wmP`4eyuyozs<+Xprmv;x{pY6nAA{2} zo;Wu1+2;V6S76Ygb@ZK}oS40M*oQwk4rfN20fZn615KHQ&K^h^-^7PaV=`mT+b?ke zGjj>8f6vte+hBuls2tX`LC|iescMv5uNC=oNt4(xVa1Cd(`Wxe1VntdWb5{LTnf+= zDE}au3~C{O>)7ce34Ub!8k0`sA%im2W+T=cKUDHPvC6$oRx}0+@8Haa8R)McS0nIu z&A;1uNuQ-MsdL<#@=3vFOw|dQ$pZYQcjpwAQh>WK-EzyF%|BLuRE~i-HsyR8jn-tP zSCkz&5qcgC@eV;TGIKuyV^if`i}q71$lcPWZ=Ki6U4AB;TX%l%1M)FyMO2qhu2U+6 zF(c+RN^Y*u;AOmRq*STD91~jPBR zo6l``_fPi!HQ?c?^~MZs?-E*of0j(shJG{V-Tu$k^_3YK7C3(>FUd~05}w!%oQxs1 zh>fN+E~8akX)lTRs`4mE8eaxS-J1ThFGxOT3b5zf%``T&-|if5cyf_a*<;kzjton& zL#G_u&Yo?CNVBjs3rFZzSI-VC%b;HH#A=o|fJ{NB}{+jy(a{rvZgg zIE6c!f)WZSV6gql(X}fhn4&$8c62^kwC6Zjd^DijJRY>^hk4lMaIi$v!4Z@6jQ9AZ zqgh%8oRNcZiat&?E1IVIn~-B#fb&XKf|92tb)|9}k#GvvZ`nO?cP4dKw^*((TBiVe zV(62Ba{Op^7a93G_(GNuqF<5{LBEn$&Lgh{;|<@~cvWSC?ltLOSBZmwKW7VZ zK}iM2i@?N3zVFlTuNk}$=idbKmY6pgUc7XQynIIgOJyYq_2l$^Z6MbD85 zKRnY5#@EpsNKn1}8^TAn%P8+P0Xjvi%JK5Z$f)4CUgV1MR}?&q>VANcqj}#^@U!*& zA32bFNgMRyq0i~zxL`0YIzuZ~0J>5RXS5mf2JhP9vv$^!g<`{&lrn3R4RUshFkUo*@p)&KAhf(gVv!9Ydjyc+<; zQRy#G8WsEpwW540%;80MRK}HelreUx?uPiHoQojUW)|)u!m8*EE^ua1o#78>O{L*% zUajG5q}p(%tlsd4o7se5nlaY9ivTSz^eCO(dl!a_l-z`Z=z(Tu&H&C->;hN0AuMi7 zp-n{kd?|8OsKN#yzan@+WKrN!<+wZKI;)YaUT4SMsP9M706d7>hdu9`dgyXualm_E zzpLUXaglskT&=x1iy?-nX-jZ1!{9iraWTavwdpZqBEul5OUEo`qQ2oQj-mHXN|DLH zGhjG+m}$|vndXHA&Txox9Je0==ZSNHlM~qh)UJ>t)3jXWZqk|}iJ2DdnyGIyw5Nrd zJyKt(RJ!^~rQQx-@K6|)z9NW(_Yf-h&#*8XINxG{^V8PSwrx^CP93XM1N9%&On2(Z z$1-j@Ev(A<@YF zik95Zpz%iL6_mLVjaqJ9tDQ-{tY%S`M}+sRKaint=&2yLtOyr<|2Q-Pz|~j44wYd@ zk5$ruq0H45sTi%~8nrm!*1%a&x#+YB>LPV}MK@*xik^sL3IM4QF6hpAJsxs$kBiz{ zPHuo{tbmScj4keJO#FcnKzcPv4bN2sW&>yR$vJ~?-jG}{gtlAG=qTm9r|(L4ciSec z9N(dlR5ak$dwaupnCPsVwB^9y_|EjJU4l+ZHrV>z^<|ldq`twb=1BC8#Y@quSBh4h zQZ#sKyxEnM?Z#T#jkUWQTQkOvU+jmI0$VZ9YGNAqT*B!)UOa~ZrZ`QLuhZ{~iR&-) zw9McwmvGt!TontbsY(k9?W%(E6^5?LD_BUls;g98xaYMvuaZWKJyg_r(g3L*R2)Y| z|7SUfcTqGyz{rUr^8z+5W~Cx4W=$XxC=2B=>mH-jrLur#JlURw`%qdabMu9on6-#- z8FLi?uW_7{TBjNuLstrG#el!>34@f|YVjT1)hS}E+x;L|lH@Av6RRpCnW|7vRS`}N zMycwk4X)Al5U<|L4}dwx#p4Rt#^a2}oYPJ_xy?oUE|neU_0<=2Vlvf~xMc#t1}&Q( zVlLIH7Y0}x;S_*2Qq{(9MYvIs$`w34~2NRpXx z%yyTU*Ii=l8B3gqAm!qrFe>7qexe(Wb|iO{c$_spXY5Nm4M3f~7y>s%Lx%329-naf zDFSY5-gY;DdiT1{ChshOA^Mwzmqs`zFXt8FqE$IdeS&g`GYQ$`2cZYA8t#`7xG}Lz z=yGVT7yn!dzS5wye&P6XdF2Dz-{2P``TwATs%^u#uA@d0fGiD zT9`}H&T z>1k-jc{(ejXqu-5FxjCusmCOGU(r<0`D4~5ssBVq-Q4v^z+F2Mu&N6)_j!wWOU6u5 zG)GHU)kbL+b+DN|Zo3rUy5@jiSZ9IXSS)b6VT-HD6_hGAoMIikqcn@^j?4mg zEX@KN7rX(-CBbzVTusVl(GY1BC*m1klxBgL#R3hB1%?(&3{eB+Cd{X(u+r2o;G}Ia zc2SLA++L1k_ndlE(-*NxJ-)6oM$D@usP;&Lg~XX{AFaN2em+A@@>SZWOLfpwkwBlh;rNhMrSb7n}a+f{v2ds(*9}&f&ZQ6M926!Nu z%y{51`LpNo#EGJmlRgR+Q(X>7T5PXCW6N3P*Env0;rV+mx$|3#D`M^^~Q0I4(GYW1$x>p6Lgev-cy^>-Q4v61&iHJ;Mc}m z@5@DeQi-}cX}g8*XfyNOQeQIQu~?##+Pe5Q^_2l$i@he`af1b3Ryw8DM^3@5N~gM= zlHCY9+Yv^0BdT>HI?|2E-`(sGPTF7%Hv1iMt{vdw>3VJRf!xFPJNhN8hx_?D1uxV7 zAFb5|RP*Xa)iuY!5M6A;+aur>a&Ubd`vkS^kz5dsn|oMd+(duDLN);AZC`zm@|{xp zlKpk2qY>g5W^rhd2Y@~1MU>exCI1~e**-$orX#bd=kK;1M+f&<_(3XOgBDb58cF|)f!#8nv1{v&r7%WM00menSZe)7(8hx_D zJ;Rkk)3yCOSLE(TEyul@(%g1AK@)B`X02e>0Ig$ReUR&sBlZt+BNyQutDL805%?6n zYP%HBT6Q*=OXcK_ETRqY9bw%JlA*Vo%T3!N_hLbNk_EgVOH57ilXXXo*MFrECaFT1 zP43~p>vIjVPOLj~Zi*P(om(m_4yxPIVvL97{rX*TJJ!%vJP`ofku@sE7F?qiv@w6DD?QC&w{n_se@vpSX=)uJ{B#o3nD?LYpWK&6gR zMO*8UQjFth_PjNaiB~x&xTN9Q7Jh08JxA*Qq{td*ow7lKAH+SnLdm%uV8HwqXSzGQ z;PK4(gLD|ICQio-_x*Ja@R~II!D@cx^9mzRN~h%`eYs$cFjke%Nulzm7gdrlRH{(H zp_94_SGK37&*GRXhvI+PeF*Zf>` zt)Q(taQFRAuy?a^z!T#lggg>kv>DTMGx2hyzMQ zof6woc$r9Ds2qA#p@h@1o!Ll6^`iBYv#1b6ONuBGL|2Na6GUTzC{0QADx@*fb=;st z=%g<>gYd1yv>Ai;HlPh7_`G8h0AopxU(ogC@PXVjx8Kn(nT>EizY_4W^6A1-p!14K zJz85b>P-;l4PgB2ZpP|4%ITxo7s~C<7_HeEVa64A@jzZLLVI%BW!?8B$8X%IqMd1l zFllI#h9+rPA`RJ0D;SZ60%;f~4HHpY6Sz!TyQYd))7FSO5Oc%9+f3niGjHJ!GH>pi z0{7TvRbrQG3O}5A3){}Tg`dv6g&)nlLtn7i-;sWHOMwJLiI6H1Qe}cDOcA9isbV2j zo{~0@@$TD~eXrL>{11?=qVvbh}twk)!>V4h{$ELr9D_QF#vF?gxSb}yfHlTA$#Vj*{sdTM}B zVb<=0nF|FbPepK`fQqSvU@E2k--w7IQ9-3YAWY~kE%&QHKfGa zr6|CZYYitYCmCSS2~MLMlc#kWIMczYFHAK!MzR6_aG(>)Y8Hv}GNW9KGRY+SG>p@f z@#*<-x&u$9Cy-FIBZ2H^5ZwPLgY<#-S#M0I2Y|~rwbHNLh?ZlEQHxs7hzLy!2w=BZ zDAQts*l$_^hhwqQ9#jFvbX7GhnjS4;5yvY`r8AfS3xr^V&EfF{B8gNcM=_ir6-t#_ zqt)pRM$_1zRuH%<;w;?a0wLEtC^&Y7&_;Eo7Bx(WXO9Ln6qS zSJIq&V0H6L+!Dqe3tF^m<_M$*q*?bk%{Fw)_!Cu*TWrFIxYHw_1tuJeEd0Iy%y+q0 zp79;?#kfO-d3V0})8FsYk}4PnZlqC$GB@J~nsB(Ch5mRtkFopu%oO#hk_o4y7os6P zHN5MxALzTFr>xH!3gXY3p&4oWT@jtQdtuRc8sU?w7m}S9BFr| zL^x&U%nGu(5wa@gTK}Zu-faXrggpHP4%qiyC8^S zVTWz@lG`osZc{v9vDsh`Nc@=5J89N(srqriaDp1T?h*uiI^c^01cC3v=$UjkmT)Qo z0YSh7g1|CYqJ|O^d^xZjWeI{By1qj|KoD>&LBJOX0!wcRf`DlP0s;bpfZYUvWpoLG zfcpW@5)cp&5D*X$5CptMAedBKLfhzmBh}Iw=!t~$18scthG1Mg>&_L}>cc%X393cq zEcx9lfkQEeuHru?neZm-rgAR2Qd<7-yQSW+^pPcflFY=@YjnE`E+JU|*!ib1LT4_w*tq`2M5Zl1 zRJrdgBbH`hqoakG-V+XNpJz7-?HsUr%Odo{=UAj?nkGBL1L<4*#J9=fLrN$r zi@9h>DU?7UUgmgkCGV+d0_dHCKbx~cju2`I9!OUu?POTqCucwkRwEXzbT-dYJtB3GI`(3u!DGcb& z5RvY;v{?n^U;%J~#iHdT80oFP^^mz0ufO-6wzg071Q7C3{~4I1TBHQL=jS{&VAkel zWa2aJgrpVcBLiw!Xr>n{uXXAM+g`HP{bT|AP>uUyb=rD4u~iipZ?4ML$;7$lp~T&i zSA4b1&tSkmviTbtJe^x}ErX3Em|0Q-;-xc}sUC|ka%%%^YN+k>QmjfZKDXht&YuNd zC{oC%4AQx*!rsiuQ24heM|&Tws`Z#A8YY!CR`ub50y{jL54A@8dn0APGDfodKS(tF z|M(L<^XjgoM}0NSXVfq+a_i(@5?kx7Mc89SP$yc%>5Q9F$G%(e3pTX>Q*KX%D!wyFFS72Z5cRXZ3YXF28q?E>OZm$r zI}CS+sD0B~&Q8)B2xb9|75I(}wUk7R*@+Pwn4;9+9-C7qbE{IvV4RpPZB1p`l?V7X zH%gzr+{y`bv(a>BZd-Dyy~kX4n)vLt?s`^enjGjEgY6wH`1q%$NWvlTke7sLyzJ_H z;Vb9@{cdBw^luSH#!QA2vp$a-ZVrd^KYj$+(^90JoAZy@6k$}~l=hTT#WQ?PCZB%S zKLWutxuZJYc0Q4`8=4~ce|a~{cQ1E-^{G;S#i7R^ee!L*j#BDT;_Bfazdmp~nmOsu zxKfQje@=SNITDYn#RLC*b@1QHpA!Dw{po9Qz4Z3&u6*RVr26Hh{nyIkXXpP|d3XPa z-}xzCQ_-7|A|HL9S!!B2C$;*u7jOLiuZ7|Ceja^j(6h!X`-$@pGPOlyuk}lRq$XN- z><-WdGwa_ERP#frC(_*8`k%%3W3U;M;Mazp{E&F?-ckJQ!%XeSOErSDNP&HZ{0q{pZvabM_Dppp||1!JQ@lZTOHHurMD(Yp^bauwq8rUQnMjv zL+VBh-Yuq=A|3CyMmaeZ2)k2qz>uX~H+3Sf+>C9=pn30(=WN~^Y^fbV+;++yKWs9v zvKstO9a6^+T`Q_bv~NbOR(0yV`2=0DbD$w~bY@o!{-_#BY^=erMF#NAh;gG48Il^L z$gUm%^IUE!;&16n^vsauf~{c*BTMq=^vukr%q3~cYtiW?bOuN7H(Thvq3}7S1_Fdg>ziz+jcAk0ZN3$ecmAF?1gZ!6z#+YUigfrK0vz3psJ)gh-*GW{ zrqqrY1V?3RRu}_tf&@JdnBxI;z@`IMEojxzkcg+egsz^+Ijd26PrDt3Q<)O5RKwzFagM^zOu5AB?3IaZ@1_z!om8O6Xrf*Pp+A_$ITK|?hr zjiD%VqSX`?j!z-9fR-^7d}5D3m0|s<$x=e2b1f-X)r%cwZ?@t5#~SK~*0o)7qIRT_ zIBgCWZG-n%Kd=#bvCzP6H9O1Qv1yrgmQXKtrmgI>I>Sd+}iq_0oo02?M_*7GJ(WL!qJ;)Fprw7 zsU;E;r)Y@~92^R0uu&qvX}s>BqZy-b0~`l=0hgc+=@PXsrpah+treow7&Bwg+RKGE zsXghvj^=h4hg-_)STP*ueQm8Xn-GCuOGqO_QUi``rK9BG;3HzQvJ#e93=GMzT2y-7 z(_k$HP&M(A26hkNT>-29#>&te^|{O(`uC7tIpOGpEJa`uc;qtO9m})vA5@hY`RTKq5|jCa}L<%s?J$1L!VrlTeq4Z ziL`#88TJnY>Nm{Z0a)1-&vh+*Hu0|>sV!7Cx23wjfKb;atISRW+r-1s9MgmL{L)Fx zXv7jmI6M&G9!ij|&qG3KfP%ndTJW(5cCiLI7zqG7(3lps;?Yw+%B$fTEvgfRNsl@> zF9t9tyJ5&CpU42wK#ZJ`UJa!6LuC8QB-9vUR;GXq&B(NlE&*PnG-wT2!Y~8n$R-os z;7$3%5d+hgv`SXu5jy~u%0y!f)KHI#-O8+J4IL;DvMj@Fu5K0b>L(c3T7q2-81<9L zkaU1Qa@7Ls_bu%$YtDN%w7iI`9#VzW?rpDf?{!Q5Z+VPr`jJ-4}hMAEu=-LNi879(6; zhzv;${z$L|fA7-EJh>4m%3KnGK6R%ELj#ru0)$BG^QF&&wKln2U}t3R&iH%Y5U4^1 z95|%cPkAG3gJCWvWifWm?7q0gQ?ISJf;Eg9fyV@>&L&+uwwXnX1X>GTj7u_Q34&S1>bfB*?cRw7al$3Vf43~7&o4T7_z1_BjTX#F<1u4B zBX|TP#9c*&HhqEQAh8FW#cP(}zjG;FGt#__sKB6s2n1U~8X1xre33rY1hg0|(0$4d zznvlu_DvyKt=P*vV=<8-nN1+#4bzwi<+<5C*jn9@gbVaG;5(E5}$MTiXPmCvgBWQ2Qm1_%$V^%opTu*OSSPmw|WliL!9#)%kW8u zF_4C()59$+JApv!ttC<}fVwolD)6K3H7Ol#%{oo>k4PgjWVU?tQG;=7F_f4!ffcuS zuhyy;>=s%yuqbwksUf*g<&f4~K?KW(mAM;eKc8x&M(9yK>v` z4)TVinwvYKTg`7TM{(Xzxi~2jhX>NIGyrt(6GJ5@QmwPfD@nbF8%n;`yv~sA?C5AN z%5d;zhCrZut)-}{dNgZN@V1XLTev=u`*O4WpsObey71upa!&|>iV zaR3BVV{2%dkHQ+zPdO*RFFBzFz`WKdwtK?tt1RTUQ#xtty_bgN?v@#oGDffHbt0eL z0I_l1?xrO6mb$mZq2{I(Tb z35~0TWj4ZFVuD1@~ba98XF1AGa*lFYDQ47!@1)* zq{Db^wv@U%G(M!4=lb@lXUImPEMI~S1IWw#;$7aJ|09{7>!h_53LsTYYs3C}# zYEiSHrw0Z;r$~qGxA)XhmlPTpQn(ftODm5#ZMEo+M%3y6wfjO%9x6e_nKLxll=nqaL(M3hZ(1ZU zHKloeiijO~j;TQ_Mti3xXl@Ta_#+HX$H&C^SBP-bX5r#;Xh$(E_ev!uJXC|!Dk;^&AS$Qg~nlpdq z1j~T<%ChiTBYti;-g1)niYS=qU|pyu>+|1C^I(tpU4O>!N3kgZ{$A{pD;6(` zf+jnHvbYUPjjc(K-xOitA<=7s_jgFCPJO@1lw|2u_T(kCXNAq^EIlp;_J#}pxF*b4 zqM!X7MP1tG7p?yqN%F^?ZuE7LzSk!;y)D&zhA+d6=7Ctnw1lN=95(f&g$Y6^@2Z!w z(Kj8<2kIhyXCj%ty%;5M(RY17u!ZIi{H*$bp!BRhAN&5F|AZ%gO>hkNoDW^_^_pMj{@c7cS$hy$2Q+NWE@W<#TNZdSl(T>Yab0X}?F zC@qE7%aSp+ata!(UB&#CNx!Q4!V@4 zYk+hufkxRUtgEz>zCEh}xVX#rNphIhb28T?RJqAnSE`E*& zFe+e#3aI~u2aXqbzG;4;VPa7xmQ@&vhk<39uDMgQYS@EA_vgh21NWJD#)}YzE0Nr(PQm zsC=O1=YqRC8`leT0x3cA+edA~C~^N4uVLVi6sn^>Spsf7cqb`7&o zhLe6mTX%pxt|4w9rRBn6GmgH^WA$oF*MQi$P{660x;^PcbVpl24Fq{T1*t z(cSs(WHjSVkJDG}rMr(x&i>q$;K}cvNK}pA{mgjjM8RN9t05N#asC89iUu3;#k60R z{4Bba8MnWg@|HBg#uT%daG_GfT}2@ala@3^P=aZ<*tek~V5H1lrcV1k4UHP4_@UE+FwcJ&rUGSa zZ*y48AQ>LEU^oeHCLM+gM@@cs!r{}2nvG!8VT4FjV#fRP-Pn@@e!HT=}8#*<#a8(P9K9s$yM|Wx@WkW5tW2lKu+7d>lwRdf?+E-Q_#Hg%+MI5 zOoH;dmfdEK$ED&BRW)iq3pg?%J&%-zkIu6MF`LbbfKO-EW!6|6YA%Vcv%z3fafU7bW$IE%^6YeT<&wlVN7m>I~$3>+VJ?p#} z5R;rmM4|R#YfUa*cnQTztSwp2BBY>e+3iwrgBtT+T5vE?=F5;?W@%Yz4bzUxMxhZi z2`cDX^;ix8kA_=9-L&I!k!U2$d@|}yFR!_LW}Ox2y-L-(BIt@oeXa!R37?invc^g! z8Ltd+<*=)OT%~GN#!go~SuIA(yz}ZnOmbG?@~cN;T6A3l7Mqe?RK=+M8sSRD?bifH zA!g+7Yt3j3Z$@p_0#sXTNXfva+uA^^@@w}{-3XgJQ|cTECe>-J4BsF0N|SZu4+t!VFu;Xj^pIA_j|`O<2jW&n-ca2g!KIO)NQhk(PO>O4dcGx@;QZbM?^ z8M3C)P*5cfwR~ufp+}XC+Z_gMm?i-^?KZ=LA$#`1C#TbL*iiJuhhrM9gtf@wm4>g7 zs51g*Uq=Xzh*@OB&?-kl87V;B>d1B@7uOzzHuoqQO-AKzan#1qfYpyydUTqjCyxPz zW6|XpiN^#U^Xsw1jx{_sclTo-9mnA~FUNHrH;75bETm{)(_=h%JQ^-(EvxS1#p6(O zim4j48$UDm2^=Pbk2_&csS|0P7-Zr(9g8lLz~NA3pQNhKNkNea>G|aJth)_@!=vSq z*KfZM2via#LAg37J)De;RYb+O!(@?Yq|8D}hV3Q?MJCF4^1M^R^x;k4${VUV*3D;u_(E)0d3NyJ<8=>aI@ zoYK0jrw>C(_Gb`hsQMa_pjK{j#-W*z63$d4+S|;~x@~5zYcdNdi-=XXSqkWD&PvIl z+U0D7v&CYIx1F6n@9a@*UCzNbM`oj&SggHjd-bi}9Djb|XmY!+r|fBc=HFRM~;`kTOxrFCSWG^Y$ z*FkfaTD&y-(lN0I6KA{(6aW#|ntAHbWX5f|4GViiVOsuP_teQ%!)%|)AoHb%guuCZ}Y zxW^_G-nwj(l66z`!Z%&sjHJ?Lp@_J`3LQ3w%dmMo4h5@X?^^)bYHg9$^DPl>Idm)M zTP@rgdh0;3ZD49`(_Z(sD%+Nq-wwh{)!U2Sf#VJfJ7O2uv7yDC6nBd0cxUmQ;~Vb6 z-ux~byCQOQ-L*E)K2nP86Q$8U+gt2QqWiv@WxDR0q}IM8B%0ohakummcgNX1Hq||7 z_JdV!KcOUoy6yLij8A3Rd5=hBd@5D}8Fk~f`|XufZLmMSQu_-*gNGtuvq|+n1g?~tp>@|GqEQKH*oBmhIt+|NBW4y-tbfQ)hl)S+*)U0j z^!#!ShXvwg8#Y*LIB>om!(~fVA0F6r_~B+Fi1Zj?TBq5Fh$JGlMy#zr5{iUsr;);u z2o>s#jLzA5WS)iD5M6~_pa7!#GP+L*x_W6{WYGqmV1Ru+$#yt;v9$FTue91|o3Hljji18R{ZC*%q1#uOLGFpz>rNEifMH1>fh_1#y&=s|NKk4OU%z|=SJ~~boj)YImF07zq-q+-iD1@|}qDp#} zT_%r4BckUPS23{ZJ_Rf$DI=e>x=Fh!LJ)8$SOjD>y?2-r%o83Bmzc7?Ro5wl=)?>> z5~_wa-KT=ZBxU54@@CxUQ~`Kw3KjubP46A12J?hR#U>=LZPsb(2xI~p4iQCNi_X(P zp?YS>J54eXBfnhDY0=wE2NP?$Zb@&Arq^mQ{bAcP_?QumM77D82+tHdGmoTZ_nG5z zoJHa+r)M=j>)zS1XCJRJ2Wh8sjGR++&VllCsTjALYtf+f+#pToUT<+8qVu$$*I?e_ z&hr7W$XUA2*V%S{04z2cqgM$PgSPXBAT?P4tlk2#tb(mBh`C@!vI{9+Xkp=Kf^-+L zT%@Lti}EiTTVOGA)@qA&G+G=;+ivkb!!}FMa!b}&B9gV+lKP#NOy|;RvlO0?TwjBV zaxGO>Z)t2{y-t_z7;N6xWn?Z>e_5hsqv~IdYq{+9%X?|Cd^T6P6=Ze#SYfx-6*aE- zaHZlaqph4t!qDqg46d?vRg2Y-E3Vceq@dq=b=&T%$H!R%wA~u}ZLg_*&F;0(y07)U z-P)j$)(&{>u?`}aq`GORbt>3ID_vK8-9&=k))TPke0`Gj8#-@*L`cis?FLmhWZST% z=0SNig$~+E!o7|Y#HDbsclk7YrS`XJyDjLpovpT$>$qJc9gn!Ok1pFopb|20OR1T6-#!+DlDp&% z2*vIYzat2I+&ixAgiFCCt=n;@yk2(}lxx3p1{rgKyTsji|Z8$hos=;HiDcQOYfx=aPh#1DY10$KWTMY@{{E#0* zr7OR#hh`W$g;hXC)1=*Dh=y72Ff5p)Rv(8=JskdUp;?B9DRcPR5zs1+@U@Q-sjG|_ zPSMv$O&txS;b?=hHI5D(J%E5qRewwnQALBcV+IfjGmHh- z=vV_|i!>fP6qi%2$2b&~#)%Q>V_e<_$E_LNG2-)jRFsbQWEv3u02R3MuuNp0?WQvu7ZZ>1&3%MrUN7F#*5oObCLV z&onzTW%ijfAjCeO%=um~z<+_B3(_oD+4Ms5i^OL+nalU)`NtOUHnm{0 zm!!Sra;rPxGtj~oQ?2d0ZVwe-=&Y4$`<`Fgxfbr^wY_n^PZw^k<-WgTr<@k{gJI(< zL0m@V?W4v;0UE#ok3%4YGGwMiLc2JIHt3jLPfE^^b_@x97(#57w#GAnG>*?PI5OeN zub+hygzdwEbXfwn7C}c&P`^P`^2`Ng{x$^ysDA^oYA`*aMx4-sqHvrMSqDh%m{KW_ zhKf9RTIVv*P2?(pSq8A%o~h$wxpHFc7obC6ce@p<=jpH!-3sug$M**on$G9W=0|Tu z&2pJMJK2a@uj$w$38b&2uVwf>1GY2j6!n#*i6NQw%S4u&w@}|&f?sbUJFlGCxdIkD z9V0(doUJYtRp#Tc2}$vq@X(Gs#W1%aVcwQ-C|FSjS2I7uzkEOWiPjzG9?Fedmv8>D z65takKp7g0hhkgCNo6^ZT2M(ovo(=`EJwWRP@Y3z#-j6_aE%czXIj4>-afm`(!Fp`~WiQF~KKZeAgIFLnXVOSN)GROzrYxjL9;AH2$)R1%Du$SHBbAia4$N*qwj zPUrl6!kyS7D#~M}IhsBXj+~CxK|UuC$f8f2Rpw9v&l1rfF%@-LcaD_l3BWnH%04nS zn-@7EUHynfdKRG;b4QWvMeC#hu`T*^NL8qsQ4c&G*W-27lSBzl2N zGhNS`6xoTvK-+8G4WH@aavMnKo#AH!#XxvirqTa_BuWifD$Q2nmYkF>} zXr^qb&#e6#&XbPpfo?ABxSqqt_rFnnA+51I#7T}LO-5hO*(`k7Y*;u6tq3G&8KRi|~HjRvaxl2nC zU}rlq{ONTn!ESelonC8x^`+0KmqtfNXN+R|nlL)IS%dW(!;360n#RU7O};wH)-99M z;pOY6ZJi()3MmojG_O={$#(b^e~Rm=y}np>9uskg+Y@Py`-5JcW4dlCB3dNM1&}g? z6t)9U6Q*)3O|2yJ>ey|+DaD9Ks2Z0*oj+^2c=tczqm&ZFAk~8L*{^^<&muf#ooh}G z%}@bj*p^nXfu<*&k${*4xEQz;1{U90d&OWJscs@W&N(wWtf)jn?9WDIrD@#4@IDF} zo%`Jh=XMy@1yCqcKr^PQ0-T&k&Nly?Ly(=}J~T@JtRyxUj3}N)ItxkR3@i9>=oyVB z?%UQvP9cb=dCT^YR^vO6G?tAXcO?C<7wJnrcOz~BG+KE=E{hDHxRO^UDpG3P8L9a^ z>wB4ZtO-?5O&LzMn!!$KRL7F6K%bm_mOlcQ{ z5zZS&p`|c_FdpkUMK5lhT(vz@&Yqa9D!#TFlUJt1th_()*p!fuTIC zvZ$1<*>Xq~6O2RCh#@jDKVTLmmx!>sS~z6BNp$I3craADIK@ZQ@}ror(}0p|!~Qt` zMG+)5X^N00jgEcno;e;uVrecWlSd-gvjVWr{V`5_tgQdKd{K=+q=+C!rV$#K?Z|@# zf{VrTXFpW6uVm*QGbqgZc2AbxvASIK?t9|!9u?Z^=AC7_6fb^z07zwswI9t2;BY6T z!pxXqsQH}8(W{$Ah&}oRl}eQ2Y+M!d4#Ehpu6~x#kqcW~6C$L@fD0j7aj{DFEp%rr zSAxRgjp7t1(N)gfZh1{;2HsITM>b2<1I(2a#Td{##|B zaYiA7ErN^6CO+iHg2|CrS03Ep0mHj~(DB{FAh!HW{mD+_EZE0vlYSH?i1 z3<11$g(cyRv=ouQKx_XYP&#)n>cu@|#z3vBi59a;IoOs08xfVp9+GdIhDbIk_;SP5dyVt5;3KK$a#*89ay z;x#(0@#>O+N})2dWFVm6X7gt&ln+7@@>8_yCzkt*b0kUNB*d-EM*Id3V5A%L#&>^4 zXIHZ8#SHM)ut~@AlCaPtq*U=fA;HnXKJ(PiEBGL(S1W0@;R1$ZcM*#FfO<=Cky5!* zhYIF@z}=GPn5tm*bOR!|Fh^7)#@{QdWeuI`P%%ElNy@VpKp~|rn{JPW8V8~eC;~xAbPR(46m+=V8O#zfow}U*fW*<61fd~g!)IL z+5i6b_1_cacOeQfurJ#ig?csVj_r>{z0z0 zPJW;as|}I>%cTmHUOFxDbd0Ntqha8PhgPUK>_LEX)5dmr7o|^osNL-x%_7^Q+!I>W zYM?}rP^v^V2#8RZQlSX1WeAQ>T?aO6&kd|+ug@j#0g zyDP&LlsfF9sm|=#p3cUd;_pbAQT*J)8rEUp^$uso$^=>K&;00{xaKz9d4IWBkJ=h2 zTgWg7Y|o~V7vwUD+|PAK1GzRSscnyqZ!P~gbNV+hN~eoO;t_qUn+>)%Z;wCszP*%o z2vOYa(Q$$4RF)C~HjTa->3X=i6rpuxcTiN(lUoZIsI*RQ8Bryh5nhzd44LUS5T+^% zTAfdUhAhdGcl5o#7z9!APAW3~Q=l0=2#>Sp-*o@H0%saflY3YFEi4~mnf~xEl=ZS=DmoK>7Rlh1BJh#~OHx)-gA{5} z3|~39+P@bKr*S>IoBJy>iKzy+7E*)c$eKAk)x(x1-- z;=1Y@UJwG(y@cycuEM1doU#E&#`4s!igih`Zf3oA;DLy0TIFvzD~Mc7&5W3gzxv?X z^yU2E*Q^-?!Vmw-YA9RC|EpCsU$xW-EM+S(#k*2s@b6bb!RPA%DbK;Ca@F`T&SmYO~s)8JMGMI z?t5y};he3@;!Ku}s%jeN!@{*1Wog>%)AD+gE_%>2uAjFp7DJMeL@1#5jgHS4Wt{gO zvvJE%DTMN1_p!YN5ujTpNFu1f?2|GR#~xDK?zI;hjGd|cN8_?OmGkxfvvE;Tl*~xy zb=yO1|CEFmH~&ytCaAq)OxwZ7iYTm5p2Iryo>Mr~;*@VlpIeQ#dykMPfnp zA`pvCy4<6hv&q?Cr_Tl!7qx7#F8NTS9iF+nH<+?Pf6-Y_ppegyFp;xG0aa+H@Se#- zA$3tTh5{*1lmi}trc{6efkQ10fkaLWShNMh7)4F{7PxcHJJY=4eTTK+FXjgEc&)g` zuac7i;CFPQwOUhiC}zdiBz3syci znxDz3ntD=9vXGl!b~XIeE|W`}uO5N3Z8m5|VdhyuXPnGee>~9+&SS65k=JH3-NXaF z>G5n8iw1+vxV$2<44^NLirB1O zQozU%6hd?`QJ&<|&2bc3>5KoyqUECMl%6Vb=(t{G)m)cwF06iNp{Lh@KrrE4v$LNq z#IaFv)zE{_7)HVP)<|$(1Ll+#hppT}6=9W?C$M6-Zh$tGOIb95+$lHr!H})@Cthi~VMiT}%NHoH8J*ms2yB(4D`^eYc}bvyPRlF6EhQrF zWL60%Lu&(`Z74ZVWmG6RT72I4xNIhs zaUFv$tSU=kRQlrc#*!oYvrf&BZkQ?cR8c~B9j=3Vb+Y!|TBe~N?e`K9Yh}k!s!YeC ze&;>@Qrp(w7R`H4&HuEZzL?RrC?aZzv5>6T8GBqh4L$1H_lA|@r%ueBlY#v-Aa9A^>jMl>zP%ED>h8VEK{7r64WH3QZhF`Ne&<~H|a zGmUzl2z}<&mR*z+(s?^IktZgvpOsPpEbE<`!;+|q0JXvbqMBG+wt0Yv&bk>+6{2h* zuYByv<0EgIy|zpTu+?aq0N;~iwTd4WSP}XUYh~Ee_O}2Vq9U&+jST=s17C6;WC+_MRi2S z4I$nrSqtRf?ID%J?dkx_MIu)uwSiZGqAwxOqW~~K&%ciBhPpVU(I-TLDy}Q-PPGL$2&VW|t%I(ZbMKm{jA zD5cD1!i0~O0?=?C0%+JMvF1kGABHra9!1xnS%PcQW zGC^e*x4Pl)*-jZA*njJ|df`v!K~GoneDMhIjl)ZGQ$o>DC#3^$V%4F-b7uogqM zgJQ*nhRXG>LK8J@1huMm$cqXmzE{)g1*z5CYj?a?<6llM@R|;EZC{uE>PSx+$Xgoj z<~cRKhI+XTpZDjb*F|&N&!e7HK2|&tFD1<&Qmy*`N}PnIp!7 zBOL@oHCRg_qtntu>gH|Dt}(P9+;#}5iBjznc>|P13jx-?N+vJLoa7bZ{#dbWsEcI> zM<=R1VmARo6mQbvJp=*;x?E-uaTNe-bGj9zqtaL<&~BAw^MUfx;hSvsl2#vUeEY~! zd6AbGVSdjjJn$BS;-6Jxc63V&;gQVY)tQp{&rjqf@J*=-fMAox(6aMAc_VH63_=OWrXZjykN*LzBaOxduBd@9^eV>-R%WwG#{yq8cTJd z_M)INzrM^#;D1)Q$Z;1~xo2qkFq;#XM=u0MZD9?);tqr%`g>nG5bB-Y8w#It!7-_g z(2$zX8Q(l#!Y!>)FAaeE2$Y4vt6GLk!qC{~!3*xWpti+@S!ZXT$uHmk_frCPMzblX z630EET6|ujLxRbo7fx@eo(iM*5YOP<46kB45~@Mdg5j?8@e#?+$X z)#{U9Io@t1#pNIt(q$5^@W-oO$o1Jc0QmK)!$u5!yI`29ZIthO zd20|hi$p%t++0``s?F@#___DWK@1@Y=D+Y>3n^jSwaf%x@=}^0j z;b1HBKXbNyN9_s2i^R7+WvCwADFWa&k^ENBhaG}99XphuJqN@2L|TlgPDQBNOL7wU zVbl=dmJb=!@0obj9+r+Ac>OPadoAGjxTvc6+<-;Hkdca|#OaLDQQ%(bP|;P(;7WC| z)eTEG-u5U@c7~s?>53wpxii9|e*I_7;PoM$tlnnJYV-qjU_Uy2ZG7HK&u?Y#sLd#U zZ^U}+*+L)s&0RL+`^6la47v#ZZVJgFpjL}YCBegkG1Xb$l*xa_Q+8x~5AppgD#mXZ z>0r={E=5}BNs5Y*eB=oM_=$*XW~Lx3BJBBk1#z^*P{jPdVZx4{if~}bKs}QkN0UmX zFy{fU6RY@A&3W)4vRHYtQ|zyB>dr!4n2+SM>Z;_e{su+-XItwo{Khqg z_|ZQ`uN!?Zwq-*B=Nahk`cMHrEnbOgAk`JuUm3QI8}1LiGS-rVwC175$pvCT!CQbA zoZ=m>h^fK+1=E8@=G#+y{x8q)_}Rvp1jsLqB8KeHzB2vz><$CZAy^W{6S02AadGJV z(T{N25>25@h|qoZ=+w?hAyo6Zw-bhi(wFHPqhwT%38c+#lGrhWEo3p@LS$gYzcbhg zPWFCq$`V4_xEsuXwSBkqMMRBg#~wE@@t&HMmt`O`;6mx4iw1z6W|ea@eyT5S!Q1cd zX<;G!AU`X3D-)diBd4L6L^J-SNA|nPNbGt+#4^zu32QvM$`qtgz+BF{H>ij$qLRP~zb4G}rxLg#cq7l^g|O); zc`J_-rjj&qdH|daJx5hu?!3&DJCF5nkhdeRhhc86Cu|)9BVt3l{TW$BgsXQ3?o|Oy zjGIP6lleJG1VQ~NSF)gF;WF$l>g-M0JkNNVCFQ&fnYdCR!$H(2UQbLY@W&&wv%q2y zPv2)YzbpOrLF?{5k>72}N(` zJhOQM?UAtwkAIL;t@^8*pw$D&Y$q%-e2`C#Sm~Knr?bDx321AL3?u`oQfE|0P-b>B5GI zxc)6*OpZdVc;KEr?8LJ+dN{hUg*__3j85M;TPK{`HBR$Df%Wmk8A55T9?DZCv0_-J zcZa6TfEvrLGI1cZdqvrQk!$1G8xxgL_GK~+zj>UQIBg3c?=BN}h~#5AHvX6^l;lnk z=pZ^zN7?Ncyt)w2{Wf0tZod8=H+gT@yEKAm(WR~tEF)LHJxD}+Sfp0ly;`Jj!l5fu z3k@?Xu{A~ZCQ6jQ4Ol2GnOAfCR|R}tZe}|Z10Zx&w|eI}{kew*o|F3- zml1dYKOSC3LJQ6Xa>D$FV1wvc^FAbylW{LI%Gh{t)A!f%nPAF(*atk{%#oScua`jB zsew!cr126t6%K93ke4bR!^oq?)w|z^{<7WoSWVwY9ia@fODu<3?*Ko`i`wr$RRrH0 zqpg5p20yDe8*&d4qz5P*#zja2V8pPlyj4pV>(cb}{>7H0<=Mdgzn-?LRz7wD`F+^d z7G`|EhCVs>nN7@B=wV-G7=1DZ&elKQK#Jz$0~3lvgQj=G34tBA%cWBCaGz2l z=R`_P`4X<_W=55DHV~V`$dbnP2DXn=;>M$I0cI`Ongh>oz-zYuN~;-4RUGY?yxOcz zBdg4;H9fwD&yw==hZ%$O^yq}OmN5%E1q{9@ z!^fXWqFi!W@;8m9q{uLUAL)7WM&dxNRt?n_BFUrnG&_bH$E0ND&303AH2;ySlsOWx z+;kzS<&o7a4DQ&==r$3Zy8emIPk5MD1W;3e&srjbexgDF8IDWq5?C}ZCqETCVo~?= zeIbjfYAI)YbD${8v!f9sVOEZ=5G3tXFjGkE*wr>lB~27Vq3{-i+0^AOc0U)nBPMce z2+ZojV+Q`U+k3~}z*UDLmPR)mGs}0=53M-$0oUWX)7*{SlFhI^O;Q|V zTLB0#q>3L~3or>_cn5o2Gzmbu$0szDC}wQ40qxaT4E=#&(bP70)LMNJ)}!aQ z_$i7BH2i>$f_PE1k&HonKTt@CM-0QA?y0O4aDc9D`Ai%NzSV1)^dcWvJt1Y`W4eGX zYRt|H2I421?E2DX$PH|PY(ARpY0z&Z`0-WK<)p3$FM8wTPS_A|ik!jKRr%~BoGOj= zx5Nhw+>=kkq^#MED;v`gEJyrG%PySg;^fA*mTI%3rMn`8%~QT6;M zLa!G47Pzqot#Vh^zFd!yF#9n&%xCfmc0eliRlofD@3PFc(B5$HmNoS#=YirtEEy`D zBU>eiB)=oEh={CZ^2$*~=`Eh5UijPD)?fTQOAzc@~0t=>fvG zY-Uw)QnqVTvXuzJDtp$YjY~W*kUtMu+Ax10`kBnH_-Eoc*Tx2yd0XB3hi^6Do-&}b z+bf$Nc8$sStMTuBPQiM{C2Oa)BKbYokWU-eizgnw!68Uoq4Z2TCzXPXAdSwe)0=fC z7&9U|E_%ko8`GDto$XA=q0Dh+<*TRh4uCv5I2DJpZOIIWW zUSde5F+8%ZG`uM$5vL9=+CD{HqA;u{k%wu8r0QX&3PPKpVKtxAz6Boly~V5YkQ(QM znoO{>6{KiF>`4#TyUj{|{m=K+XKJ%=op|ty`bj8>CRpg}xt>EAhQ-Ep;On_Ch9Jqy z^O;4%)*g?`dAIS%4iV~%-Wdjc`Qc!>Crqp#le4+U7A*;MWBKZ=?sTh9#*{n>d>H%5 zw>OW4IYo`slzTT|ru|pQ9`2PcWk7kWvq=OdezJMGG-b!Uzn2|fXsUFS#^3=96ud7- z&L5UP=|MABkl8*kZlAinKh8=mCnV0!6t3#M;s-+u3XL<>hFl<_)5YVxi5tuav=6ewD7@(Bm%-EsB z6Fz1w?uxZ`sQG_}l%0buXk`+N4@Nv5w=d!&`3DS%K&U3~`kjPThAn~~ukn+uUw-U$ zsDTYVroJdL`w(RCMT&EB^uh4${MBlHwCjZ2nTTTK#BRWFdbJU$;%va7esD9Kn`v>N zP}Pgfh^pI~psD$Mt&@UP0-@-4CDT`Hx!_Ma=9B{Y5E=$Q24%aCkPN6Q&_$kMhA&Jm zf8hI&HpcK+3{;aca4YKuW94-CgPQ8fXRT@j6xBL{9AQmExE$@R+QoLES`MLM3Lox0cPlY0{pg_e;J*rq!IIJp zn+h{u{PJVZt?%51VKct2Y{~XDeqnjb(?@ZsBs$<7=>*!O#d&PM;xA&3%3qCGyHnAT zyVr|acVUp+Pru%4hj%V3yUc~IBDqf{SMuEFo7&C}pldutlEAM)10 zvMWhn{#a%bCUpm(80(K};ou{PlYaN&B2mA>TFcKd5ujx}g!@EaAJLJa{l3CxmLac~ zM_V&uYYQ+ivCbIE|2izF5~7(Ua$`r?z(5rn5SIeceiFEiZKy^#?k!Hm+=>x%D@wG# z0~HmF1I!>QF=A^2NO-JzViGRnNvfXZ6fktoL<~$VTPk@*m;zd|Hyn6ziM)+k)E9k6 zo8tMcdUxK8@}TD=jx@0-R$MVybbV0;OowyhWt24M<*+zR7-RtZ5OFlXt1SSENuis7 z0gS#8_q|zq4|9Em&tS-8;7q8;!eWvT$Ow~Uy`eh|g(-fs1*Hi-_@8f#urH3(_%^+- zLG*!z0VFyMl_j17emSR(?CIjgpqIPF0ueHu2JXc>Y|l^)pLFX2WVAmKJay1WN36~< zPx;aFnKStIUG=sG1%Nzr7_Th-c6Dg2)*Z?;PV7{hN`GCPj{Q;`WHi9=DoYsH z!A=l{2pMw{P(m5wd4@i?$hvkH${=rBU@C9{?-Xwlks}#gA<31zD7Hln%Z48RaMVuD zmx?W#U%fon`DIW^YoyONvbN;(bqOQ5Ld=q1v-9f=A}069|J^&GqrR{-@cCv{M6I(6 zgPZAvyacPD9VH2IL$fLxoP=ixym#eXP?i&1m5hWLYJeO{0`-e{)@Z8IE`;$&9P+s& z6nuq&K0_@!FDG%k5eOGYhTr-2=#^XW{l9+5wQpVdPY^!>RPvYx`&;wAq8Zs4s$K%L zszVlvz-O_g?0B5n?IybbXUH`}8F&V4G~|q8H#75+R|?LK%(~RJ0#z}+!&~I6o|?et zvlXJ%P}9s1ag^Oi+VJT7)XlmerkVpvz=4DNG3V6e@bpX=2OC7uO>bJ9q%u&-n}QS= zDg>W2kseXhU~Ek;Fm{F~W~HwHzF&#K5$-Qg)#NbA8{NrCBnG63nWL5t0tQG`OeE7r zlvtaQ=E;YuBXE*e4XEy#n;+4ui*B~af*xQ2Qi|l>#4Q!^T;3tHA;DF!WW2!|^JjT1 zu%X6zfP1!X`K;<1{~cSgJh0VJ@AA(dZewqMXv?s0CxnzYwo4|Duxc=$jmqKHu=oD$ zn>&)DysRjT35P7sflT;R`@3e%pd{Ew?BIAU%jy8ky{bvhO(@aIRII|_%WB}JS(TP` ztpK_IzXJ=+L~!SE7NBwFd_`%qw@6_LY&G4$HKHEjx27|;X}E~X)O0bbA{t#EKEir+ zP(|kil3V_AbV?jNhDulLdP7`XT8<`SokP>p=v{ppeSrD%FmNNh@P4*NL!E{Y!3|AC zEE>+mEvwn?Uan@!b~*pwYEG15Iu&@Vy^{GC1dRrt1Z3`@NNLQlmek{rrgW!@j{3!y z9F20*2}*4Ts1Yl5g$E0y+b@X8Ck2p5?%H$;Im$cEMH(vV!6tsk->c?1~FVOCg6&rS*QBb zr1P_F{cZ?DG)f=;crPg@VHZbYe0@NB2kDNC`Sa@*nk5_zN&G(W@vm4}o2Jp4@Jc@D zUN3n91@dV@8z&NZRk#a{_l>2eGSdr@BAtNrr&&2O0m`wE;AC|vpWQRfKYCanQ>B5b za&U98*=!IrdcD<>x@3|5(lnu3Q*NSE@vi>!nIseD;NW0LQ zNPe957>W4V#L=m6lEIyJ|je|1MF$4={7=%QQX(JyNH-lMw zJv2cd-LHK&IEfjuoK2@f*Qup*6qS+kNzfl@lAa51cGZxNDYi8eyS&a41*jJlyrS{$2GHX6>S5?uU*@UFWU}T!=+(SdBt+ z=BENnbim+HNJX=xCW>R-eArJCCn79}hg&OIkV|y$@SXkn7DElIOG!N!0&zX{xUt;U z(RErguY>HzbP(fc1cG^96puwwF(L)Qk49T!FPPKgMH*{YT=T?#r9m|{!xtI7KuKYq zz^f8imP8Y*c-h-zp7`(TMYd{rMwxRVBxZ4v^|L`_Z)n34WTr6FiSh)=8at( z9}$(a-fUSdz6c+IFY%!hLlR{)YMpGspkIP1Xm7#_X!P}T>8R`_F{NdJqxUcUTD+{*^c z*MVH7E|WV&YaksN2_IC{9W?dOh>aWQjW+QW=IV@ge})iJ8$6e>)i*#sz{n!eze> z2zZ9czfb=D^FP~xh(BC>VMr0+MJ>Q{yxET8vc%f9P8~>_HFZR*^#*jXtmx(NiDw8P zPvZtSkXTX1$<+ZNZ}>zbvfax&OK&rSTt0?+qCSRSC?R?2`bgXP$CW;YGGu~JSU$%P z%_)$RuS{zu@#h4IJq7*BS=&wJojUNR7wgoT!pyXk5zWx66Lsgq42jFB1*dClvPXW! z#(=rQvwn+$E5(#M=zA=Boc@yh$yff>H)KtG^3I-!-Qbu44HFC=0M(;A)rf}URg&SJ z=8Y7@q(wYIX^fUqLe7&6QG9kib#OQi%ALDP+Ac>vFNYxD^REDi;o~XLPBY{iSz!Tm zpUy+vIDQx6#tF2c22Q+!GMspyll1PyP4t*Nj(Y3oMe?`-6-ks5u0_s`<0F0CIBo+1 zUSH(~d8=#OPBuq#EI%^WO$9)J&*K5mlgWHr@K6h%Hw^;55R@Q(a8Y#Hgq>6k-}eXb<$VpG+vC?(VSE&`Yqlhn$oWr&4LWl$)MM} z+1>fpFh-+iM!>)5pSU>V$6t&V9M;s>tjE)$p8HMJ#^MN^nJO$ug-xgIa-NTc?hhfh z`~qOg4=uGGpE&s39z6r?4(xNuIcu&MJ@YN7Ydya+l3{EA+tQcVFDcE>e?e=P?*96N zD;u3m5yF#66|Vn?YjD@}dbC;UMsW(#|J1wM#^?bR|uLNYRH zH4jlEFXVHEht^hv4&0uu=9O*kU98uMWhXkFV^=%KdmVugf$x@~!tzhnt$UA7E(5Vl zHO-<%njjgD^8xX0(01tTot9bDAXoM1S#l`B-7@Y#(MdHwf>EatCthP$bc%?L0MNlS zMb$THXaR?r=)5|jZh^RA+yJQpnaBg?_wZcQl+dwL2S>&*DS@4%P)KXr)dL|1WBC6x zfYOHae&!D~`qQQ@kNc6o&Hh%XT^%)hD-jvU;E(Dr1G=yO)k)#v1o~XpQ-i&Rmd@}P zY{|OZveA19HplEom*h84NNCF6OmL{#p=wu)wb@%dXh`jt)~0xPFiH+k8Ilm2k$72Y zX`VlJTc4WvtuvT`j1Z4{i;|BrO>YEII?oK7`(kfhd1KCZi!}ta`AcXi1YNpr`*zjE zDPMqW&dY(zygT|@*mtW|(B_w9z!hJUh$1B%UK`8bO_~<^uG1;^s&8Km&W_lux9nnk zq(=*ToQ)IF$XI5-Rw-<`jx#lrBUUKZh^RKub)%rH;lkzasdQ0Nqpom>0{Rlhkp+K8 zB(p_%qL^h(voJexxPo0)Vh}@x57kjy`4SGLCGT1&31;-rw>257h%^$m`} z2Tv@=O3wq3ZRq~WKP79c`eH8w2E8&Rd0^X|S34vcW@V+!7pTGSutW2^d$FO;oe8`+ z!d-zIqvn~Io%2*1XXl?zRQicC667?*lBy#Uc?=()f;(Jnb|C(k%WshioTe*ZEnFY& zgP~8q_LmDO*Mo!mpU2*e1=Db$7={mc@>8v1R%ejiUb*5Q44N?T8)xI};L1h?ll=%s z2b@XBDY+oBOrOW4rFkY@0Quy@7P{&A?&{G~AusY1!{cYUNy0Rci0^DY76dLFiF7&h z`FjcpHHsx6pt~=~yRpCP5uUEDtHk6j61*-V@Q?Z~w4o^|WT;`fS+dyY;xu0NKKHyAO!#XQcppaDNdC5$}P^r!c~ed^0<-tSoY+s$@X_|tE{ zOb?8-&wJO9?mjbd6qO8_sCNzS?jEDZ?~i?WSVbuSj2VI;eY5CIV`WX?Enb1QT1@P;CXfZ%7`+Wg{`_4F7x~4J0}&gjcpEqVa^Oianx%Vb0qC9 zRlCll6(c3`N!JF8MK<$!*4M_HLa&y_7oEfneSAAA@v^TgBn18@e&kfCn=bstUYP9R zVeXiXTbq!+7K;s%9uJdw5O(h#-h6#OD(>3NY3!i|*bvU4F2f3FJ;$;#PZ z^2|5_jvA>y8w4t>GBvy}n5>aFPmBmxSj_{FN6qu0b`m*6-25}2dbS(F>@~CIi^gc4 zHlmqnoi=xqA&Rx1_-4djiV`91#+MC3bBjULB(`e^e3YeKY(#4u^eDaYZ}Tq2RFu%% zSqmC!M(1*^O`wa{6gcoHbJaf-$rfL@vqfh=|1)QD1}e4Ubo!ptzcO|FNKvt8kVYH@ zx@;3mfaNvYwt2dgGUY-^B1{>-xnIh56{4veXJg{ z_|fdIW@*!c!CgtVYVt6{Nf|6}n=!-bni4*k@tIs}$AfW9NO!ZAN)lhx8*uf0ODYa% zK#vSMY7HvbxF6lgE6-BOtC4+fG%Vp4Xs4SI6()&>En z_)Vf3o0k2WZc&7iVszj}ns0huEx+(kVIn$dq8y^uLFnFu!ZH2s*;al2S@`3Z{7D#| zySYQ%wX(4oi|@O(paB21KK8Y%VUhb>>S2hv@As4K3F5ORRwseOvT%18eLZGv=mf>;c+btTTh`Ul zmTq62jWcz1W_AOPKDJ%j2L$5^x0xIg91+vpD%$BL$(w3=h}`{xYBK83irsx;UPR0kFD(7focc>8t;zNgWlBmVh>QL~ zjX5!FECk|9=I1Cfsq;R8rqL|D+EgL{ zH`>y?c__dY4Tg;e}DCdrEUgmdqdjQ z&fKpNg47BR7+9?(DKI-c=t8l|AO=wpx~oCCTN6EALSCAzVO`XQ&+?!N-4Po3+C;jN z3c(-|35lagntCQ;gw|Oa;ur-(ghgM80pMIGkY^5_943Wx z-GE5tTuD=S{A#OlZvpO*4`JNid-sp#QwQl_eTT9FBXIny^#{+jh@FG?3P)aNj;@BM zG+O}SA`&yh%hmMIV|y5Z3^e{KTn>siIIoZqJB^0ADzX@C3n$ zWp>ETlvO(#>vd*nQ(Gm05or=kFP?&r8$5#Vp+CASEDMmlp!zT^KJy&0y9Ez}v6-&| z!QY2AT-q88v1abv5rY~nWlX)%zk$mOTReOXp5a{F zD;T6>wCKB+w?bHbuvo$T&r86Ea8{pLjaFl?U}=MO9J?=TTQ~bBlt=2PX}br&Y?#KJ;@I_z`4}TT=G|uO1-b$w`*JS%o7MtSS$H9j6II_`V3z*g&Kt{ zw!hS6z}9)fKl4(ssE{q}UUBrY_4A#CATwXt)`Oc|Ts4|zoXmED3Sx`>JkiXhrm;_S zxU0&Lb}4f1e0H!nB~X>mBoM;vC3xMlB0wbI zgqmRONprQLs)4|bXA{=?PqHKjX&UPnW;~A*Q;f5bM$E!0`cRimg&EP&+saoyyDDNq z`MwZ8AR?_I))gul12@X0YebW7@9n#1EJpt82!;)BLcN9H`ZkK5V)8!}v4#r$t8iT} z7zhZH61R7pgCWzrZ}*Jr$g#M6c7$ZGcO1SaIHm51yAUzhXcS_S-AX`$5Y(RQ%oXWX z;a-X3bTN3mMHXLyg=1;T8UdxCe;1@1^~7_nWFhoDL5wxPE%B`6NIC8tNg9PTMZ*6- z88e$invR>=dV$1)k$zv+LjtuEUVOno{1noR0P~`015Y>6E(iNkcP$6jDdIGwU=%0I z=v{n>b=YC{L9FSrPnb^_exzhvD2sq*{9^r8b1(A<^RTDHuLQ78*&|5lUt;AwA)0Lv z8p1-A&*m$pm!g_nvj-jSWrA;;3}tHaH3P(V$p?j3@UGyeENW(n5y&aLhEIb{o-lfE z8Bi*nONr!m&>BX*VTYtSt^L%GCCa5c@QJYC*FyfF|KwnN|E%p-M6q8{PKI^WdocP| zj{ zHv&K^BqaSg+t8=QOFZUXpKGoU_m53E=c-vyyi+*&Gas&k7El_H_vI9v6@R~~ zEpBpjw8nU`T^UFaK?t5U@VhIDZ-x6xMm+zQ7qr7NU={?q_nuVdo#rB!0O9X5Vq+n5 z{Vi_|lRv`DWB#SKs^!JCGqP5nWoJ$%!b5Z%+qlJ(DT? zD__6pQG9noj!)bNmh=;(B0cZ9R=R5H&d3*C3FT_j5T6`B=UW*L{%}(()wd-wb`jC^ zrX+q@MA`Fk!K?tkt(z`Q+nUbwI!=B5G*SYm?jqT$@BxlgrW6!ocmmC@)3q&Uka4`4 zGZ4(yjGiL@zKger_`}`M1FC?Jbc{y!nTpGcd&E}+3Tc$0Z4p7*%VEp0T;jE!u8)v4 zsE$3w$5y%e@4YF25qW;>3P9eRQQtsF@Y(;$TlgC8%2Pt|Y@TC)jpDvo6z#0XEJ;3J-?nFCiSysRpa zyAOC_nV`rC0*6QX9J?E!6MZaEAQSifc5Ko90GZ zT4lR60!!0`+cP2Qv?yVJ^&sn9fxs~S>gQbp%WGwLcQ91$4+dFRblHRRxzQ1L>UD9;Nm)7sZ$-ljnzd zmcq-$c{vs;`qIx7JTbQJC9e56GVTaDN86dZ@=J3dwv1)U`PO`G_E+~Nj?BkatRoE< z0^Ih{Bmr10=aXf6+~HbYVsMZ}tQk3&m+x`fce0&&S=W6vJ8D_J@ki4v%j};^DrPSn zHf9J^%;^AJvV@WfZqFjJTr083L_Ja}mjR%(@fo)Q>k0$1o-3r6C67|3=t16`qu9BR zo1i=jkQ+#nUJV?Tjyh1-lSp2@Yl#+n(EE5tD3Qf5uln9A%^0_4jgq4JSp6%HfM!Pl z1zm1@BYDxd!65)16pG+0E+`^ACNo#@qy}DEp9zEFS#}qpjN#K;UnLk@7pOo#SHrqM z?TV{Tz+%M>+)-v{t87$4<-LdNBlpn0+yp2CjS$Gysp&*IF^0}+b!HM0SOwc`3Qh<- z14;dk4u(<>V~ZesJ3s~AWu|R;!ZEsGKnWC3+JlFJMhqREDG7pmm$xYXS!ZY|nO}I$ z4p#yx5z?cnG(ZYFIk~gZo2*MHHwA#d37uh+i}HLB1f=tHu|H^x)%(+l{S)SXcJr=- zk6}Fea;&4;)c3f5Xnw!hL|O^Kn)6gmZJz_CBZv(Ynxr!^WVkul#HNm<^2SszV;O$D zd%04#OHRaI<`i=6-dYN`*Kd-~yoWDiKZqZFtgN{ufOAQYU{ooKuEYMm{*mI%x`PY) zRFe-3wwHg8qS%!|`006bHNBvuiatfJ#RJhLPp;k0HqN?IhV!j=ay`7cvQb*TJbMGJ z&t$ia>F>z4)L*K@T$+v_-&R49iH#ZR zLOE#%@b$5dxhI~^H*Ag%){!^}E-9bPST2bW5caRdVFA+FDKdWl&;IpT0vOrHL6kw; zBD*57d=Kf*he9!qkW3CR0Bs+Oo#79*-aB~o_DsD}_@*jRVvyuX5n>P$S%C`e)ml1A zSxB%dl92*dWhw6nc!+YAh@$312k8N^X#A;c`8F}*VIC;hUKl)OYI@~ zrLJNw^yaOV|DjW9an~;uWTf9a-ac5J$v+E1Ks$0P^;+t(nVgs*A-75h8@J9Fsk97!(d1>ouX`&*~(6foot({i9(o zNhQ1XK=?4r@$YyR9q6xb6oae1TNIOMv(aCn96)$9Y>*BpIPY;JEfP1=_YAOo;hy{M zCE+363tIxo`Xrqjm$`u>!UYKCE#gLq@%3$6%WLHL(rf<2aUhrJzW&8a=6H^9cBeAu z7w19A2nma?cl>?{fc)-*R>W_HSAtd>xAtm%?VB|lwY9UK*-P_uDJuf{-3ayt&@V}% zO>02Rb^V;H*BkrQF%T8ME_6??A~OGa5wtbu-AhKJI#>-bQV+g*+oos2kG59=D1#Qs zvkbtm3`=ZjiSIA)AGJgWlkL+5?aIX*VOr7jc9mG!HmpNGx2FC=5WuYHRwI(}xTz9YuY;*nsxbCSj9|IU zXdE(1bwOGScu0aC0pvfS)8^1)TX43>;@PiQwVns{$=5S)Qxr}uxX|vVB$?SK%>amh zoO}RiBes!Z!CWJ<%W1i`RQ7-60W|sIq4$J2ufq)+g09FW3|4oSr3o1*u!~#!9osyG zIS`3hp<)|`o34n4b@~2vAMrU9Kyi07+r|j1wR1u@$h)$uNLU`_Nf_>BD=;1!L1Uxw z{~U0xOA>B^CDl|3lG0OZNsYlGg!ePwsXXn&QQb*C*nh7)WokU~8F?1ec?k`$5QDK@= z-|T8nh!}s*yF~d8-@=KDdA^PysXg1fi6=Od)ztObWA45d%8D0~Y%P$~1xY z{+de(n3W+6q^ahnj?5Xz`CmuSV)lr?Ryu;?&{m_$D}l_~nV860yvRTkg-tx<)bzf3 z<4S0GGZujVid$d%4)?4-h&^l(xC=SKjQEb@8GkhevT#1!$eCjUgd9Q4>eAi46c-f0Q&sh6esvw9sTRW! zl4GYTG0e`5Rphh}V3Xyt9x?7jBAP}Ren+6I5(G0XW-I?Cob5$o4o9C4-4~dqoFeE) z)ct>=@yg@^F$No&dSCZ7ngkHB3zQlm=hs1$wH8GXm+-jxrgwMq$$!4KJ6iP=&hU#M z;%u+o?Onq^%`RmyfZjb^K8nlS+-I06}Pm+Kk$FKgT<(QMflaq`Jem z7Vv=9to}Fxh%K#P!i9;qp2dQK*I&Y}!S|8$(^or3(wF3#0U=oncJTa08Vya9#Oj_# zxy}4_ohSol;6}*5tn;7(Db#_WX$@T;xG_#+{QIlvDq{5si@VbC3fIz|gD(@7i25Sf z6Mz3;$IJ%V-X!@$tB`LggH>_i!??QL;> zUpnsr^v(bNOAj(YICBzW4OG=PGNtJ z`6{NubmfutS6&{RS|nZYcxDD4ewYd2stDmN>0Cx+>KVg*Yz`I{5Bjyb;{W*+{hl?h zE~~3+7K^H?kz`>msXC#d$EJY(7Dn|{m4N_A4J*v-waOe>Lz0(qW zxG90&NW)H6gHERC}eRQPDhSh zAAv`HUUH4c;@xmLkAwI82c&ua_|*m_@SBCGH8X1))#+yG;5Ful&n84Ffro_B;QX`h z_5$cO1j6(f>H@haMj+vn@u|!(i^1Mpcn;b7?Klz0=J_)CMB|sEk3vwaWmX5iS;@I3*9$8St!~67uiGwAx zR>vHU0cu!9zYmMe(1S?lk#A& zpEQ{2n!PstIfKQIr5wMc!f{w>N=ET6Ddu6Wl_wN53VAuM6#toK_dMCWMR~r{t<^c3 z53GF)EbldKcFEbXm&G&p2u)g?=?B?-P8+${+b|>LR>tjZJ>E`7%PB$an#XLbA@djz z3v;Oo=5W7HthiO+KLM0y>KWcNQ|yI~1CPJuC|AJmvo2}6ZMQFi(ia8Lc!a4U%=ou4 zt?wKCyyYSTGUe2E8pawna7S1joDks${!jnoRdz0#Rlm<>jY+V$76p!mZM@2sX~t)9 z^sJyv+?EMkQ}0xLKg;3JxqXgolVwHeP1jndXuc}))O>!o6Pkr$G44Eeuy1&f6idf# zL!q1z=}R~*&eGbH$&S081Eh?^<6FXX>8aldCR3Ps`35<<&&cy0Yxmd00dr$YoI9Z`>Es*Kx z(5sz3O&Q00L``YkYV}8XN#w-p}#+U0y@1C$V4y{*!iQrALxfPAI?fc(xkO!kS+aISaVE zrv>g5%V)Cu*Q8K<*YFl~J%@f$1_Yoi6)SM~!Y(92z+0wbf}#U|$N?Y#1VP}7n?=t2 zD+_+?o3C`-+|sE$L^o%s@ZqSLED%tNZi-~u;#2?f?9iTbH;>aCG@LE8CBI`Q;UPPd ze0BObr;k4Ubm4U&%19rlFuZ^M>s?Fma)JA8OFH5D&!JpPlJ(bABS}94dc`Ay6Pfcj z<(H|63#UPN(-0b1wU~zT`&{R?d;l&8nX{B2r-HZKyj0Q6y3Mnpk%d=rNJo8wtioK} z!TW4khBPrtf^{rYAB2-zsDml7Elp3-$}dXs4u4u=Mc{>z7>U;(A`6o#xZLD4a(xM? zXjp^n@+j$1(PrpB`)$w%`UUE`djN?@#tH{KD2BcRUaF2)bvwj1L1sxw0rnRTQMqs# z4TQJ4e0JnJx<8=BgS_V79$A(}5~(vXze?K_mN|Re#})m>-KVlF1L^p~jJ~E5 zz*CtlmClqWfG3`|(J^+j=+R0&rI*eL2t8fbcls-Mp$mN3>goX;k-pRVXkVzpLM|&m zzV6uct^!&y?HC3~9phsfuR@3ZyR+TR0K6UuutvlnZ7aN9uxxV7q zpBU`Ia^b=I;m-IHfOL+O>v=bL9HW9fA^0Tw(**3`rc|A*SVt17nSX zEWe)kI1p&=-Hd5?*8S8T|H%MPK(N13aWkMZo-;C>Pg7TnTX-oE8U3lB7U}@P`HgIKbfen2hE8S}WKr#rd7ofaJAY+1TMr8a!3oWOnV>^mbRlXJ|t$TnxTZ2wFO^#`v-s;?e4TIwi z->VbRdkoLHl5v3N?ur^>EtW%}V~&PjBskJdf*X73S{EtHZKbx#|=pfgpXc#AU^jV4w3ypRLslql|(*EZahs+WRq zt1iziB{9Q#Kr%##q93?(JT9qY`R;`W)8GvgOY-E4yQCVB$-~JiOSx!()y6s^h7G0fJthON<}#8v-B#xJxKT;hxl;OtRRn%Sib(wM;^b|X z*lbn~N_!gxLJKo4NHaZe>S`Hdb0~Va9D&LYxA0ZtV}q&(+9~hd!LqK#!Fp}uZ{U2G z${~$H!@kbRS-+5n{Q7n-_#HdaF}amAet~mybD0{FxC($1xgs2dA;K+vG?}+4PGANt z=Sg~5+@;kSnh_exPj^78)<8}{g@&tm5y;ihDNN|$H!-a56X}*Tts7n;2kv=E8z?3u z((ogl6R9zjh{<{yj8EVMpIBSX%yHhDqdP3c>lA)&>^K(1A|0po%zNjPt0)laY9DWjh-ZjYW^{ z0yY3D)RIDm4-lW%zLDdHr_bNpm|;22h29P~vuYw9M(kMRKmeUjKJ!GeBqq;1(PJu& zt2YU#!IlP^IN;I0NPyMeQ#l6~<|Tz#a0jN*SLh24SD%#x=x^ax0Ubaxxyjm@P7pT3 zPyJLfbm6*53DG=m5Y5azyTq)VR{WtDqW5_^5EQnB;bEn~)0X)LPJDGZ)V-Xq zIteUEOA8Aaj$@xdbc=q^KPp4o%Z2!;hk=&Xu)c!?H2sbcKDj0|taousCZf+7P&`&= z(zt`#(t-kbxO+oR;B+JzWO8EwFNs^ESA${g(iAw&ry|1iA;Rd?BFEyyLC#1FKT~po z#S9-IDa$=&pAouCY%-jgw>%U0NPY#hDvVN(|D011&jpjV9#sO>q}vv?oWXq<5{>CF z^eL`53m^N(DO(Y+DzOt{@y83F--=Y~RvO|>SnQi4JtORl`J=BjpnNKxqN~UHYIoC_ zpBBB@6$(3xFUQkW31Mogr#Bn|HKy^Ncw#8TUkEkAc#t0EPUK>k2H6(J?%Pe;Q0-97!2~fx9f1d#-00A)@3^H& zy;!vFD59ZuyCi!^s)MZ_qPo-;AgZWpEHg%gAwJ<5*NFkGR*zcm&QPBq5pf%Mx{e7R zB*6&ckwd()dHMNkqR?q3*SsTS?j~}EUgyNPPkHYLvkO1uq-vns(O(fC5{B-Dg3TsIu8mm7>%?bfm|2}Cd~3ENc)M* zY{@BQObFSFAo{LH8-JnaDS|ljTZ4vwWV50d_{^4j2!CiN^s6-bazv|VkFa-|y1-A2 zcdb8up4#XkbA8BzUTE1+*e-k6`)qw<=(YxLI)WSQGtmxBN00jjmGq1KK5h0>Sw=7-qx{+jzfGj(a>>cQZP(J zRhq-yuCh5l21T>5E@Cwu3LIUF@oD4#7se&?lyH<{>N5800aTQ>o>GJ~zbe9x!XJ12 zgg|AL+&k-hb;t~zv+>|T>U|aNax*WsdfP3>0qA3OZ`@H!l~H1;_cAmy@v;dwVz$(A z2c9r{nX`hBzP4mqOG3UkZ_X0Oeu_CjJSn%2l^;s@G6~Lzyf9+KPIw;f;{5*3)Izxc zVsvNfX0A>5gU{8`qL4>gg;sh}beS8U8N;dXAu=U0e_C5d(<&V=Tx~ha;#if1tz!JyqE=?JBQou+)2lc1@$$ z=wjB!u5Uf~&N7AH7N%Vt9s^B$ty~Xb9ld7qV&THWZ%s0KlLX*KZZ}ZVMk70}s{Pi9 zN1MV}9c~>s2tv#;T5>AcRtOW#f^fu=fx&8MQnhqv3z(3jShl;jQ2XCw@i=3_guDIW z!DPD^8*kIJsrg5SoJOxYUi`ZARwQ+Gf}0L+1t@l(T74TL_Y{!o-1>Kx0Xi~(&Il0G&5?#&M4$hnudRXNksbLu8z^wV?LbGwQ_>~^tv z=%1AL!Q*W~oN!8UGghJt zcR+uUDIzGWse^tv$7Sq;uO8JV3eLh+70qGCg7DB#KHu!db84F@&C{Wkt4M{eUEJKR z4Wl3cNeS6Y^WzG6Hb*n|NY*yGEY7t`96*al_AVbnOxo8db73X0anImJ5dJ7Ri5TEo zmjJgVA!M1ETPMGIHlK#xgUZ4M5n(YzHn&_`w;AQC#>L9U2dF$cebP?6vCV*wjF5N- zU)iXBj__|*ah9s%8(b*yj(w_B&tMuv4(TS}pG)l!w5`*nR5q8(9^1ht#m6M>L>g)M zpvpO#fjWHI0(}Q0VESF%(U2452bxon)U;VQI`rsq5q-5|$o2MWHvtMi1h&#s0pE~> zY9^O1vu8AxwN}7m8{1?apbAkELlMqPNk2>#h|*eto{&Fq9pRI{fv}jhN+b!)o!P&3 zFXX^!q=xP@7)e}8`0i_IAjmobz4kMF5M}|0LjoRaFjI@Kk-^J^l}3Rvwp#qJfmX@; z*t64x#>hMpb;=tH$AmI0rBz!PJq!vxXI^5rXmL#-T4&iX)$r@zbZc=L&XLO-aBXSi zsnuLoy+Qsjs{u0FL6Bg?We5{e3clKkly;gwcbO~0p}pXA`c3dsNQ)>-+5I<7oN}<1 z$tQ?J@klyD`;XWM?d)<^mDgV`h&xVKYlk-Faq+xL%uf^u07CH?HB{|*q!5<%aW0FS zyH1gFt~Lz|-u5fu8JU!1``K&p;MpmhI6uPl#a;$}d|hriv!+;k1VO$E51cgYk5V8{ zW`T5O#U}ZymO)+>t&-`pOd5V z?q-Kil3Y3CYF)98TwZ08H3F+hb^D8M@^A{#3uQZMv0C3KxXo_YqDrUxD z4PAS9^f%3>B&~CAbv5llK2uI(BB|Tz!3u16P?8PC+g<5{bB-JJUvxx2Z75gn3We-e z9|9*_Y?aN6N2zut5~Tp`sKG5elOz*uhtR28VrGdQCh27Hsz&erN>u*4WbuZm8w(U> zl~sQEdPU{9$62S8G7&}B$f2Fa4;$C7{#B=~Obo;{`;)E9&#Em`Qy@i1s%pH*wdOmOd+gFq2;>%5?+n-A8v# zUv3-wPgj~JCIF=WXlh#<*{2h~DjFt-hdfpW!koYiqH$?=GR9Lh)NKaM*3@;~deOK# zbuN?XNokG2FWYb8dD_e;041795rOVxqP40lHwmDWq6h0%3pP3kodI2aW3%^t?Sf+Z zGG3I2Ez?pKGQ)+^fg&LF1GxfnTFX{d2XAVtYAI^8U)~pCS_0)7fRWx`*+Y9T_iDqshg5<6N z=MAtFY(7f0d`O5Y6cfWqYpQNK+6qV! zGF16+Vn|J@MnVBujtE9ust0w%7-msem7UCdfzmCi+M$dgquGfHqk82jWGbcN~;-f-UJ5|F8gqLjIgg$>6YPSTBk%%G?&(I^lU(Nq(jX0zt-%uLPC z+>lbVJ_!_=pA5-F6_V^Sr@8313jeV%L}jx8hfF38s*y@wL1+X6tmwD4O!0MqsiK0z zZ&8v#tjGIvFuZu|n^@7ZI3IhSzC{)2je-pX=~JUsyIx4KUErbJZ5RJEUd&WfE zowL%SGg=3GrUDG4c-Y)b+?E*X(K1L>^!vL_r6zXFD#Y-#~gMB;(}2l8HVQy}&CaK|mi6kL!Z^aWU%eR!sl z|5PFrT|m-ND!MeWoe8&4P`5C!l3-tGRk8}L&>@J(wo(hZAGzhz%u1jTsR42Y1YCZ| zDVGgfVzAXhb&fqlV1b|`@InDRXA7wDL;-7D%1a{v|3%n(F7CRG^vhq3uEKFP?nxdH zr4cF=3ojOipp$g$^P!}}sgOpe9_sRLPKp4*l;%)dkmpP=BT$KA>^Z6lqO8`YbLUxv zU|?sOJ=~FIy$|0e@mTD;T2gYMP^KWvVMDzP1;3apg+xqd7;AokJs^OtkF^14adJS= znZyomBpya&OXb_Kw2+}Ij~xfND_CzU1 zMp3BB^Z1XRJ`)m<%w;#$4AZ7WDLzx&0U*7lk?<#5R1P#HkEqT-4Qm?+(UyH&zPyP$ zj69msCI6dv2ZvYfAsgpL>odM-GL#9l;;(5?+uQRfwIhbhx7f2%$DVknBP_N>m1~nS z67Q5h3xAdMy&?}3JX;UA?)06-HA>AcXWjwV3#lIIU{WHvvxm%|lp!-dVF{WmZ7-+)83oa6Db z7)@sKL>Yj@YP6F+Yh1TEv3am``J$>@gHaHW(#*0E5yBHz+Bf|daj@@K*@-^$)9(DZ z$L(dC`sV|0i-5(m7XM5i&QMpM6b3Uh!*zI1VoO@|8IJ{ZF?c@9Kj=YiP_rJ*oBaDT z`tIV&cta!?4CIrFZzZdJuXIeTx?flldSE0KbdsYFS}7zA+p zU|bMm_`rhsQ5v;y6r)kCEt#nIsPXJTaI@S1M78x1o#&M(>Oe;kOXp!H zg{sVen71v3YHz^3SPMD5S-E-8_jlkBS7O&|LU8QV+3X;- zWUu)PYU<_5XIOxkueW;p@+7R`^jXz@lS~jhU3&GwR(sL$V6eHfl564{*s-9e*DmU# zU4_HQyjGz01b>6);+j?;V)oHGte=VM>VBei%ood8@nMf(0vO)#SXK zf(Smm9Js|8OAaIgT+ddJl$CWr&M>2G27JB&fXj^Zs-*aMGf6xTFeHC*u?T#N+| zlx_v*rhixgtBYoQVfL&VA!K0YlA9LdA)Z+N_Hb^zB@)TpOzrTK3 z?LAj$e-Q>(j=lCxJyn;L4nL1Wo6SqlnJ&d#*!DPJFK~S%(g;yiMoja^@ui8X|L}P@ z-^=tt7XjzA18Af!Y6C``hhLr;C@Q69&-+xlHj8{nV^Bk8DI^rxh=vWd8AfdYU?8qE zS6(h~`;CoT3hulKGtklV+;7?G)jMm-sm~ucc<6y|8m1yI`p5Yv_N@Q)pTRd3ug~f5 zjYVf8z*4ls@u!@<`*jnns)N~2LSk5oOCG}-UEG$L6P5@iDZvlN8?~=FR6un^Fisic zGT4Exy(6z^)*we#2fUS$O5BK`9F-BjZ2r}1GhadD*^Xz)9GwQ$e=}c=CbJ&)47k7u zM4eOvqR!beD`|%5kHdqdE`iXgo5)!Du1wi`sRkZtY^+`Nwe}I4@ss~j6m#Erk2PP? zul~Q1C^Hd;C(jT@*pF(frZf!0Qk1so(?v^mM2kCZw1M)Sq;a}){iscCp%aO?nne!l zc5pa`q`8@46=oiYj6VKZW*O~1y2Gd=c>;q2G*>qyhUuhzZ=p@p3(zVYRIZ9PUv z)js0AV1{5%dprUHj+ej(p%n->-7c;b5*@->&G$=-USV`Cq(kZuf{f3B!f|e_goc-& zVQlhVxW9LPmE(eAU5VEni0Fzdr2?!mWe2`B>%@Th=MIJ|QI8J+X)$KXye9AeiEnQT7Wj=H?! z4-8-_>hy_9rAk2A#hX{XS4D&T8Ng@?RpYY5dVL$T0?)s!2dWlcZtozo0R}bzu+# z_;-92=pglvR>PFo@HAuUL#$H{!cn>xM^d#mk}WG)v)h%Y!*lfdl#M#W!-3Dk;a!Od zv#=BKp5cYuA`)q59BFr)0s_}Vevh}h^d3K9JKG;U%@|w>SxdZTZcV7`N7V_n1(|x@ z&YDB|+&+~o0irlIcQ}IA&oR8Dd+rK9%XHdBU6YT6)kSN5efOS#MVtj#J-Q|Jkg=?q zVn6z)HyV_4m(hW-u#Q&dWnfHC;=FgT^=A`?krmwP{1=vl$1pOs#gD@5lJ!7zDdc7~ zCecwd6h|K(pH#TYVwFm66~!k7TwEp;o0u+yo`P(^8D~~t${vl3E6I7?X8@SFWR*d= z!UEv$v>yc}rb?2KmuSS{XxR%;Ih_r0Jt%Nr*GH+-hhi14)we{bzaXXwT1buOA>IxA z*Q=*zVt41J2W|agBhQp$;2HP)A4|?mAzR$MykX<(n0b%&xKBq8!QdGA~3E;<3qM9+!{RTltQ=g?s!JqCP%oy`-kK(P~Id^IP4l-5VRKDIje~i4v`) z5d-K(CGkE5n^o_a>q>g3bP&LssljS=p%;%*1g7y`B#SJ2|Mc%;sz`#YBuM~4AJAL* zDL9<)C*&MZsBs?T>FlKFDI)Lnd=6B_G*ke=I~_v7Av?@SAv>T;v6X>%A0|mv5X}k> z5kIkl)#O4&En6?}v^m0i02<;1hQd;}I3UIiP>(nJrf zo6eNk7kj)knixvWPxBj8S3Mx)I4dHL2momC{-_|bX~^(==nqeZuF?W9 zNc~7;6f>NIY3GO&K!2Y-j*e34`Op=FH}Vm*feJl6axUp0)&rn1xWLgkSFXccyJ+y? zdY>Ta^7iJua&yff{&G`MxP~8(cilEQP2)t=XsWw!W%AJB#Y*)2a}!Zo1WW-Ov8ip( zCfQ4w3os2{x$kA>N$|ZoO%BoIcWK+ODb7y={-+>Y9cuNImnm%fD~aWc=hBbPHkRM~ zfm1QV5}{eEw|oI}bZ-TrNogOtI5-|y77{mBOcGKKuH8Qs;N+*tfqoqkSHc%LW}Q8v zwzZvXdKJ&~4a^$bS}BAlnhTf6l6D5yln|pFUYti_4_^5Ip#A4vBtNJZupgc1#&yy| zmv{eHRo;3@Ut>er?@=T%{VpKgKcZxnd@%i)Qp|+l3GUOzM7@Afidf@jc{M`UAI(5A zuwF(S5uR?1joY)Ml_;FkZBDfoJGodB@ZyWyEq0p!!EUoPw#xpmHXs5sz^6Ih`c^^Jhk`EkdaDDtaoHSFsPg)aH6hO#MWU4zTHE!JYaNq^|B-2m4e zr%OXwRXbx5eIE}dMnn_q^buK(WPAZDl=`Ke2wnW&3G++c`LpeiMeZ1fOfD|Oez%3D z@qRdXfP;yEtB_(gR1_1QG{lpI`t=h$$=8JI-eS;8m*iOcc39!nuaOSJ%r`blorltT zj3Amkh#(qNqtC2*>c9uoOwI;E5tKJN{C5x||@Hdb#Uc7)eluo6@ z5vd2oL__eo34i9@;z|uKC*S;#{FLl)`wgmospEOrCcXBEeU=-15;Kez;jYU0_`Vd< zr_Imkw86-u>bJKy@~0nOpj48H++DYnBxgCIOviD_hk6-5(e`pqlZMyU0&Wda>}Kx{ zyDtalV9xyy%K7&%ao8@N-Y6C{0NpouOKHBWt;1^jc=&KrXr%e`mi-J)3fU=RvA@J% zq0wA4)6D9xk>oS3E5U7B2BzpHk6Zqr7Hg7MwzkD^gaI$`G<(Ji-5*8LpD1GLr#{HD z(>J`uA~w`TlSIoo8*KGI^ov0&^h#hc)#|+wIUGnEMzkKO!DoZ@>H?(m4whDqBT;1=M zRV48kCWFFZ;aG}KgCWhFQmGJ#c+&+H02F$9-^!iVki-U7?dQDfuO;rkvs`)j4*_WB z{@HZX<^1x!^5q}AxjI&XR2=MzmTBGs>-ImZe$x5Ho!@9|DYZ=g$1>Y&2wYL7og$O= z76LVQ>~Qs<7D=cC!!DjS_ccelDtF+jFA` zF}#iXur>aA!nJY-XWo6`TS3L}R)g}a1FpE{V2M$fr9ft5P{x$`&ppuqS&(YwgW6)f zjB}V{qv7~9)hY#4ZL}{M0%KGoFlbRsAGa>q!Gqn~S3y&2Hy=ri7GvpvG z9=9h<#>7_&pI0D7Ig^&;*wpc=Byu?mQgHZ-t>7~^?^1m<5P!^zuRQ8p5>FU2=Z_gG za5x*j|7T>Jha!^CdAwD|noTx)Js$LCdVENmGTzkaEarqygPJl0dK^ocg+f}h_Ka4IO9SO_*oxA4YcZZG4(v!#-# zm@O+QKbJBF8N1h%o=y-_Fzs65u96|aD;|miY#}-p4yz~WDh2u z$$hv}{#jKc$a+GZ@cEj)NRrDagHx4IeN;%peZ(8is;+^=tn6%w32}c{_I|%FAJ}>6 zJB6QAe(%`!-IUbIN z5U)VtPdj!^GXxwy5p=T5?WqR6WT5RC9-1pP|FOKM;?R4%JfuS0f`|zW)N--x`oagz zsRC)g5-q+`qkrW!a5WJ)=wV#A@(?in5t6L3ho1z?Q~rTS*IwrFNc^#jLsVndi^_u` z@%z+;J>sT5>BMFk;VgMTtgkhWO^-iU1Pl%$=XbT~LB<>f<9I;v;rn~z%+B#-ybw#jy)-8RCrf!|&UDc*JpzLEF=3Dq`>J*c_sev{5lP}pBze*hBr zcn4mel#UWC^s%TA*g~?rMducN(l`d&}?y6jXV1ZNw9#8 zErw2-6^Rd4%53YX-`I4^GGIEW&3p9R7gPU&swmft0SxCwZWuI($d)Eb20_vEe4223 z9^8W%{ZPP!>xXg7&Y5>Zkku`Ny5K`Z{QS*r28d)_JHeHd@;N? zY{d~66QiyFg>}zRk%1tG>HI~sNAZB#<+!}*2 zJGw4UcoSt*=NzN^>Q5$?{+dDY00%_W(_hs5nVdDTktqsl&NTDrO`>Z2S3*+UnQR2{ z#8rLgwVa+#U(K{pv*5Z2HuOIVCBT4azybbGCrxEOo!z(3SAhF!;_^0mG@VN{g7^bU zzhY~f#R#7nwpB`A9K9d6Z>#4j5;?sDt z!N0IrD~`E%vAN{)o`K_7xRCE%?5n)#_>N=wHWpbs7*u}wm628NGB3v#FJg8b=_Gsd zuE-oywQ5$W4V@zQAj3Egs;8j5Q$T*zo^pfiN zl5SVJ;EzR=0jf?0ySJ(pku?L@UmmjrpaEU;-fvV6T9%h^FWrAD#QU_dQh=1wvt^bI zZ(#zV#_}sJ-g%2>MduaLx>-^e>BU$+e&3u!ojE}2)x+AbqZsI5!mGY9gLXX3>ob`Q zcT1YU$R&g4M;EPivqsoYBGF`(Fca6kTExk=!p_yd2 znyze`%SqrE+re-RSS0Zz>S%=pz9IJ;6w_EPfg~?u!3`3IfCdu~{b+zjmp1+>2x4r& zE6{~L4B#i|(s-w!Xd@?vlj_&K1+#ec-R@G=v%*nT_Yu0%e@5v!b?4+??-4O7;XS;i z8jUY*vw|hNeZ0XTMtejUlG&R(i_m9kfd&UYHU1^ZlD49&?)waxLY{-l7PK{Af9hpQ zoSpx&R=_Pj5Mn5)nD0Q7uU+tXe*b6-gw8SnH8IbF&Zyvdc>H1$mi7}+Y;$$7W7{+om>n#p|WhMiH? z2^^(?c8YgF4U@U~gqPg5KXq^6-6QW1F~lr`p^DW7-kkx!X8WTonSz!@4L-!7Z3S29 zj4}+ob{?e-Q^PoIk<1W3a~m#cy{ZFet_r#;HtDm|jv5S1*wAmCR9WNVWwehTj~a-? z7BLPSUMEcJn`B)3s9WDi^UYuOe!X*RP^fN^1`{*3kYo~#@~CU#dq@vJ zAc+iR5wzEF@R~!zi<R`amwJ!IE7g!?`pxz5pnJ1ga{(^5= zq#OyS0Fic7#r(2Q=rW4VDmNHky%)@)B`IB5!Ak|Yb>~DZ4iW-{FG1in1P-Igr-|yL zt2{HVItxSX%_FZB7>$rmrUg&hgE_2+(QnxAJWrnX@(h^iY4h%rv#is*ULB|}zOp36 zQU3g}@~ZJ#4!D#!Ai^7}zb1!Tsbkx@nr&S4{XFFw*U_QEhd`+8w}h0=s6#Svgx3NQ zKz-Ok8*Xj9RCpeR?cer3XE*4XZjP9ABt#j>0SK*X9s83YQMW|+=%qicANqAx1#}dI zybEhiNTjMRi~qC}4dL##RG6;+uPFvgGKjOLRB@Xk6Q+wZH5LY3S0U<|W3CmXH= ztNtWpdQ5h)pMnDxSu}lQTE91ya6&tkBiI*ke4n{$Bm0)&qFOuOZZ-A!p0WVP>|44A zvCqFezmVLwLS0V}21>u}N0E;4V%v#OSn~tC&3UL8zs< z>)IYw1TQUQ5$)CiKdcLI!uy` zA9%ov=F;kS9A-T09OOo`Q6DJOrqJx+K^lOiMWK z3}b!~G9*u$Be~YaUDlgu-v?E^BuaK*V|iDQCz-=jxg(OAir?E~n9S-bj>UdPtD zhxoeA=bc?1dQiAEzS7ZAZK$!lu!oe7;JAC1XRtArE^w`nSH?yIuZRT^OR^+sJoAhn zd^PPt;SWcE!!=dlWpF6qNvTjL!99wVG_7ZP0X2VKX&PbYdMet(M2alB|IELUm_CX_b{6B)zroLSZImg;llxkDjJz_Y=+*88U*W z`2bmlVTlNCE(sy&5fFiBEqWp-Fg00tHtw6<8enDUCK|Osu#vQ{ygb^wk?{HYd8WT7 zq9r2wAsHR#uiX@nH`B@F?1c9Y=7mF|1-xJV`MIT)&KZA1#OgZ({|>G9OHbbeaK zTJnX3`0;70Du;ervdnJ;H?=*;ajMdCyt)+BPgA9%ovd+nMe2+cHPVb%cAuALbPJrV zc?+`J%5Dpv;hZ(DFz;0fs2Lk26zS0vMw}!Ni>D{-j5j&C#3cFMzH|(Jb6-dJh=6b3>D%V&wk#FXWcW_~tcuaEje$=}Arl+cfs%<-Tso~(xbfaD? zCnboJPPU4vo{zZ&r5*!W{nZ)rnU2(`%ALAi!K!x%4~cjPTl#SU4P-XzNo~}9v}mV) zekNSMM5=gf_vlBUO8DI*R0>NW?YQa?p{2z{AZZV!2+bHe1gb-A?2qwj>e5OATJqA* z?xXyZ%K$oz5Qc+Qi&k9{v}ceP`;ADneBIE!aH_idQl= z&~lHE+p7@6s_h*_v@k!M+S6jrF9(&`lkZ;BW|j?+kN+0IMiP`)``r7Z4n`D$bFAC_ z;-9J5ISzyvStTBWbt7FiDxz6;$W`Ms`vFX&Q+NsYL(j0l^{bWx*Kc4R@MCx?+CmPt z9Ae9twrr`a545f7`#QJX5@q8e6BM((`xvTfgc$4)#H%(9N`PAs9<7zUmE!^@)| z|E%c(E?sZhyt%@vPkJd0U z-exk$aQ%`7qSBrd)m$bRaA0tAacjs?q*8$6GFvCHu96n)F$h56Pea3XVzWU?U3m2P zLj2?(>zFWj?yVzh_T6@%m`H9{Ky8uNeYbkE_D4TAmMEr4*f!LEyZD+21IvZw@%8Yg*!}m&wgYeZ^LxiAS*xhLhsf!OedE^~){< zrDC@#vMd!@+3D7LG>tX;=p^T;A7l&|AeqB#k1y2PB)=nuzp*_}JxqC8-{i#w1%Eo6 z+0+_xm8kA#;ULfFZ^Z4A>7IXS%J5u;9YS3=9GMeKlf0GkPjLC}q}F%S!w87$Ufvu$iB zW-cyEi!I%aypqb<{OP;*cNLA9#06V~54j3^GltcNXZuaZo>I~_W`wv*(r^TOv+VWfQt{g7rKmd^N9DFQ`EzioAOjr}6AIMUF> z7^>i=LSl|Eh3btkST7C0jOvew zFPg@$t>}$sIQ3IFz6UDJz`O3 z@L%VGwm^mInt5;#6SlQP6*+0GYlV^}A!pO~RCyFeIBE5cw`;je*krSxjT#G!;{7IX zKSvDB%1__9`$|EdlHRh0xu7He>ZER7MKisP4<46KWTtI~+24dU|MM?^O4i>@;=t=d z&-7glg2cZ)0<$p$=Vm=yK1JsaVe`XW1L{zTVsrsOD&*+W1~kRH2LTUHd` ztnUI@A32_6=%}oBed&`&bWP1XIkD{WUbiQPL# zm?2VxTx>VQ<1dv1{$d2&r{9C~O)t68azwp-hc8j{k5R5$_O>!-Y(uM)iP}>0?4U3I zW9_|>Hdz^%%X|ETF1jeEarx$S3UCzf!A#ar5uW+}=O#|spS>BGu7Yk3xxD44N`v2v}MQ}gk8pS{~g8?PS89VQi)PATELf@WaS;r8LH%_~^ggkuzz`q4N% zN1FS% z>lT=cKjke0jbYVf6DHUJ<5Uv3=LuE@kN5mhuu@`3j3mVm1r@O;FAn4?%BsEt|EO3W zv>OVY^qSSc3zim$yiPq9c;~buq$1>#%Y*>LCoax_yo(>qKhG*tcWYZ)K8RTb%~aPq?C zt2Gp+jXb^p2+)9V;t{@W-NgH-xXAA=;K>bV+gOm zp91~@LMv@fH|Pd*Kj((fwpP$MK^{J$W_Qu}@~506D8CbfnHKH`NDSw4Jyw^a_n7iT z90MGLzRJ}U$eVKs4+spw9x~EtmFCIgWq>ZygJy)(KnelB-<8wDSQylwt+cc(pL^=n zbsr_{;Qbup2}KgQn*a8&H5OiS`2&O1M`SUM@obv1XMhajWxu)Y@eXSfa<=)#8@&|^ z;7-Er!w_g7yBbwTri1pgnUxh~xL&AT3x|L0Z0?5B_#-(aV&UtX!=Dv|&)b%Hb`u?J z;q#$IBaX95;>=|@?WRNk@W+SJe4=Yn0P6mvlp2|0N;JGF3EFuCpKdbEqy=nRKhEW( zmhQgp^+evw_;=mz*SwP(0D?`(oD`eL)Q39?fEEdf2@VgF zKZ<^fTxc5o2~DA4)PZ)i(Yvl7+Ss$%>?8hjE}ZDa?sCZ9i^CHxyp{k}Wt_`epymjVMW4AvQ?8NU(q<0 z?t=ZI*k*(~tr>+aS7O~@kJo9t&JFfNL#JxW!2+cctcZ_3SXV8&`Qb~KrV+hQt?wMx z6g;u~_I9Uc#YZS+$ynRCDL-3Wfu=l3_`!{I0kk%6xU^Z-`Tb>oPp;sXkNZ2+h$^Ms zzs}hZ8wvY;Eagvlwle)YKY$1KD=S6?9RVAQOT6iW6)P@ z2@fiIt;QQj1!M9-NONOMIeSHWpEQ&Jylso!!DLAux8(&F~RVD?%JpobNC3*F=8 z5f$?&WTN?KlF4;F3N9K@4D)y>0-9#Fyyzi=os;It#M-9pRxRmC3`8Q5Z3y{(E9Sn7 zJt-lCbTUBP zGY7@c#AmzLR%%;#WPTKWec<&Fp0S}ocJ)vcmG(r%*5rJ#iWRro)CxW03D)5+oJox?d%9FH)c& zFNkl^sehr2HGM4is8diGq*m)*!lNn+X1N@}?#-2nHl5B_e%n{es}6%zIsyT9?{p(j zS+7Z&xHq|jQ8yHd|FFl02`$2$F9>xx7x_AQuCJT(aMMsLNJ)0@ZnTsPLKl-Nh|58S z>pasaIEItf$jiCjz+r;jC~`rTWeJbqG4e4MVROMl5Wdm&BbNsA8E=T{H)&NKLoa8< zYVpx4@7KQ$*UJ(au9CJxlQ(2JPlgS(zjy~R_o6iQ;MJ=$WSv*{tlMl@?Bm9tY5qUH z@F>R?n)fN(Q9O%T^f%QfsxvI$Bh_J~K_kt(JSoQI#5g(JNu@AY#b#&4AUg4N^x1lXsSa~SzWde+8=AGr+^ z+Dg#`-1Ag8mtmnKmbe~Lh^|d}H!MN3)>S8sLHBMC&aQ=@1V|^O$H-{1urbMFI z2WgRrE=+?3s5kN&#V{}8hMsp(QGtT`1{&t|#rvS(Rsk3s4r?dcz`}Jj4?YvJess}o zSPiDkb;E={M_-~T^d=;Cx>s~>{fgnkxs=UA1_!0V1&!K-uEH#ftj~VjSj(gd0>W9Nz<@pb9_aUz=$DYgWn2RjfTM z6J_Vk)HN(|5hw5NQsAuXBEVu`42p_S%zXZ<~I)WEsNwuHU7y0tX-Wt#+{C&St8bKP;)mVqOaFeHz;OuzjTRY@6?Ouca)ntz1olJZ6SA zOw%gsfM*!&C9b&s(#~`!!J}ozO4|_pae))#yv=}UHmtJ3h2>hLEK=3%y17lCb=tg` zt`}*qb!b!9XthfCIN<~<6DLcA>v7J(tpkd*)+r6My3m)f4`QWL%t zUz7)sfe+bsJi2k*y_jqq8!}KP>vono4CSrquFzW)%lC1)$fEFrk~^AS_&(X%L-w5ms~tS#j8*5c6kNl**;@$O!(1S5ek%G+Vc=ZO@q#f(9u$H}H<&pgK?1?_(yAZ7 zMv~a%sU7GL&v2owoiekSk_36RND(pXdd!#sN5ecb#|pXAZek6Ipv6_cI-E=<3S69| zxS+v9= z&LuZKZS&2CLsdJn6c#q4?SxB!bOkE2yTT5bUrykQ`n#U7`C4L;|FzR8LY!by@Y1f zQUVWfW3z$|h=N>jG4|5f3?xRBQrq5(?U~axd&J zenS#icN_cx%9~Sah81OJVUUuSdu5=?Bzre>fB`dAvCVBtI?0zttszSfU?=`~0rYA* z?$@@V?s9oNjhCNRyiWN|+t2-Y_0F%BT(jz=GiuSPLOEj+#AXm&mhGG(Ck++@)ITY3F}rrpmdM$=Pj^ge_@rM`yYEgM{0U5#%0>AzR7 z!O!}7PwF69S@UcAp8wW4`O9r?0(>ofb|Le|&)Z+&k&vFsm+WHxxPTbRDNM7!P26c<^=Y1J(+PyhXzYTKEpA=lB2HxsvGI_|#UT`*>8$l?)6%%+KAfK{iteth38ek;EbF zw*w?aUGdp{jC;_R;*FE(;*SXB&M6L*MSJ{4x>(qMcddE8;d761f96O#zwe~3zHr*l z)8^S6g0;qcZ(-rWdd`Mzzn|FoYx~E|dR<3=eWxdCcI5-Gc->8bTc7wH>x5nLi=9i- zbR#p<&7tNqASLLc7#g3}=@%67TH!=-FGixuIlJom^P#@^og=L;~CR(o-ths-vh-ahBhAu9xNeo`qBA zmMrB)q+D98DFF4A9Hc`{ZQwDfY?L|KdbK$Qy!s+}=;v8G+6pJ94{iX4TjQHspo=ko zM(5(g2@h0u&ruYI{OQTg)axoDaYk1;rRS3(ODt$-aWW8N1DGlG%U`>9?}74;iTs&g zzJPLHLnd|b$?Xzd@3ip#k_aLB{%Krn_ClkP_Q~dlzFWbRjRsrpfSc4kB8D$k!?_^p zZ;1kN@9Kg0Lcmnrov$ii-C+faPNaS%I#d%cK&~CNgQv@?7glg`=h~36dM#6HBEMft2Z3L zh4Qtc%bGJKr>!T`)RZIr|m~LmO(+Vxcp!Q1HHA>yr2f|rp|v)3LaFo*y50H7 z>Ua_nTQICIxP6@H*K=vtjIVYyE+%}@dwb=`+z*=RCk}=tHw^`}+o%cjio`(+!O}4J z6so@N&i{J7+5JYXkRXP&bH3va7YfZ{+NreRHvwL}g8wUqFDI=_w=j9tUWOLK^Y6_E z8uH(&i_=HDohilS=FHp2tgz$2Gn!4z1rK*bq8J}UAKLFnak~Xc3gYAvPshE*a~FJ~ zB?bR4)My_X~oYv_(nk5HDy` zLG;+Llty2zmkY;V)(m2sJNt$UfzCcZQsp11ZWXh`m7-$y;jO8_o{UCX@TPwjkJ(mf z?S1Y>r)a>kncR49eb@dkY7?1x-1gW$A#$KNb^L;O8PXLGFGuf~6bU`t^g^o_5)JgY zdUKQfDmvEJx@YoP0&Lj!ZmXL~oWjiCWfV8Ov=el^7_)~!!IkD_2S?9#HJ5Y2L zu{|7xU|TB9=xY(Xe_853dKkWkL>eOqi(&v>+|};Bxci_n zIxHkH_kXO`HkWm3WeW={a?Wi-Y|gZ(2Y49((n&Y35%_#bE<`oEYbAB zqZ9!&chL%Z1q?TWu(DpeCi!QT32>?f#1(VQ<~_)fdqr?@R`TJ7z=#GNyr=eGrTQS|M3y5IpiBz{RTsj4iDE* z_j|MBWvCZL{Fd&X0Vf2BIn}d*&Rzwq{0=7`q$=7dn|YRmjb1$(&%wD(9jQ!5L8*oGvZb?~S*>sx2~nu#-=_98|M{WTF}uGv6cv~CBnDeb@SW=3yv8QfzE23vR=8oUz;c8AQnzjvx75nvNysjJRJ@wcI6LTY zk-ae&+hIKHnEb6cZQJzD<0Fw`c&mg{GH9U~(SR?zg6pCKwQuBCf}**5ffB^e4fIz? zN8}$w!I`hd8i?D15It3`+!U%d-L^IAgh+#a!bANG5q$t%e5w4pUkZ6Yf~0TF>M{F+ zvk%MQ&t33`4P*KX+Z)1bCHD(>R%Uj~3Mq%N+cu+Z!sAv`O$`le`rVRG$#Gx41l9QZ z-pgsRDywF|>q%u&0cU;uDzSqAo0`L%>Gy&_zGWKwke)L|i;8*3H2JmZr<+f>O<}kq z);X*2#ns$)d}&lSnepMfNv3H zQ#OT_w#YjH5K5kHOr!0@Ru%%xS~I=Nb)u+4-9H!P!R zc?N*BNeDKGBPS(t;b+}CM%2Py)s2in{|RYGNkKzlwsQ$~chdkkm4^sFR$~xD*{;zz z3P@2*lXOT(RHr1S}2?N%b7&M(rW%EScvh}PThmy8+WoB+)HccWDB%A&|fk@nhrK<*QXJ7)EM)coe}5B}S56zF5gp6-U`{c&N7$0g6JKrF~!_ zB8Y+l0YQ9Z@C3{<_58&BwS<^T-`4Eg_=9L+XZ^!k2yn-xd;P-(1SNgB(=|LG9gl3L zI{?JJ5g$CZ$0e*+1bcdJEhvkSnAX~x?~)J2hvc~?!P5&CZWKa0{dXttOtWFB%MRj> z?im!HQU-GaRN=(mqjuxRc5z=Ay#J|(v#SjeRsSb?2FhzSD1<3#Ne#lm|}Q}@tjfZ+R?V*#IJ4#@{&iX?r5zZWnjx%GSqQ2;p)E$ z`cUR*%jrR{)4;4rme@aLT_5z%jd;cZBw^1fU;jGS2j?SOYdSsdYIOF}-%@{e613j6 z1eRRR-8{Is^yAHi&mNg50{zR9mo?QX|dk15B3A#DAQCx;ZQZH;^8Wv2SH_421HzhO*iGg7QRaDk+8DtXW zEm?UkYBKaw|ySZ#83w@ET+8PjX!Tc$Ha?yfG@;*oq`) zMoA!*mdy^3E#kAr4Ni>UiP6;R*T`*4UwF$yedKF309^;#H8#ecow1eKKPZAUg}mMhfhHME$)G z`Htg@QK*&|=q19|1yi`*sZ{)U6yP5@sa5YD4&&}##2tOkj_AwWNz#tiIfdYkffrNf zARUP_;lhmztvKZFw^LU+b}xRvWs`z<)SXg4dcn!JT&J< z%J*x_fe8*PU(#JjdxF!`4{qEqKuoO zM&!EbYQR89rKnMA&~8mW^o`pA^j$?X&|N#|-$dRhclUU2&3A=6&lYcUa#Yq6)nfTR z35i*Tq?6kI|2U+Qq#XN30P1!~`;|@^P_U~DuHHA7qHSCJ2cR)2MM`Isba0dc&8${~ z9WgwDhm2V=)l3&3)Qp1!2joiNi*&jynjb@U5iulSd<2&W2&C<<0;J~*<`YJQqqe!-{=0{A#)tQ_TGC2|qV><>E>axHCE^I?J@ z`4_93o9HcSjY}%|S!l@mvQXCvc!%ga3hv=qECs;BgCA2;Ux_#!%k{y-`rHw_?9u%4 z&qlpV$KR36C;78b~KbGBT z{BW^2maI5gFpd4ykuXa= zXvvLHJyD_h^3RRog;urE_zibynW?B!jm+I@UrO9P-UOxgmR=HjTU(7O!B?$~LOay=Sy& zdQXmuWXV`oTn%k}wQgDf6pLl|aQ9}45fu1Ze zc49*{gw&ov*-9m|CMDd>A*94A@}5g)eKaG-i4N$dl8-iCB%YCKd#z~q~AM^`eB zzp}v`@ylN(zTfBTKP~F57RO$tpb5ryOgmev8pzdn$N}3--OM&-cV69#XqJz+nzM?n zHL@Sl6RQXm4)q-ggCay4yx8-!;C{c@eMs(lhsRY)43mzU7l>&|Ecz13SCvrs!Ms>n z+#f<*I8S9~atvhG2?iU`-+(rrHYn|f#eaoD2@ejQ?&`dBD{B;BIzh6zLt%E(?ABGe zxs(o1a~`uyM1lw>NSd6UdKlk)-#00EBGwGgdYgyPd7&k22_m%gE z1MP&txjrsKemM8{XOj0GF4JPsrKje&m6%cpD!9Y&@0$kE=9OfR}#a-v70nI1E?f` z?RcSxEDG%rtvX8aFDoVV6ZDbUaig|AdJ+4pp=5qN17Y^WLgMIea-z)Lkz47cL88nA zKY3br`{*vA^2*Fli9WS;-S^?DS|b^K_!TO*^uptI7doE({Do&y_u`Sj!Gg6);9|nT zH*{;y{nCthnWlDYcS(yBjCJCa_`7ExkXHp9}=T9@KZY81ta1gX#8~9AzDsO{%6HSPUr08ryyp?UCzJ}{v@LfO5zIfdB z9;M8bQlt8g7c!x;;~2*GwvdElCuzpA#oD00b5k6}d+bev&ZVA1#1lRj^Hy0 zZW|X-AbSh^%hJ@-j85vb(hW;29kfd(x3;(PcUOveZcE7Fm`J=L(gQe+ygS>~4zAJ` zPb}_nqvGX#_}4CtK04AvthNp)b%5`{Bkv~gPM)DBnjgKS9O04THm*5UyS8=jn)Z?k zs#E&YC1u%F1X#KU@Mr#s3Sy>R8qhZTOtlJuPEdw6J+Al6Jh)=RlFC=dXcvMl$*^a` zuSvB94>^OD5N2LU=sWo7-@poCU@F6=IWCiW{%M1L3f3lBmuEskSE3r;`uynvR_ zj$3|%ETNFX$+I8s&pkzbA26NTe`I6ofWN=)0y7N3d6vj2u#`Xg7S9Zr42(YN zl|7Ph^31s$Y-P_~CjiZ`4}@=Gc#!_L+PQ*eMS0!3Pp+9^F<$238OvQ>gG|Rl%=MkW z=^B!U8GON(bQU2=|0s-J!HiNW)_&!BJa7QM4Yc9Uum1#ci*Ao}IKLj4!;L|P(`G|r zG3I)2A|$l;34X){llJmt=`|4xu@O_KA!c||G#zJ*C2{YmZbzvR{(XI%nB)>*^VZH~ z;E?5!f1xVN^5*YGfGQ2{jsxNF)Sry**z=|=PYT8ZyB*0*MND9s^m>A#?rt`|ipK7f zU#&!<&K|)D9=TKIc>?E-UWS|N@p$G=t#|QHjvuo5HC74`VfUiwcCMAa6ZGMJE=F~J zh3Z|oVdx1Sj-}1SruKXl4884AvSYs$YTG*+AIVn}C5xMEK#1;zaf7TPo(yd=CD85U zBF8+9hw5T&O@nF(@5pd66>F}?rFoTGk+9rArWyA?5igSrFKEYcrH(7Yc%mnkZIILT zWEQrebCJWMH%RDEi{qOsrp1Ew6vg@S-Js=Fk1*U!8Bna$mhiw0{nJl#u%N-wO_;<6 zC=Gq7Ze9As{VWZ#|DEIwy91a-aag%U;JAG(m$x<~G%Y&5tAI_7w?5gdzwP9+Qbl8A zUocpycQ4`AL&0xZHZKb2G(w$^NhW?6MI-k|>T*U@QUV?ANRnLLCiob*Ky0Y+Kh6_z zsg}lkXvB3pWS_Um6mQ{`(8H`lgW`lWo#1R@cFRFfHWXvjtBQigA$4%%|4xDrhZmwS zqbKB(GY1_GH{DKsF6h&)NU>_gYV;YFCCidTakGujobwe^yF>UI26&mzZ!7SSul$yU z=k#1P4+FYg=v}G;CS%UhFcaZ^OVFH=oj16b`FWAJ@54Qfg2zv*p0utV658*yc$UFR zt9E&gaAG4siyKuXrET{ut<;%me`&=e`%NmeuhjTK9=ZIi(i%6n)nP3FES?Q;YQn#fVEVK4+4RSm3xRdg z#t!=d?k5iezqF?-t@fKt3le?(M}O95y3W3*akm)1D~rvDy-&HyeGP(`uDBP}Y)J!) zfzN^e%Jj53N?g z^?#^BV*IiwkaeFZ$TeH(^n|D@J$u+j8Zn1wNXVLR>R z8jN+u7}YU9xSTvkNt{nM7(6bj7-wM}ZbE9p`E2!It$EKK~qF`H4ym4q*?qX2y`loN9NLUAEdyL|^a*PHaYKsUj*lcc- zYcPf*b>rM5L6Bo^f{~kK7$teVx+d)}Al1Hm(_R@SPAS(T3O6i73_}KyALWd2v$JF8 zjU|40=Yl6-%%&h_8lTu`GiM~M-;$>_!J+RV!IU6rpg9^M5-2ZJZ6c{LKa0v87T7hS zaaH<7(e_2tW8HoStd-!T!ku(0m>sBv%)-N2tVGww(j)n9ExR$(t4sx@auD$oHRpHPkhlRQN;;oomP zmrOyn1{Aih5#hMe^@&!u_~+o?exwEFXevQ3R!%br$pSwt*0 zg8>H@2{W#G%N^t*YdSM}E~>u&Vc^^bcZ0n$*&MS74Oq{6hfLwoqpF&TQGmGFdhf6U z2p_kaW;}V3F0+fSNf{ipIJeDM-NuNkqkP2PohGEQNOh-oi=5CZn+KFTJ+)Hwm#2!{ zyrB5b99)5-CT1<~`fe?OkSpALDPA&pDi}Hsx8O4jR^z0`r~5Cq%64_flvkJY1!l*km+kP)(VHBKHQ#Ml}O&hfmB#?$WO1Ee?K z=1lh_%FHiqBV*F!x!TLV(O>K(0~NO!w9`Dq*`phW>mZM7VChN^+XON$Qy);tqgXl* z=@`h@(JK<0bF~bIxpGKsn=q$}v6vAvwZ@R6?f*+ZUXh}>F4%Ia7r8`4c3a7)St~oF`uSv*yX>@TH6J)H%s zJXeD^yQxF6z=%sMxsrm7%kppCHHla*W0$*|77os|Zs5)+g1}c+{rU#QrWxdT`0R4= z^&z}PV1`q(5&@u1h$gKRy3FaT)qG_CWek~lU9u%CxJn5CZG>BGc*BM%$M1HtAOTf! z-eO&)G_nfi58bm;f#Z}e%fJP7A`Uy>s1hOfAW+%vbe#W+7}(QJ%jiMd%^=H8m_C#l z(w}}@gQ_U^20F8w6i15^i6a3H0tr>y{K*$R0w_eE=9=H8Yr0r(eNxksxAWXZ6FTec z&GuP}5*-|}N0K>Wwn#I~R1*kY#h5~d_mT1Sm8Pei#gRsM*BS^=^KxV$S$xgfGDEXs zE-+E97QOzI4zUi)$(8w4uob>u%J29r6)BdrT|slx-~ZTZ2=+A%C2zZySk#k>xG!4* zb+RkB5TxI~iDH+&P;x#mKN|*PKgGz=f~&mkG*3#V6djDgfzRPf`5QgSL~)n6DdK9X zz`zF#W_NcT;&cp|+AftuL|n&<@M_XTYnnB&4Iu*G7mHI|IH~qiiL{#H*K`}_z(F}o zj&5RpuDfQ$xgAQ82Z8NK{QPBWE0uzBu+yM(rHzIW>OdS*Ae~jbW)@K|(yA8E%mnJ) z9PXB4#n0|{KFMZ8x!#n^@rT8*GfQJFlIZVDmln4ByGVULa7vGwPzuDElXj1as4Ne$ z-#g>A+GjyIfp6`~>M(SbAqrRvM14QJL`3fE zUFd5~yB*VhhQH;=q@pvUSgi?)pe6_rgTb_+ge_MwxG&>t*@pirrkznRaV>go&L-Mm zJwxccS)PwALRLQ!aT8vCTx8}Gdg*}P_Wf6X9<^HIN+%s`;N}|O%*|G%N-bieK$jXc zJr891eMzDOSRp`*tO`)~+F|&1vQEO5H%pIEc-(QaSC51W`I@76G5yWA|Ab3(8hg?+ zqplL{;8Y>Ub%Hsg8Rj+=T--M;B%h$)@)+F6pa6o=d2eb&r?=t?tPyabX|w?DKjC8d zCWJn@SENgr14VIGCUymPW8~S9E(t%Wx!zY)i(lkBIiUm!j zVq%H7Do{p#n^+btE9VWDe9g>JKx`gf|5b8HvFo?dfoIW$&TQS&I7SpRXY5@+RxL>2 zL5jiL=_f>nYI;flMM)8E<$w^QSW?usge$ctb%utnw3evklY}tEz=}ipgGH^FK5C3F ztAGzy#Ciy@$y|1=sxyvOptBS z;82@|=>OtzGlSMJ+QYVszlNCYoZfiu*QESZ(O9Q-w?@r4V^UGp{D|6gn6pmDZuFyR z3ws+IKzf`En>^W!=GAN*NRjT)KB>&(lx(!dKuoP9RgdACBAwylC)5r1nOqFBkct%} zWRGZOV54z(`+l_A7_~mBxj`*WZ-l8=l(rU?h|VnKsVu-v_tu^K{*6jQ6YE;jnNl&9 zmYN2-x8vC$OMYTb9Bmji=l)tTkX|0F*V?6Sts#_K<)*At6z|HYw9b>oH(Q!HdrUpg4>>ZeASsJamkl>w^><-Em5^7Z5p>70a{8jK3_yw9M+ zj0N-Vk0`v#{B6h?Y)tbV*OM*5V7)YKY* zDexBwK$wdnwk3(y_WT;!8|<@2M}yllM115_hH-C?a@nKmR&Db zaT?XFxiL(SJS{BZultPD1Dkjbhg-%v74_qauUs_XR|TkGf7QG3e1s&v|b zsAVy)iVq&8+vDZuz4PHYrutmM7)B}x1yOB;Yaq51I+I9J- zXItH__jwZCW|ZXgz&i3jUSn=jNbqqts~IWH7-6emdDG%#j)4opCXz;E9|vzdPio4E z)zj8&^34$G1{k1RI&+3$lI~e>wQ46$>qZJlUC}Ad!*~s%V`S6zHM06)x$4phL?dIQxRi~*X+%$XLes`ObVt#qaFO&iiOq3z|AUAz zkQ!CnI&@RXCt5V+g`}C)YyCL6WiEk`P^*Jngv*?0^;OU-T3LO;$5E#VJ&k+Gq_oJd zn^Ok5mI=tlPISXswoqdjN1U!9)aFKubaNc113yLF8dZ%;(WxcMv!J7&7NEeC_K%Gb$#jkL zWF~0^H9M~TnpHBMWcO9P2K}X4Uxal-dXFrj1ou*KsWwn2tj#XE^4UyJV5&m;4tz%0 z2V&;XXDI3F&X|X^_ZHui=o6Wku|a9I7-)TB#+>lzMPi5=?f31jMQw z97{XoOU+eEzclUK=SHWbs~r;8`5c<#gLDL+6JBVnqsE(+Q{q+!R4AVxbYkED%6T@y z`J`gGCeE)sK7=Ha3ucBC@_*MbytC+JGhJ#sPdr=L#&oA zE24a|53BFHV+y;g2#@w#LHO3xbRP^E*)n1iI`C!pU@SS6MUbwj!XzDt*5Er~CV(VY zf47qw4AeL5ff@{1#FsGNexJg7`c(>`b`maxL55jedNW~MuY{rnhX(RdF3O|zu;r=% z+N&p98UHRSaqP@ZZ1q5y=f?X!(@+b9d#@+%B7o|)7`vJHu6oj!;O0tCTU^YYU$r=N zAkO;B`fspR1>SzOz`h>x8xn;$YBRm*twe5@BkKKQ3N{LyfW=!qmFZ(8vMl=@F zjyWM?&^h6T$?VoYOtn~P;Umm!s!Wrq^yT!pkJE1_e9x3)&+2*u9cb_o`&$?xil(aT zYV*CxpXDQ~nX$n83z+p$!b+sDPK|sI^TS}w*8t(wohAQ|0)Y=B_n88iJP!}`7nylG%wtskOaJv<(&(8Md!KxfwV(4IGUD z`T>D&;VadO)OL{<;%3z&pzeX3faA+o4XTJqZ=Rp9y5^&G^Y8w^*4LmG6aVtwcln~)L?D_I4a8>{+2n_CO8lVpop zC5e}`2Yv$@8n@b>5}}e$6H%*nsLqZhE}7pxX{8pt^wOP(xVyD<;#gxjwJPj0vOgq? zG+|pABp8o`_JpIFVC2k>$%VNXS$gxgD>mv6fcg|bq zm8ksG41^@LYZME5{*>JMIH=(kxSB0h~44?8FWS7RU8r$s-7V79ZjAE+`V+}DUM{lZ-W$(2zoYWpy6qYqnzjqh@#ytlFzP_Po&Y? zyeU)nd62rXbrJq5Ic?-OMt}N=BXvl_w}Ns+Hps(gXa7D)eHM~^eL%=yPLpL(ZbBtE zZSg+$8fa!3FuT}$#F(?9MDD?P?AvV>2E0C9oZSC*3tb%+ga^R>`$bV4Sa*u4zFE~7 z@GpO~L2WIbO2GEah4B@htC2%0{4(MOh673@o(~Kyc`7z>$u0$>39VPA z57qBGW7L*JL&Kd-z`0c4v)=i(%W&+?!mMRW=7_e~GKMVQ_;-JjGi)AazM$S|aJU)I zRflsn$j7*ot6&^>L#f#$L%MOLP{XSx8<2_#ANPWL0(vY{2gCp|F&|rBT~am&Cw37C zcw0dP)>P9q>l)W{%TNt(-G`osrvEBv2|u_Xj)BIk?Jp@&mkcvAN<;#UC1WefJ=({n z6GAep$+0J-h(EA_t@ov#e;MJgu2&U=YDyO0yzC7g439Al10yGPComvV*e;zYOq^(U zmyX@P9Cbl_S^;_?EE#5)pKdok!P`JDO`>z#rG23psHG_wt@C2xWy&smvPjY zkAg-dc1%S)b81js~gZrd(E$PwO=-}_)% zMX?DSx;x3o&@w?R9)s@nQGtpZAlxhZa$Io!K!+|c*H8ef)H3t%U7=fsSu4UbIdxNog*$hCL#2y!>;;M zqcwmeJLw#$+3*EEL5lKpsh+!9)6ce1(JY6f7PlYGk?IavdA(s{*uU0(ZyXfU*JFvV zMK%$Fxl-mS8QH{<*h|&N&1UXrc{LG`LQj%<*e!d(S8QCR@QLQ$?N{3Nr({@Gvt)X6 zN3RV>oA_NJYLMV?PU)t0Wjb?u)lu#*Oe^2p?ai4#k>XISvrR1d^tq3__@C@^Dv)4n z;u=f-&85HCE5EG+(kg*7c8|P``xg$sD8LN9-e<3gSNi@)BpXKO4Xf&O;1wj}`yL~Vvc2a^<9AwLf zCvS-(j-;O^!zu`6iY7==5sj02#VUfKMy7R1iUO}_lno%wBZFT3%b_3E26W7pma<%1 z13qp#MT3iwyj>O+J~)S}9uE-{*b7zHy24snoTr$X_v!BM_vri zNF!6IF+|twf_G23wzY=2t%jnQ?gkcW48?CGG$I1Fu9{5%!m}zDc`hQoKOMc*lRHId zlQE&IkN1qo1GsGdfUC!jDlrS+;x8an11Z2~$7-YYN7CMj(o4bUxSYEZOq9z{Z&tI{ z?tg@0evbHP3Of(zztnyb>|I0bIboaavu)oS!TR=V3t*s0w}im%@b7a* zBWOmX|JpwKQXR&%oK4`0`?36AH zwBFk2XOpzaX?u_0Y_!+dx%1zKdeM#_y9(7Y^3bQ(4Meoz-$$fc@TK2}u^skzYk#Ul zX?-7g0}R!%+|Y&jlw&dbWhnRV2{pbi`55yyq_xClMaD^Z2K}C)Q;$}q5+<%_A6wKC zI_8P@$~OqO&Xce&ERszfai*B$t7{aBtusu?are^bHh!973Snfe&>L@0(d-*Sg>sLR zW=rF~3BWBQfq=edh0luiBypc^rUh?Rl-m!x3~tHYtwk#3PzNP=#W>48=DE*&nZHj2 zr7F}nkyG0T)K_QqpyQ#fOboAp^^Z-)EM69#u!u$=JD!h!JNQLIbrFW#UkgtOMj9>l zKXmj>F0-#C-t>1Y493D?2Dx^xYbkryC+PcFB8=4sIcBKRBVy#6&yG4;(zM`Q*6iv% z85a%V|fsHI8lFy>(PnizNnvU)XEh zPk3YUSFVn1z%}Xa>5IO9@wtbbjor@%bVp;Xt-;}dbjv)%vX{O`=pzI62;ox6?w%BxU0ogyy&pJdWpL#>9)N{fGP8a=$PEM%QtFTVGD zad-U$ID-G$pCE24k&#{k}-k z7DcKCg1HHFAVT|K>|8od%d`E9m$twdIEJM;I8ipTn_F_|$&?DtJ7cW$G2?ojo`Q}& z;TdA=2)HgmTzY%IvW;4s73gV`k=VMRE&V2+MgEoaN@};s`vKMg&$6VuN-w9J?sI*#WnT}b4j^| z$T_E~^4~{CSP|sly4Sf9R%MUd(Er*ll0FX>AFG=kt1tS|X`e-pLZZXqV!|QigyY<% z^pf<`VT!6dXRm$PM!L{dFEia}pmv*&5)&w*?I?yh)@-swE3M-FOrSk_uC104v}cSJ zy`NkY#!Jt2D1OuJ+XsDc%@cJJsBt|f-$T{M2ufgmNRn@AoJ@Pkxem~-=55a$E5d+r z8kNntteDOB@#Lzjwo*1TpJ&|o8&nOZ0h~K&&v^3QB(E+mG2T3BEHkd1`M|#W(PIRl zseW7Czi!yQ3f}DJk*vcaTBJA-HUIGHaTm@vxqlsCToTNsB0f(f^3&3vJw({6wK_6A z-xdK~cx1mHU8Pbk`o;*tzaZY{WiC^4A21cz`79Efi$syEqhxl54g#r4(;Cya&Aocj5gWxcW5^(_4`KdmP6aq7dtrW$@#dcw+FU-2?!{ zNnv6C&waLAZT?FOoU*ax64<$KP58>@^NT8QZwW7)g3G}pNnCz#NP z+dbq|kaRjk(MPPIgk#cB^E?vb;!GEgFVo$P6>OdY%!6AUh5%*=<;>jnHzuF_Zkgvz z=8J`J*_Q|F73#x5zin31wqAK$D#UvE~2*EVj>s;T@|qW02~*m-vb&Ju9dohY3n z;6sw;5fVCZLiszfbPVOI!_lfn@6A#qDa}?H=TbP#;O~i-5OcDn%7n(`MLhR|7;Y%s zrtJ}LvTa?D(KLt6NEC@W5yL5wH`EbX6eJrhOMDzBIc%_PwQ3>WHA>cA5sC;A4=UyU z)b%fL>XkvrR8TqQr%1wppxv7SBS$h+r1z{jQcSkIq>!Ppqif^r|Li z?jF8fY(*Peu}-aTxqskr@*pDIH|(;}THT>exOz49A+3LDlEy=s{1MblWj}4$k^-Pu zfQ=yFNq{^n(sOJ_lXgmz8Fq7}=iO9y%1tWqNUZXNhYmb2gjcUv&o}*C<0+rvw-$?U zBdlc8=PHt2ozJPVIPn~R=+Pw*Prl%DljS(88faV8;dlC6LzR4Z>;+x9&*4`&t zJdfPH?BT)g(J!$q(ytvT6xA-xTpvQF)6!glG(C zfgt%#5;L331vA&aJo3&I&EU4=$oT3Cj*obzfcvBDAD$)E2F97;nFi6}*5~kBrvxEd z6VlR}U}aPdozT#0Fdw2KshK4P?EgJbBTrT9{7i;|#d9Ax6rw3VY@#AUQ^ML=@%!C~ zV=i4CTYo(otw6FJP!Wb(vip&6TA4v+O3~^4#-GhDOv01DeIo?D)%MI7m}gExWzXobgq3 zU^WcV7w5$va8jrLJEyUycVDz6)o$IUR&R15OA5Cx%0V8~QfA!-k-9_4aQMW2wWyYM zq_j!L#nM$4OD#!hIg>?|>+`mXLu9%@aechFVgi)2bT)W|4(LF4RLv5pQekUlcH&+cgS2SU9m7Ll%5n*fYQ4-y>Kp2uUGmgpMa!@k z<}CXWhDLSq9{?(pPDJI%qg7t-@;(zqF+se8Ue>3$wn|wT4DuZmKN(p`qQxozCUt2Z z`aUMCIV~z8e5oS}s?<;zojQ`10~&_|wfVm^wtLidc7_3@LK~e|5q8Fpl3L!Yh-6Im z_lVOFrvUW?rzD>0(J;4HI=}&PX@5%oli7lIwUIma=qb}&S9XXut(dU=#x<+9PuQu> zu-d{vWb*32MofxEeQUMf>dLt@JB{ZCZ%}2Mc@r}F?&wCy@>9AvW8T9Gs zPlP%IK92tEX1m-vfBcs&hXw#z1ez?f^}KH%_VGsy=NtF^t38$v)1hpJUts)7iAp`A z;EcTJGy3^|v*bdt`nx@{c8zHc%u&=_4&79wQk#|8^({KciRUY~QTRs?r}Ww7n8rzr zlM_oN)eP5cDQLRL_uO<@alr^1&I~O8@Kb~*fCfb=wuT$05xAWSL12OT(~bb+pamt; zL@nKS`Jm|>(R0>L-YQl+9;=}mSBlpLJL=U>xcO@#Oz{^1J044c*x#}|02FPZ2O&R;|V=4*4mwUBU$jg6inl|B^;|6-56@^=+E$kxVlay$GUZhu--vPg9u zG4mWn)HU!FStPE62w1;+Pz=~rD>;p2k@gbm~4NVA8LeFB!M{Gn*r#4Ap#~|0%2%Q^okimRKz$lH= z!>cJP1UTA|USI0{{S6LuOdLacTp6oS#T*^@c8U)3p6#bl~s`ZH|fGC!WFD@E- ziDHgq?%t$N*J`!#b71jpcO^-Rnq7<*j{K`{m}Xd#q@lau)!1AO$8)t>ZBnCW!P2MA zJ(48FZ-Kz|lBGkpR`eAa2l~y;U2{zi#YK*_&A;9nRQeXkS6dw(+`aW=Ye-;FZ?W8o zRE}2{5r9++%-}H##|Cs47_+=hn1%d#!)U)c3~G`H@fOU95C3}s9uBpP4Y2v*_O07z z_WX%ebXuI3W>zyg>c^Y-i;T(GW~xmr4f7hbpujPZQBgGHU<%+(X*C0kaDoXlp+7Ie z=Nv4CEqk!FrRj-WTA0qz+BnQKg0P5Hyl1O<^!cd6JBVabQ8yP?>^0v!;@!~%d$dTa zRo6=qNg@^u6iwvCwjO17n@-auiphC~TUht4ubK95`VXlpW+oOo5j(-xk4=L;ha|=b zLF$AfTcRYw?D+5k7-Iwg+UNYQ0KTl1CaZNrrARQ*5uJ|tB^oK zX;mz|5xZ4GN)*mr&TB`843A>l2!RO`=J!+i`yZ}-;c`7<^K#O^LfSP4wikQ_Y4K{jze5RdRB4yU=|8BW|!FQmBJqj)J{>{8p`tGg9ar=&o= zLrS3q&H7`e3SU00Q>2eNv0(hK)y#z-sy=LwX`sbj641zd2Jc^oc-SnRqo>h1$5~f) zS}9$9@OnXlDBVP91jwDzc>`h7CQExOlroe1*nG=|_27{GPWL027yZVS00)e4S10Vm za*9QZ6n5o4dp0iAG>;T(MJ%f&zkg&iH@u4fq7`AzQ>S?r1!qEw6IThgwST{&90mnU zLUQ|C7-zS9DAK(2drMpp%DuPYnGs6_LmbDVSv`JVL{1J}?1s9GLu?rzfDO}lg_m1> z=lET`BGYROeetd)UjP-uKc~pSl#k{4u$av}I?OpnV!Pll0OHn8nxlbMp96IN*mx;S zfuGg`Kko3fpJp|t3FUh%7p7xL>o$ztsT9lfn1;EFVg8gjatA};!YIL&e%)EN(CG8; zgtFI!T$IB};oLyIq6}nmvj(ECM(cN0$QVe!NuhVrQ`6aD1??*019KQ0KIu&b`LL!L z6ALKe>~b>mE)0VcmTj2P8GdW8p6|nT+zbihuPzgz4M;T4Ntom9*sw&xl?>!~u+NAFpPv*-qsH*urd-ET zq}2Uz28wH4adg2{?XHQkmC`7lt>BKPJ;1o^CTa9p_Jn)^p8i_kPEN1J8~9^G7eLkU z&uz$pRm5WLin!V>XKROjCTR>83ASb@sxNX*)Iy5b+sE$y%Ppn$wHg6P9aDlETxiv3 z6tF%XDasATj|t-Wf!Gb8{eqXbXFB!)9&@}x1J`H-Q>XgJ!(5YpP zxX@>vBfa|ckvsz5ui1mB9nx^Jmer)UHYy4hz)odfONZ_B2wgAS* zQ+Hy5Y2Mx;oF|A98nmi$nWXsJtJ@A@oXPUhAR%+~mQ<#(l~bbHod2m+n&CL=v8jP< zIApiCH*<|roI-puw2wg!1$Ud}PYM|7ifCO&^&nr%c-QJC+IBKgC0Jd<<1}gKNp06; zL1ZelN7b^vo2K`6OcmmOMwA5FqI2$JDNN&fYq&7Nfn38yWZ^BQxjaL*kdo9NcZBx) z6yoNI>tb@ zV;mbZ>c5J>*4!*c!^2_voRZ&jMovpHbfN5}K#%?{7j%nN6 z$J80yab}$51^eDajN&E_qt*7A&Dtj^8{AN{I?vPnH?-a>pc0HH7R?JgwNBfofVDck zog25~i-F2D^0BKrP>5pe9a9ikwJb4 zmJZ3OawdC-#U-yk`?`UX-N^dlWUD#U|_$1+P!vF9B`n%C`9D6u(fG&*_~Yy2#lhrK*izp zw0J;MPfC*7B1_G@&?Nt9itk9iuOdBuLl*ZE9(!ismMQ~h`~=Dr8_2&ND>?3XB6VP= zxE}Di$pai_!Ql2K^|WQLRNT^%S7N#9kP9=40bAP^7DI(IOJ40M7YOROO_q!9`iZv4 zJaWKg3yIRE*>*L`Xi>OQuEA8#d{h-+_;ah%kt4&5#XzKi8KhGB&?-g6*9$Tgb9rz}=%CZe$= zU9UD91wkKA_0m8Mc)R=3k{?3$gONsvHA|8-xF*qmek4r}OCI@3cf+XA)wFt!kRUopS%@Y&2QJbN*_Iarh#V zC?9@J|3=&Sog^x$Qo0G4`4mGLmu~d}?0*d_EpF?E=I8sC2e6Z!;`uP+rTn1?ADJTv z68rSwfS}tu>{W|22z&CV%U6@XtLs{FG23I71+g2ihs`v1fWb-2867kqMx%oJt|kvM zq6Bjx7p@fuOg(|J!oqH274o!Y7Z~fGRgRz)g!rK0psjvSSB{7X%ySRY?zQVcMui-z z;*s$KI?V4`>zvA(mE&Sdbe7og5PMFX&8;{|Kh!uU$U;3i^`aFxQ^$&3Jbi`^{K-!e z!~`GHJ#&*LyVMRZ^1B{*CMI%R1rR#i1GXzFD_sN-nNP`8cclUd}Y!52L^HaIRs4e)N9Kbl;! zU!l1DQgb9Tan4C*2e{2a0dyZ?Z*MMih&ASB>8V^7>aG}f+q8!?b+&eEQckAiL)kAFP(T4?S-k1zC; ziZ_Ana7h^)+2fzTQ+%}d?1@hqc=I`1L?S2Aa95kZ^^az`4(@Wi#Q>ve+Kc z05QjSTT(fS`@UnYV`BWIlS!w#1pULi0WzF1l8O5c~JKGsm@ zH_O_qxkk2jBxmm1-dP7!A7PJgk8_kAvV^WWo z^K*a|D76w5MJZ0gAxRSUHY8$|BnVeX<1y5op*50Ssq6YE2~I;tN%qA6?c-`4q^TRA zdL&6o7x1_$t}&FS-^oA#;q~*FkkueOzvWinQyOuo<=X+zj;t-oZ zL&*^bCOc|h$OSP|2|e}4EE7tC36F7GF90ClghaE+$08dNvBf=9gF3P?x#JEPgV^i6 zpfcg*vdAGo)h>E!;)w`!@Ml*6txb>*oL2Z zIseIIj!Y1kJ%jgj`Nj6punz80q*;!fH;@BaZrLSLw)ykp!~`c7F9<0FhN|%*f7f%q z0t(lw1gd!n6MQtgg%i6r2!P*SP#9^xS|vc_H=Xj$R{rv|QzgLx>6xS4A;cC4fa9{$ z=&J7r-K3t4cS0Jf3WB4iosT{?)UbAgpRuUG{Dm2#4X9RHL!Tfmzywnz;(0xQ9nBgV zMYM4eZqM5WLsw0sNiT6HVlTi=je?!t4UT;xQeE0PPq#g8P^j%#2B^v zw5C~kg3Ftb+sk-QvoP1Q)_qBp!UdCZdu7(&-XXW7Kr;R+MXpK$+7^dNLxehu#|!|V z5bP?TKC&W}Y*QtV&J8yeiN!ox9JcLr7qv(jU#4&&zy#-M+IRaGQ&VE6UT4FUVPs4* zKN{s6*HN^e)pGeQ9suaj7X!m-Cu+Z^Bf1^8G7PA`sy^Fo!88=ffha_*-|V?{NOmYv zK<*PQNG|oG8Azj>D`CzB#`|j>pwChXQ6UnVj+)g*AIsQ=zv4aK;}r1aebl}dJvXl- znA$3W39zw_%rf5RsuD`9iX=r73qUu#8?u_*U4ByC@e#wof*=%&S;1@{EmV`QbvU^w z1zNd~K2lRLr`|`({bd5vD?QbT{s*P3^NrHSU*M4l9h<8FWM{DY3nq_ zub4qz7$VzTAiJl_268avjqzxZZQgmzu#1`06w9Ykx>@YcQ?H1GG-i5HhdELMD2&~%wQI%;{%8re4V!nBR=Qoxfkd19g zoD7VHRhqL7Og~VDKr(DmBq2g#O`yR%(V-F?(@is8f4Li zCR$KLE2?hx{eTpM5qVv>NH;15%`B4IN7i2^nh~sRW|Mh!WQbeSZ$p;3BM}s7$34-i z+1ii!F9Q>O2%?jms3aa~Mp5*_MLL1#LK96$13?q0KXecf?^tW2G9 zZz6Xc>sf0h(i9RMSxJ1JrvUjdR1>UwxRckwJJnm+eA(Y{bfRB01fC;{1YuEOB*VyF zV_kRnc?n;YF$yDSt&g}1c09e3y$HltJG)Git``)>S|<%%G+ll)7O}hBa=+b%@+>z! zUN$1HTHwLKkx4FQXA-!1SP4{kgXZe!+{{z!wMWbNe!f=C(>bS24$)*o(r`7g+=h=+ zY##s`Vk^}OQjIN_A`wLqo^6Qw>l4IiP_E#mvtuHCwdn4x-82k$Rcz(dVXsldje zz|bF?{UkC?d2;AGbO}Tdu5fm3LVirIpsr6)Fe6%gP)YDXTXTcY>=}xq6~BX%Lk?V; zXv(p!M{4F(cLb5={ec`^+EF-+k}z!}8ebZ1PXS7?)m0A0Jd zqamKnhq+T`)p<4+!AFD9!+rNheHCHJ8y6-(chzEkg#%M;Qf9MU+}`G{?7}YGg;0}- z^=0Oem21+^YI2K?Hc4sV4PTcSjaVbcHC~(4N~mF9wbMO_K*SuDgxJDR6C8`NOqG!e z?Yc~PGJ_3p=g3lq>r+`jpG?YfWCTPc?gVQdF2>Odk+vL546m<zmXuUVb39pPX4MQ#pS|+?&Ht_4us0)QsXFsDx$Jvt zg0Tf#(iJ?bH{^uVautR`%8ades1 zNpj^dP10$> zY6R&wlL5SpNQ{-iQ?`V``0b{w&T`@>oP_G+M>jl{u4YL(yGSg(PVQ^%%FgKs#%ZHz zx1aTt&+*>Qu-Y-Q8p)?wR~{I~qbNY)f`?GQyGqmOr8wvE@k%l$Wy94%`Dic{Bo+)P zd}aWAVyM24bT+SFwDZ?SIAV%AIo8jV=LFs-L%GayT-?$n#ZzjgjUevwa&d~{^|`iW z+!B1*07rb=#)?_`mugNluSv^#UK`hj7U?YB`l=lFK#K%6BKbv?La_IMlsNz)(?s43 z>>1XYL>Sn6pum-i+tq-Wv2R6bXi>3rq;xd5=vo%92U!e_mTsK4S)A<^aoyoBB_0_* z!04Nf>76PQ)KnN~Nv~-al;0o6gF`mwLW6ae2U#4nHrg!<5ECs%0)_m46nd9=5d3$m z`KKW%O26+5F|;vN26NN zE%ZDANWW&9`C_@+&>sTEdXbJDaqruWYigudk8aI=3tl<-!PBR3e?vdS`W=+5h8GTn zeqW})K5j=j2T3vkhO(LS1h$gacG#u|!&T2*EaT77)RAXO=%~6o!|UDGNh#}2@FNKC z)1Zmf5EId2Zcqa-Z5P$kAI8UQA>C$LfrhcKCu{_`O^R+SUmx6+IW!+_N0m`sb&8yu z$1KuC2>`6fXaKj6f(GE;xQyPCB<6a?U%xu@u&Ez|8)uEa;4)s+7^~!4-S_i=^ea3lL!Qm%E?@RPx6ksd%Iwr`<7D4pQ0~W>o&M|gY9Q;UIBGkLtw-(Y>0~l zCf$mwYnPWW>3H?xbe^2na6>@JMK-E?HsQ9UVL036`q&{clWX-5*qFCeM5=$zvbIiOcV$K?YV41TuB-=|D&83`- z2Uye-=V{s=P8A3op)Qzgm6BBP?u@-Du2;zs_mfeZ%jJlk+Ld%RjZiJ2gfqAY8+61MY!tjZT+!3YRIbxIFoX*t#r8S#10um5mbt z|3Su)_1k1pdxhbaRrBRF(Fs+&msu&+);&9)yqZLq{3$(VbdnE*LR`}(9yXz>Kev1{ z2|EY3lP+qFp}M&2qsxGkx7`c1{ROq*!jkq|eo0_;tR^#fZ#6pUYMSd{ z+rZkj66bK(mZgSE9Lu=2#)97XeX9qooj$?l!akL`otQ0Ttue>XP}sGY(;gN=8O{1F zS}!j<9EB2a0oNw{9BIPyyNER19xRF{aRQF{#39}Yf}O>EFM3VmH}vwxC4LaLuO258#iWsaFlGGzpsp9v9)sK ztMF8vI<+pymt(DkrmIxxo@;hg@OP@37_0Hv&G#4KU*6{460u|U1HL?LUk4HYr$kox zPcm?{=|0YEa*Fz=Q=1=EtMV+ikO1EK!x0J*&s3>))ydRC%_LIlmD?VA-8@@e^jCEF zmgLw<-9!GQ_2T3{%u4B(VjAWFDb| z8So3g#Uc!8qN8_CfarP}fO5DtAK+XGKv;@gDw2-;a;Yg%%(~^j2T{YLI{;0Xq`W$Q z4^3S!h1ZMb(+CHOkLTC{OtDJ`mOUpi6SN!#XPo7xf)gy`NUS~*_4^npO7dip&~xFV z^ssjF7$+b>JV7<+LytOJa88g3>^0(9Y}?>eN>5F{JfAvPAt zWeGqZo$huXd~EgFdUtONHnn|SRfe5!qJyBTA3AbEi3XMm{0g-8X0G&-QVQEBEg3FD z7NuVN{gblviwj`HxH7xrvxnh-ZzjkJ3A%-gG_=!I@; z6@7=|C>C|URySkp(JK*>ta2e@)seUzDh;7t*)b06w<6vlzEkX@v>u@wlNGQo;Y}#OW`FJB(e3e3d^m@5wjmHLk#M3A*S}svjzcqymz-b`baCU z-|WBIb-Ki_cDtQdX)ny{FrR3eFxJz0dZNqvp*#tIOq*^oGgCSAtTn^(_U>c7`r*B%wzoh-^#sNW)9M&md9&e4Z?dzUD9Xm_RuWfbvrvxvRIlDp`nAW=w$b{j zyS(M?rF6FyaycYmvLck8<{6t)=8a5pB7vCYIuMLXBnY+LVi zW+)a>(i3I5rLjGvv?U&UUmcTP&58@t6ct=4{WoaDGVn&s&0qS8xDf?tPHY%?namkh zBRJv+Gal+J4teoU-~`L@!ClX8>(4hn`yc~1$Gj9<7=M`nCVBW;$9b8rSyY^1a_LE} zYeSO97n|6%g`c>b)+e%D_hYqOu{a&)7EWwQ4ipwVW$%FI0D{)?1PxX&>6%Lyw&3nB zO+4#FD@VH5`DrJPBbH6MD!W0R@G}OME{^5Ni`_kUl6I~#qkkX9fmUxPF`xE%5h623 zkNnE&p88PDYdqxE=m3OmLNu*Bzkb@ zTPF&DF^0mi)yCrVmI&Iq>p`Sh111J-_oxd&j~M0vb1{C^i99(e@<5QvGM50pqdJZ* zT~nJl*8Htk{i&V>3Xrjb{MRp{{rh(|umVx4j{A8c#U<}L{YXH#)d*%3m1gAajAW`I z-{ya@B5DPLAzl@1Mq;p(g8hdvyFX%s=W>(J@mk*5=p<#VuX~WgAGxTysOlxQ{YTzFn74}h43Zu zA(+0_CUFzIeKQx~go$-cZT9sqYb4DQu8eHE>)FZFZ8FBr5~e?W@{p`$%ou<3^jJzG z5)vl}3ZGD`yHfX9M$hFMi(bkR20Li1Ao9s9bJvxEsoc5n>r*VYciqhS4{^JgkJ9x} z*9_Cf^Qa+BFMV8lw$Ab8BM~i^5)6cq>!RnT&d|<_2zjGOm^@3Gxr$DHzPR#be#l~P z^2;0*kqmB!+R$CjlH_FHo0g7+oz%`HisOyBLxkp&CcAGsh&ia5e>K|GW}~Ez2AMW% z+p{93vF30{rf4V-Af>MiC?Fl52~$AHQZ#?C5NN8px)dKY)T1%#4eD#{e@hNB1Z;PK z4Xb=|7X})3HtP*js!T(!fx*_QecBa00a=($`QUY+1 zfoT_~6W2Sx_%=1Tlg)e9x$Wo8IP`9@Ql zab4F;GPr?%bSigu;2rt)_0(cHV%vl7}Xbj^D;33be>BX|Z5C^>?EDEtr zSAvoNsRiuiEoKA8LWv0ZV_JFJy;d7&&Oelf5FsX2v=I! z_gBG~e;HxS)d;6Mt@n+@1>bF9Y{*5!ndn5d;i})V%Ns~F3#%*&*c;&{zya^aWVnb_ zO9_Sx+)QzNQFMCJ0Ub z2p&fI%`jOm zLs_a9?VnX0)E$4*I!)=3k2ZqiXpUpzYxSF@Pg7h-4Q%z#Ep8Oz5lu#{%tq!U*_^u~ zR#K*V+lb-H-#q{2VTwp*aGJKzSumG(UdRSm9Da+8GnS=8@@_&JW5Rn&>@f;A8Z$Mh zMJv&faWCZ(Vm&&G` zt80njnWAmiHMQEn1#mD0OB+$*0)g=xl8@b(u)iWe z557pUao@sW&N&;mH_;dmy7|Z(IJzBC+tNqazq)cQ%BS%bE7(o4%d%sfqaj;$>IUYl zNZ04P6SEro5*#%fBh*LaU;=`K>A}@JuFYWdoiV+n2QrBYB9W@H0zwd0C`5EN3<_>H;$9d#RTYBZ)f>7g&EYX3;a0Rzh{q$JA($0A^y z^Y=C5RUk7XxnR37w60OGtR_7&WScM>2m(<_<_1FAUyfjWsVT$zP{{wzB|*t>4xH7m z9G7>>w|6~oRsFvA>a1B$#Z%|!&@N}vu??*|Y{v9x=)y0KQu#gnpx0MQpIRqu-f^}3 zbe|r_q>9t#c1w5AstcdtX>oG(UsuwwqP3Ai&gj#*sPlPqAI>q3Fjfyd&if-|arW7z z#y`fJK6vB@>zK)^)9ZQMw+07CZaYS)dHesp&bS!txUbquhgzqKXV!#I<4Zf7nH=V!QYYO*Xy4e7HMEC| z#PGm9?BoWAH$9t^J`d*P;nVw0`=m?%bGA8r$5^QqY*z#*HS%^o75q-78FTjHx@{Sn zR;#Tp0*YQd9Dcit2C)Axp91=+dx-EWdnu?LewXpz=il1@`xu8lnDCK}mr=%>W%U&5 zt1P>7$e#M)>F>o;6$Y#xCYyK*u=g{82rp|rk-tx=-m3VU@ z*hAr=zae{KR8?2MzTHSkEuS&4y|PZ|pnsRJ|3*r62n0;Y08J`T0#;*UlooZELFb_e9*Q+_{?Vz8A9MbQzRQ9P&j`B+WgW*I zV)=mLU%R%%!7TVu+sTn||2PZ^D6Ea-u#XNaeso;?-Om>Se*GW|h`XfBYA~$+G*mxb&k@(y_*wo=RdS~2I=^td|*llUg0@8^>`e+AA_F`6| zp8;L(PPOzWN$s^W0Q#kqOvux}mVa{AS9tV~#;JyH$pS{HQ{_9jvz#ZYc~#*S{g$kt z&!^t9g_QK)tY{fd?E9(F&3dwJM<(%4MCia0RwAw)HQ{!7C9DrS0`2Po`s_CP^GkdQ z%oAhO{Xi66c_miYbl>cy`$>T8OXa3mdRUD|yvKcTTb$V^scYPRsDA|#(~LsT2=C%B*duQN{Br@On zV~8}}_m6*Sczr7jGVVhY-Bx!H65P#CtrYyT2G)xHt1ORts!<+EDEc(aY*(bSDYYgD z4?D_fqt~WMxkK`y`84eKTugl%fhYUTFrJnCgv-TfmMdY9`}t19P2}#5RO)S^BXZCo z2ra+izwGi!U%vioC4E-d$B0Q9Ta2%=MChXpk)Xly3?21H|Dw{PbM96akc5Z(RJ%;O z(au;Tk_FITaIYT}pk^jf3apoyv3Ac87=9(bgnPPLiF|+M8qdo7|VNd`F&_ zB9{^woN@b>*3`8mDc`sUmJ-qFs;>VKDNjts+I$NN0e!1T1q6)3_To$5>tz1vA6xk* zyw@$faxVyzc|<*Yu}xFq469uX5QqZA4VG{JpI(z52voi-T&nopmdtMjmz#fPsnc0^ zBZHrrnEZEvmU>4d;u>X4ogbLf;J3f?nd$B3Clj&fyp!p$hl)`YHn@@Q|Iq+h6=1Y8 zW}rjwGiv09-r5u>%%eH&*fKb)gc=4N%P=t3t}MY9WMfLw9V76~(|*_-q%&1bz!8^f z8TvY9?&mm^Be1ltjl#ijtze*JI%h4HXvdaAPB@=EW2cxxVB+#cpgU?J(7Gci)@C@# z9n1U-KAt`r&TNcYZmQ14=zfmz@?^@19~|xPtCT%O;fu@PJ}$mWAHGLK;{Qir0hC2P z?Vt6KJ(~sxA=Y67owPl$A04hl@-AEKM8s+v11zsEfC~ni{EOFzqm|B~e=!$&MJ~|a@WoBc+A17Z+ zclAHSKYu<*<*8)DO)PYls<2Eq5TTlX!@H z=QT65gLMzKUSIlcy)w^$@hLuduwzlR#ViXTlW{LusEFli`C_j=X!LU~FQF$8Pk8|u z0u_h+Lx^#vsH6qo-{5?|*Lj2M>Wv-7jBin)`=Ot8fClqhD}9cW5OCgs!$qLQr%RGB zW=c7ZPccjh*x~|@R=XFX(XWfvuXwRO*$c*3{-Yhkc+f=`S@)!8^+qH?SVfR@5B$@|8o-?+eZG;<>2l5#3vsAGNO``i>Vus zzz#?6DI9PLr3 z{ON3Z|6G-;K5rgSBewd>!1s7wz_}RYJ_b6iUk3~j&-Jd)qZqSc%e}!>^`OIVb@`<- z6ofY>U)OTYy9K*DEUHS-bHiRs&8YA$BU|Z8;LpaKMJ4iPX&M zS8}=lN*wylLHB&So}1SwoZ(qKefUGI?mf@}GmK;WR-#!M$*>n?QiM#qGtDka?cMjq-NBUQ-_4$;9zOJ@9;iX# zGHAP3GwJSG-N_z1z@%QHp|=od+w?15s3tkVy(qJcn(=_ar>j0e>g>Y6&5t&_$^uod zlj`YKGuGPI)G$AL`CU(UiD1?1hn^079jQCliFnydw;RzrSwRcANE}9g5X&rGr~nqy zmuE&Q|MI_MkRijlbsax&I=r)U{Iyf3nb8eMvl=>hlz=Z7B3}NW@cQ=GXTE&$85tPA z2}60?A7lMBpVpl}@`sr~6MS0e@g*OHd@FO#nUSR-b?M-P|KoPrInVfegCUzJjb?`* z4*dY;A?%E+{ zX-ar$=#%|mkJ+%u7Xcb>!%5F7Y3UzghpXh7=NTrj8uB(k@n)E3?(+cXY1_sCF~10X z%6nU*JgTci*fzSh9h)3|@0O1@B3RoA;ZxF8+x2cX>sNU-NiaJHNela7fnx>7VB zQTSQUZOSWfN;RYXoO#=G^HLNBbBg?a1DtqRQwv*11B0) zl;1CwmQrzBN23%;{j`;sD!LbUi%^>Qce~8U63{gkcJ*)~aVUe`WE_221x+Di7k^W2 zh5+lw<&E&G?qpT2S+3k7Cr+F=Q*J$k{uKFo3y3z%0_E&Myq8%iTI(W>xy~BtKi>Vt zSQ~u~H<1fIb~(+v4`~*T@BKnZ3sAD&sD;ONQcI3a3S)pr^oQ;d`|S05U1^)OUEAuK z{Bu@min#uccbP7*yGPS6y605DGgu#4^xDT#6PFj|M{3KC$9nXPb3K$uRJAZ&e*BG9 z(q$~0^bfkLFQSRmqn|7CLZ-R)__@(xtzO8c%6Tr0`+x}s$a(F;l~l^QpJ?$1Lu}rB zZ)9?r13NcVS&tMNIL>{qm_gHIRv+n(D1wjbM9PE`yK|$d_>cGbSv!S;f_S`*iZu7h zy~RqU^34M+;be}Cq@|pf(X{-s(h_~rvZFQwv z``Rw=DLXfnw(Nxi;?F1Xf|%BbKm*@jPV;;?n%iq3;0w0of*Sg6i=Bhpj8J~(1I#r=*P!K zR{S!%IcwU52_=^ATd*G(;pFqMz5X{%Z++t4BzAfLO+d203`D-`lHt&uo`jW1u2Ahu zePKf?Q@7&Xp?AJgNXTqB6n^KIFE_11R`%@Sj!>jGnyT769PiNt*9g4Cf4WwfEO>|S zuQREz12p}QlYu@RFvaWb>9KMt&Y=fykaP+-^Q8=E_&?)w?y3fl9ZP$`l77YXWs&{p zV_5#~yUwLXyqq8Xlz*dr=t{Q#2-4sDB(>W{HRwl!hOHCZ5NFPvx`lqg00`6WFW}R- z67U9Qyy4W=giWlipSfMQmwd=slVKdzWZ@nBeSZ0V`u(-f@h|n`Lx}>gK-w2>gE!yK z!;BvA0Apw9|L30rC_wtTY|EE48+%3h`NyoyD>MgDt)U+%;z03cCP=dXP`ux_}t}>3u9aUwHbOL89#z#H3iZQD+27~5oh7R(*5`vws-C0-#da$nPefAR zi%W=h zA8gwd+-`Qn0@$!?N|FPYr;De51$~dSotO(ukhTKa>lk)WnW*e;@1U#j1d7nO>gTmS zBUM-U47zqUn~Fma8s#+ng*zcy{-i}2rme;FmAQrt*=h*E{VwM5$U!=`%7w|qa|EEh zcs0ZM&YHKMZUdR^fm9V2Yn);^8U!cP)iKtJx^XmVE*M>-XzN*2AgS3|52zk_f5`4+ zZ~ZcN_7kPFYHfd;nebs5{X)LJs45W1?9=$`rfe=66xkRr!x4@$tS9n{ylJij84q2Q z{XO)HaHWT_p$Ac&=pfGCQKRtG!8=@}S(CKl+vZ^X_5%Z>pAJ!7SuJaX%fsuNhzxG@ z&=pB){Ts$yCuI{YO&$-)?;eyaC2np9_9NNLP+unrR5ggoLKOU*DcmqUhq)QwOc=6u zZ^z!URfB%V1^5g8BUjqP&T`v+wEd|z4cnDR9DR#IzXkG*hek;0q|Q51DNP)BdvLXs zRHUSI{IDQ6fBd1{0zCQKsbG?FIny^$vTKAgX+r(!-xY%i2}j#10*vC{i;lsiK*`)L zagxhx=-@oP_bn6hLy0=K%@mVyb9is*7a4US#bc}%Z-89~=&ISCXl!p;_|xy4c-@sT zRCEd%j)_3pku~M;og*1b5RlHpqgpDU-gxP?mpA}Z)dK-O?{{%fN#&# zhE$WunBTh^HKVD{F<{pFz81U3?M2#4XHY+8YE>#?r4TsttL&fyxIKV_(>Ws2liV9&o1Y9k&lw$*VGx!t1)dCdBq`{H@ziK~hIOXzzte=`&C9qrT zh~BNIiQN;C{hLN+wvUzif#SQAzDZ&4Y9;== zx;N%BYF;Rq)o8*38`pAfG?KLSUK_Z<%RwzrHVMRZIsDGy@6;-0<>l}dT*aW2-jl0` zM#|kDk5h*QRtrcZOFY*E(aKdBSam*(64HgRigl7m`K97}Q@G-G{SUz;58IG@IucQN zHo6{E--t2%_FRaG=RJ7ytKXjTd0ogUtO~qiEd8FPdC7j7<3biGq$_d1GASWyIoH4h z+}8sjZqA(TfR}O%@CZo^<1Iz0FKQ-i4H4yop$igK0AO{{7Udu_wSGqgfo05z0?`6( zsBX$u@ANNG%+WkC$5CGwWk7$=OxI`xOHa4g)a{f0215r?WJMMUiYRnsF`BCNOB0b8 z6=)XR$InFjLbMqx5T4d`+6lRF2}tdbcmMe8=kA%DuU~kRV1-}47YPuc)@5hLRqXT8Uf7wV)1Fupod-!X}_lm?>crIS|tj2!T+~6Rok(!Z+d17GF#b zpiaE%4Od3u{ITb)YfrgRxEc5+${ z_tH1Vy~aLN1kP@53w7Amc+;x*_84dv>Abkj^5+k48p2(z=B&+6-phd2%i-=qAj`tW<;skF6PT6?nwwJgTJQriCL}pc7bh27+UN-_b$QoTs z@rqcx_2$-4oG7`?bZ$NQ(jeBoPavA}!1HmQ_o1ekCMqHnF{vQ%+^uTu{~WDI=R*y; zI~zK(8=_Vd;xnYE)rFGmIgx_SwXhOQZjAZd^qT|h+ulStrwTvyPAssakG>B##P+F@ zDY0-A;#(+F^F!HXsN0?!pb+~S@#3#AiwSFSP2C^E7#B}7_T>&yajpuOb}Ba>DaXn4 z@3A{lPC>%%#Dxx zX#xsJ&(03LyFPbnJ$CVy$IP0i)pT=oU8_~somS5m#8*;rYaqZ9G17wc|Ll$dk#ZUY z&s(-NZXZd<1m6xjH1HGH_`S_K$X^$K1$muMJ>DQuRUS7 zenTgnb=unrVT}(oAU0nfhsfsy7`I)b&fDm=>Ki;;E2y3B z*8VkC%i1i4oxt$G2cNm$E1a2lWemlD!hs@yo^!yvVRFj2~G20a56aSrf>H=54Q??>+e8n9_Krz&RqUgyJ?WX z;0)GVP?FJ}+be;~QwcUafAw-wmFSwRCMwTGnInd*ih%`RwRuJO#%-$`rE(xw;cdKC zhAo=3NUFX5ny6V+FohL&l4BemD*a-3GJ1B|wX&|F^rLI8RF4-L<+mSgeS0L*KI8Pnk~gZC3^&*ne9i;vt?j8KSl-E5Wh4}%?v#qW#ZsuDad+% zAK8X3rmQO`IEGG*2+W z+Nk}o&8Olr(dp}wCY*4hZ{Yv=XFS5s>C%t@g!nk~1FR_h0c!r(#rYcs@9z{4=i z@vid(y2km^I1!%g9Hz=OXAzznYR7_I#>&|iuON%ap2tgx&i>esT-P%9pESZ#kIL_gb;9Zj(xf4c#bDkNL1P49UJia|IPsM)u&|k*k&fLJ zw2d{cPAFRSRX_TvH1O9t;Q!^d+eI=rrxvMN{a5T+w^|#IbS4?Ak*QF%U0&KokekAn6<;=l(;oXyC|b zQD?Emb?CSO<vI>tZ9;eckbmk-jpCjSdCSNrP4ZvWZPIsz(VdfjT zF#c%&^Hl=>0S}o1U2Ws2s;&E09W6ZD(*&7!>mX9UDwP;QErxF3x5?)aw ztCvR~)I~v40b2R&3+0Ac_N+yRKN#rBY4#0u>Ng*ye z2~GP!>B!6!69Eux@<(A zw^ETXSsYo(OU~~XWzSEwf`DW@ZLpzy8Pzt{nSW6znzGI%%OLl1dE1_bq} zoJ1bEQ^O|9DrR{yM5=C)UUx-y1uW|8mMQ7KNGlhaZE_?=9~1^37QlFeAH5p$Ow4cb z6htsi#f<7CAl1i>Cs0+X1vAH0W1HG$z37o1;y$HYr(%wl7(X#wHB@LhoS?n7CD|{v zVlgQqXxeK9T3YvluDMcD!yobB6P0}OZ&BteNbQc1S*N$kwr(Y?(l!-{z-86>C4E52 zG#++5iO7X>5e z4%u31D=8W`1Pc8IwO|kcy#f}HZLJ-3(BvdK@Y1BiSao z-Sc$$3!qa`4;RE1p;Eo=$w0AvM}-y4|9z(i3KTC&}wzz!NC7I$i#Qgp` zf6emk4c2z8y56XUE&b?k2B5`jjy)$-1X_(7$xnhs+ctVsssn%i%5$P0K+z|Bl>2tw z4lwt^`3%=5#yv>mw3b|jFBZ871bq1V4B=f|2eq~sW_7~;r{uT+*1nUto(oJ zBf)F1AUZXfcaxxe?nP{dMB*fOJmZEnMsvXQ@g@?aKA=mIU()s-^VkzToL479ZxA4cl(yDDCIK_b->ts|@5bJj$0CrXbz>fD+8 zF1L=pTOY4}?6A>~hZWEn`uFT{jT8B{MyXNGkAK2%l%g)C#!#S(x<>qj(1&`&oMZj^ z)AHO_DK>ZKi!!>cIxoy+#O*3QZV%@+c~4T9Pu)7)J zV*#>r+KsNy+I6=(H+lfuw&$0-Fz}${-$t)Urd}QhY8CrOs{ifZ(PmDVU%<|DPF z@Zw`49-YV@PL?@FW)@sZ&=4OPkMyfnWp8AT=#GX$X(5^1BgkDZQbRwG-h_RWZ6yX#t@2+jF7B7bxB&XSbP z+2K3xS$;3o^HQpeC>7_Ly=MAM17R)zmWU&~1YA7!7|9oFP3{$G#zjnoYjETU(on>L zu~dRH;3}$_&>f_uO0UYmb%J<9nnE`0;<0>dJlN+!ONm{+s5MyRtLsWRwFi0zlpxQ- zvbOA*#ZQkt3YR&6kM|$^>dH)%iu;IsyD@0$(|dZN;7^X=tf@}+SalS8THHJgkw;bp zqT*E{Q=R1-g^Lk}*~tULt=$=IG+PZwLO+AOSz$c~4VjWxzX$7lKj=8uv`d()QY)kz zVl0gtjk&`Uak_nOk3w#sGh;0_7W;Uc)Kr97kgd3mJp7w1Rom|dhV@utVZ0YZnp4#U zp!fATEly1)n^ae7Olam4`2gcYzcwiHZ{x67z*$5TO>a1ksBn!ke|WuqL#0$CO5sH^ z5HmnAg#bM8pa%5_!-G|*(7)eqwVK5^CLILDtFYvvWeRE}#UlzFcxbWw+bDGNFvx~cHFUtI9qCnMHvPop&+!^klNrvHK-OO8MxfYFcL4WGiR!+sfNCK~+OtSPzq zULg(}**1bz#2hnmUe(tgx8(a}lHFXlcKWYhnA^Xl*k$jf=h>nqbxK)le)QNzODT2fxWdq?DOPJqHQ{Sar zOsJTyY0S+ZcRtRBnr4hHDyp+#nZORv%%Br&Z7x0c11}4q6g9^zhx3J5vug4*KD(}w zq_gXZv8;PDWe2s*6al~C9xp8I;3ks@xg7*o!wn-m!~)O4I8*J>e<3DNst@Zfz7(`* z6Oc(mj)y-Wo7_>Xl8;AGw2~*r^lryT(2}d9wHT3yx`-f2-1M<+rS@q78o3&Tc9eGx za`^v@{z`bV@CFE1VKfXqm>A{UmW!$l2ph@!tVQ&4%Zo+Dxy6l#|4>)Ymgf|ib|3t)sQj~5PZ6>IE7r?*r!aqI%r6WRN|z41Obnq2L~={96olh3R?$8jMMhr1$YG#mN2@? zJ#bDgRVGUc0+qnE_V>BhL+qSs27V5-S&w7vw2#;)BUHlh_) z6_2wMpYe0e9Eh_u;_ycl1rovBJ+(+jpQ?2?;KY}RDynqY&nbvs@`c(-Lfdt=OxAwK zHu@9(F%i2n@fch+BD*ZfB(}7)yuTs%>>A}+&s$FsI46>dc#xu4pvBP1>-% z>lCY`fK4b}kD@FAJL!ddV*a-0cx+t_MDWUkF;! ztm0-pA7;iHdxGo4XC?F|CFig#E82Nt^05zq@m|SwoMiho+Px(3x3aGr?E&qPahH`? zpUJuQ;G3S`B>?JH!&gQxY9>w+v&Z1I_jCYb>#M9O2Vjq{#jz!*L5Yd$p-7M{NOtU+ z8EU*|Sr`qSFv$=7#-M)F!6Dk*C|lKD)2SLpUthXAKxXTTAP z{C~+y479jX>tWq&uJ*LeG`0nx5H|mYiQ9f|HyWvpv^{8To`*DP8`aXTcYV>yGTV^>qlR@Nwo?!yomg3*B+)3Xc~wo)y(vHuhVQ`rX*TfqO`f0 z_9ohFflTT)!?Jn8d`d1Dzm!Sm3o?W9<^e3h_6oj;RI{ry_Co%`BT zz#V)3j=O<`=!L7yw#%w{jxesLj)XeeB8r+!QMH4vrj@aWpL6o-#`$zqpJwp+pez1QkEoC_6AY~%C`Y>LmY?;cD0vJ$O{*8d*er-5n zObE>K0ZVeu44DfiXJo@;!e%%lk|CMq!JLu8qTCr+(!QgrfB|;aPv1OoN)*aJ*B5Z` z%36mP-E7{>=?m)W6_rPXto}9CbfNug+ZeBV0t=z}P>kyRUHnR7At+Dz2k(PwT;gvU za+m{cIWr2EGjh^WR%B#J)ierY+FU%BAGmCM#}l;~re3ViY(8RQwz3{V zfR^|aRy{9jUZ*IE@vda5_`nGGdT#Oj2V>aS^UO?Q%|kcqs4{}_qt7!878~^R zy}Y7VHMNP@yW36FFIcc_a_LjW`tOOy*lb6QLAp@jGv`=h6J2+(xp%jsE=W+>0%mZ4 z_o6il5eTLp-M;BVmPQbit!V8?bZR+V*G>8Z z(1kiN0O#XOp&%+iOo|BteimS9Qv#Q~7J%h_8sd(6a}@wv1TGa2GT#_T_3n-uJgL*- z^+qOtqqZ#wIUes@;7_Pze{~NWm&nO|RvQ!xI2DKkLj~EcfGox`xx6xTYAOGQKUSK* z83BWxg>s^c;1z$nQ<0$J-)l-2+@FM@kZq+|x}a5R);Sgpnf@9>bvwzl^r9PQl@BXP zbbsRUA97}>jOreO9vavYBinIz#jrCKe4AZfo0&UiPf3`_D%^2cI;+Heyp-Z&N4`+s z2ABAV8>YzQlj)2{8?Qdji`B?@z#-k{+V)9kN&U8S!*Xg)Q z?l;DVZ331yB$RKr&6!7MeyS*Lub7ioEKbh&nTuImMuOi5u^_=aZZ~U3U<=Zjr^Am(KBfGD!hB{eJNk@9vzWw>M_~I){d+6$skotMkec!jSKk{}U zb(MIY(UtR1tES2*S*ApFy(%m5^=>P4WZ;Cuc#;uYF?K}a4ictrSmQ)h+A!T2ghm6K>cQlV1 zEtMvz5?)IS#Bt_{?I0x2^aYyq>~EOBMU~t9&FtmP0}tf}shJsTK&akwYU;7f&9*gSwA^Oo~+GB&8I7gGYlb`aXSMyr|u#fB5?ydZ>h zy$(~9ev_4REIShdUHyTi%&z|2&sSlY&SHZOqV4oN8GJ~WX^sZ|%S;KV>Ra;&`39>j zZ2gB8BM{R1>bf!QZ?lceuaDJ-e16v_=InjZ);2NFNL7{PvhL@jcPguwnwyn@^W`@N z8nc42=tazddPmYG4H=&r>A>;FIExJtjk0A1n%u&!ntBa(3Jd+sZQrS4WaKIm%mDqSPjE7B#a*46+iSES?rDW zl{ODHMZ=0uSWj2NAEV%ipQ1fyw(`cs{@`{I(_{mfD+$IMwCUV!`?<{*^~!5Fvmfm| zilXRZlTE3|ViAwfJVVNb;xkl#sLSv1`wyL9Va?Ks*}HdQr<4vQW~e?{w-9;+G45m! z@SSBa6k@&-5!J`%lG3hhv~=t^A340Q7UUgsyDmfMbqH*Cy06e2iI2~4!l4(c8?KE& zZR3w9=d6BLB5@=W%}sF&RDdM4xaHRY-NFaqGsucdcJMlXTsbp%iZ;Ye`%97OCqY)r z6PHY`L3!4xdQMK0S9Nqf)k&&i%ih&>6!#HfDJ!ps54-PSt!|;0BIj_QUGMd7`*+kS z2h6U<$_%I@N(6!TjT-+Wc&BJmC4m^Jq)C^7wByvK}ls(>#S^#7i8W5gFBk?)-^UP;8G?KIC- zXDU@^M$*giN`Kp z*++A1Tp^2W1%Mn7Zd}0PWcAx<8K;qRSzQbXXFkQ|sY<7pyBiI8VX2YSmF9qg?Uvz@ z=uYP!oa!>)d6AM&`f}7An_39C+EdSGXz6eXm$o^DeQ>`VvDj`N|GK~%@qwml@Y-J- z?3WK6y8}Hb)IJ|7V0zMoP1nP*)egf)_hLKj{Mr~&?>PdpMxB?EUOt`;wn%zGE{sE- zb-5+lW|!GDqDy;eZR{ZDm9=^WX9AmMYH=%UBv5Z$7N=NNWm~Xg-4xZj=@n0sRkWqh z<9AN0NS&||-ym$e#YiFYF?Gp~eWpy`He49Dhpz#~ugf=V-)g{|K=ZgdDkgutn2EO*1xvo2kptJ-|YxdcXzoSYc;>0sko_J z2`TC#+RIwfocO|oT9Y(7rYA}!Q2uX$5nK{Oy7~aEzbwKC>nXUi#@5f7LkW=b!kuDW z-pb-fh|g&YPXgF9I(**SfOGm+pZ17b#adG64yQl4Db?mI!WI4LmMG2zx;ofcmB4MTb~si_); zDoLV-F-#B%y*z4EAe`fTU$oDQN0I;PA!Xa*{ll-zp#IZF2zW*TnAp5Xu`H$KL!R~P6HyQ?s4l3Z zMj>7mD3vk=`IQ(}GlLL#C8GA@`1ZRt9hpEhlBle1iRc4;4IV2sYs1x!D8m8FqXIuS0BRZ8uhLJzdtJ6|QEhNHbWZZl6 zi*iCA--iK_i{?c^D$5L8S-~mNNEOzq>+>Y2G*gt_omZ#D3NIrazlA_*STZzJWFWCA z;c1;>_acMMIjCCpRb?c`7i-noD*%dKF9tSFgqXz5_jc3Jor7j3W!sZZrr$*vE1*rz zMRsrSpgnnnChN#;LKePA{e;hM(hM+AAvs$_dk#0vN~kF0{}z5EEtIZ0{-nnz5$bJW z@a(pEZR`At*_RU&sh18@jBr3l)fZ(H!R$gyV!b2aCY{<5g|BBVnw3W(XG$u0><*T< zQ$k+?Ygn=hsrkzu-s8cz{l>QLwDd1MZ&kXP;)txj_*;hK=K(X23|w>eqwj)!W}j-wX{+Q zgkw24=SuS;k5SGvy_6ie{LZ{mpcl@NNk(j4L4h^+I=&E+T3e*ktqeb6fpAACt5PRY z4PR~xTPAZf7mN2s)}Pe3px<;wJU!oGMSwvOv1qFi!naC~S@LNGt2O76{e4 z)CpP4P4eOUip*}Bqzv&gMG^q|^mUwMdU8*LHS4$o5^-_+UKu$`R`PZt(jP}6if01Q zW-7-=#06>CIk#K8-`d@&zdzNzNN*-x#QKK4n15Xq!|(5(&M!UX^;i@z!pI;XDl7|_ zKq8NggbcMWHihmgO^_(rBZ@y3z%ZG;zH#^9m#-p$>U6Y+5BvrzZ%tvLd+#*GCY*4Z zyAQ0Irm*rr+tv72$2Uk2eIy--arnjUWp!UnJ-ORem(`m!cctcLHe()@G-I)YErl+2 zRHq+TcJY{`nDK_V86#FK9F{!ZE)I8_vE~J^XA2D+F#m#Jph9Ou_E6}xs9@w2~ z3D0-ML(IZNYBk(lW(E*&W)qYV9ccBH;!;*miL}QI;?xG0S<)X)9to@ZC(217Uf=C? zxP&;92S8_X)a}RPqqhvi^V(3fGjgMu4$BcXSB+53z#p+uZM2;Z@Pg7qlePk*Ol81? zfaHjXWxQO0rggU#l!lto!W;NvfM5Q+RybKY_1-QQjf1hIMz%heS|w+K(#c3gw}~$u zcEMi|{~wVWp1#3|aC*Z5E6;JFL#H0&bhbjklmzH*X{n0S?GnS|08-U>w^J2`1_-58 z*BabzD5?PhG?cq~>ao9TC;?a1D_yD0-M8-oQ8vzy_R<}|JtMr~J9sK2G&KdqCr3Bv zx`;8(OVFayMm+p3&x2dZRfHlbLPvTZ3i`hfTT`XZXGw4GGxiEi9}DXX)|O^eM??q9 zTF9PN%)NM#nP z;4~Mc*-T7Xv0}-?OCO;}*2+y)_TFIu(V|w7sX42{->lTeWMf$=hQ71b9YlOBbZ%b&~!-kd9xKgr6-i{L~ z)kSzYGmCC`jZ@whA=9q78m`7iP$KiTGl%-rfW_i8xlCPSUCY2W&b%04MjF$$T@@S8 zG)8rMjS`wETZl{(Wi?2GQbqJSBpqz;s#p;b7P_{j&)-gnt#6%?E2Y;%ULA*$#@S~G zEv7T-wftXfZ8b&VWhyT`wlddjq1#A#^NUqrs-PpUy8|0#QQ#aV1;&{+w;_j{QhttUMdnJvWobYT}9FH{GTfXx|= zuX@JrFWzK84tLDXhVm_?hs%g|YDz3P5$lB1q^maJL!vp;4XgfPn^}t{JR1N-*l`+E z8R4htVeZQptLjcNi^mRuIK7i_rR|Wt_WL%-&G5sy~cuCUw-A{iZ|r-hP_5svW=uzJr(1;9bvonbZ>$ zVf*vBp0*(;>@75utQW`2-AroOi;J+&Y-d%irf{`3CFAF)8|Tl9Z~CYXWWtKJqIeeZ zAIRW>u%((!`jLzjZuWGSuKAPS5uU`{lBev_YOLpS<$VQQfn2~p6aX3f!7Cv!33BobzgZ??@w?f)pqDm9t@ESZ8Wr}5s)^g}NT$=O)>=rQ9I ztLM*rYPM*{1M8_7wiG69BVXxszGSf^uW{)D$I_9V;e9wx5|PM)<|NW!`VeelAwmnK z;cgiYfZ0%p7ajKIz4y@rv<2Et6OX^pu5B4w$S4nyOK~{sS&{=wJ8B*2b#PQwrXh#n zB^H^5vmk55m5h^aF6K+NOxZC#P0~(;^9!veSjQe|oTW`RalC2~Yz9(;j!GAW_jd$O z5NlOb$Kj*}9ZaR}^n!pnS7XA}jq8t`yz=a1mwGLyHTRg%J91C@o;5BDcI+uCHBFa- z5NyvB36$MT*te4(iX)HW16Op9V-Yg>q(7gsdN3>a3~eoH80yTHbS^0^w`<>0ijp!5 z;_ny^Jj*rw6w8tu>_zkK?UcPVz8rKDg`4a~l273XzKW5e3F6a#m8j<#D5e7n*Fr-x zX!Lo_=wx?<*XAzWUk&jO)tGKZf*+Ihpn_a`;JkL3E%%J0-(F4!mHVp=`VxSt+9hqR zVFss-F!BHDb&g|lQ>!>$O15)Z(wkcq-QTPC60TS`*-N6g4?2utL%9U7O6q$K8UxXQtoCL4vy9z?(ye2biEv;z51BPG(%DbF9W2ql%Q`}gYIxF5wD z{Jy(yWJc|Y>4VYx`yCeo#_b< zlyKMx2vD7Ypm^hOAMqtfNiDCnw(WtR{GmMB?+xBNhbLV*urq;V3NB%5c?dZu&u{II zH)CKD38qS7@0O+FoEBR8_4!M3v(K@(mr;+OthCN~rXIA&;jYN&az*#L7mWHYvJl;d zX{98m?OY7!&UyG~+(((FcX9AO20|)M@r9)YcWAA!m0r64gGcQiIy0Vib}p&7z$Ou_ zOT2JRi0cC5V-I= ztQuCc>dj994H2-8M)?JHLYw5QzE|@}b(Yt2sD=6cLDsUUKf?Ai7v@;OiF*kzNdHNe zNF11~S3y=7D{HL{G~w=_#%C7Gln&(STZi>nP$h9MIbAIr5=6{%yPhA{U{eE1aRx|CI)_0TAzteW<5Y>{ zj1PgqQ?Z!lJg(#$dEY{~o^a`YaoT>L$0j=%21Vt&w=b&K<|amjh!}nM)*B10lhfn& z&AGV{J?aKTVR!qH;WdMM^?I&FQ543*wDhzkRlC(F2zfkajO?(&#^O^}!+K=psE-`s zGeVD(c%kIOtQR!u4R5Q3w<9nVQM(kabR3VzFTAsp;fh3_!ZB*S?@zWiB_&Ct-I>_& zvRLu`zPguYxP@O{8-&dq9&6bdvYi-w#76{b@Rf_fKZ#%1;|wJYVBwlbr9ORXxXp1d zp+YJ3VTQDOc>XzdOMkVw;Est^m7G+iXGL&^0Dl1ZfJm&Ay3ID|d^(fu3 zs2EoHL6{56iuc8(NJQK}B6>9>BqdzmxurZO9GayJduuS?qC{ccOS`zgxcp`zEz=!^ zbrFj$Ue@Th1DzgUe>Cq25ZEz|*XF6z0Wn zS{D5AwX2?ATev{g|94_U4VoZJW4&ccH!$ho>gG9s@JBvA-rSjTOg_)wX*yAzIu7cT z@RcdGa;%)gDc*RH#>~d|#_;|@YJ5p33@kSk*lj_VvEA!^n>7livJio(Cm$;xrvVf? zc{EqQeTe6{c|DRFBsH+Nw7;=nL3d?HtB3l6H~l_4a>6v0oWWz+mv<>|yzim|OugAL zqnS^R*_CpWu2)h#cRx8t4DB<{iC7gOn}dKiDK0*-V)H8Q4qv9E zk0D`bDS3?hY@C{$9JZcGOfTAvoT3UJzO#j)}pZiMiW6Rl_Un*J7AY?7o zbt8;fX6U`YRAQmPL1oTPh6BsupKX}9oEQEgh&{EW%4&^G+5$pNFX6swv!b+)N>J*i zi2r!o*0S4JS@G$8FC>sm5jxmLVGUh7JlER-C`b~9d_eWr8UEU{S&CBe#bv%VRLe&# zJy<7tv7`$)cJr7G6!xy|H8r_`>3!z|l zpR=MiHQjpH0fe{VvPq*jKr_YcSF{tGli|Y!AY;M)y=>K2#e;w>jA`=TQN)yCcy5;L z8ycG~gi{-m$PcVrS~rBORYB5)8{n~St{5B!%v!7%Td9R)Kqr7liE3V zWq|d0>XR>2d5EwAG*msUWc@^y(bxLdcd(fdE@9}>m0C!0&nQ>Z=AA4NAwB!eOu(tCO z7Uxo0;^a4N%`R$A1aMBn$(q@Oc5{B1a%*{9x69e)r}l__(F3q9jI}_|lH!k^d1C#B z1aIYFd;pk9SLIm_Sy$Tqjd}PO!@*99dYk)o_H3vZRhUKHmiYZnKoZVn5zs260;NjO z1~wJ;C1s&(#-a6%DA82}1oJ0;O!xJ+M*+JUptG%qBaTYd7Z>4e$o%WUq9! zO>346#MR;MBZYa3iIeygBQ=MR%GM=UY1^>{P!lkA*T+8W&w99-0V-fX8yhA^QSoui z;r#7aClD2Jdp!RR;)%g~$P>@Zz&`Lt0;fkb?(a^Pt%9e&L1%E#*ZI@3j`rXM?vp7B zmqI_0DAEfS4pU-sGN7FY@lV2&PqCBMOKTRF^xk5^6X_q0M3T1^*Law%GqMb7!9!6W zStLf2HKtxdW@JttxfnNQRvVuC$f7^Z{UW1-ADPKw&jBAF68K;`8!VM35m&`_Ar}pK zN?@7u-_6dRe7dkDK+|ghPY6=%Ir_HQS}$!QD3WlN;i)z%j`5X)#>?iQt)cNT!EYb~ zB^_e`%?l&om+xn&vjq8!$~I^R6IgF0Ak3BHS|S4g7EoShw^EQ|qyIi)o(M;vgclCF zdPkn*X>P&HA<-4Z?sw4KCIY7Cd~Nw&o_K;5x7jT7CLLrf?3ZY|=|Eds9D|m~{Q9}@9;z&()zUGtu zfTs8exI>Xv+FpPIKbTO5wBvoc)%e9+iMY#RVbOsTRfxVA=shMkN~QZmzZg@J#0vvJ zx+(&SVFbrhZD32oJ8SJK0jQO%WFt<|Ba_8+5y6-QA=TbY4D&bgeCbxvox=4TRbn(x4j$7uNQRN3;lt% z4zDx^uIF}v@@Chmk96K6=G{VqF3IcVl;7{C^^9kZLNiyv5oMH8yv(1uE@Il65HArLUbi5fvsOgnf!@&H9Zy1#l`G?ge7XP|Sn3p9XW6Zt421CPjJU!cGwcT$H%DwZ=W*jN&L##VM(8tTQSQgS&_?Bh=x9(BemxPG>B}O& zIUE@iFWF5hkrZ?CXa+HoP6tH*-@*)OFenDm5m1azlFRo`9 z$BsA6Gq#=fW$S>|GXV1DNwE2c7)Z9|GP-)L%Nfi4vMG;8*1fVgnOafJZPvg@=BjdZR()u#~8dU?~@j11N+555HMe@ffFnCIgZ7GW{+O1IAJ6`OEJpF(XJpvkOq99F>FyZsKPwgCZ{vp8?JAHG^mipF{%x)^>zbFqJ28Of=A=AQBj*5kGtwA)~ z2ccvZEh=RS!Va=Gfn9}HBKi2 z9xgQhVnLM{$0XSr-7JJnhyq>jJfvx3#$rvtga8)1pjz7lOpr&o<6RvTaK~3RyUcXi z@c^aDb+H1VJ9KN8Tv-0sCSgKaOQ6$0$xcv&L^_VD;|uP+leb>u*XsaPHk%G)Y@WBlf?o8{`uDv+f}Lj zH^;aT!=6rcqA8H`gsrt7Y2k~p-uu+Q@> ztBJ|Zc9ig|?NDG4i0!hS7*6hS4l)Ywgr$1R_reNrzA;=PL zr)?41VdLq8>3v0aM@hE-`pduq)?@2~zR(SxFi@m2tz7a3k2$Wf9b(c6-5m0gl~zD^ z#>m8t*7R7?8FTEe;{wA|CEBVK^lXvy`052TE*nc~QF&ph7h$x68-1eRO}@7akv-^N zZbF4iy4jYzB69sP%GrmwtkLbj>87`GFv{V!cp*L_Udxi^Jo*k+pmzHwTH~dNO`t01C%+H-FST- zQd{|K}^Q2#>9!(@1RvXP8BsJh?Bd37%2anxM zE-^H%- z2uX5QnX8y+Xb$&)xC#*Gpq_QA2WELEH5J;Zo0!ZG(_P7Ok+e|;?*jsLBgWl{N<3=o znmXLF!rh%*#F`7sPE)OlS7)NXs4E&GlmJ43Kry+i(t(H=`X8`thWU7)Dqzecub3#o zN2wGAg<9-v^p#q96iCDEF#cjQ^yul3Bm-o#eTf3zDFIY|J&|QJ1;oG;+P)LAKaLtc zhVtHUCN%RxRZsPeO@HQZ|K|DAim-2wb=;HLhZV<(h8D$W3XO{q2757Ho_*^QCXUU+ zvDB$C>0Cu32WIGyuI;T24w%wk%T%I~#t?F5jjm@^t#chUss($tQXp5)ZyT4-jr-ZV z*i-nMmaSz!oXKtM@Ey;^!r?I5!YafF|Fcdu%@Vpff@p8wQucpO39p9DKv*{thKOb` zB*LIL5lL45y=zPz))aRooe*Ya(E4i_J*c_$E8n6zc?CilI`&2-YT`A~y;mQyLGZ5uJm*(zAs zO_1;EEp>{xsZfc?yqdr>(HgZbuC_RMDO`GKVxWDKX8qKi9l?bALdeK{KMh+x=S{G2 zY0TcMI*uxd)jDG}5a&G2LcjVr!xWzxZq5>8h5}vBqTO~+YLeh~3f2{kJe0qtrl|n|HIUud%y02*M&n>fs-p!X&?-j-sFw8xHvp zm4j+XmX+b8Ip{>DxYn_{{gVDb6ZsP%ST72-yoGNs_v<9AsW^iNE&ac%-rN+qP(cDc$C8i=3wQ z84j0@Zg8BFvb~U&26i4%yo`ON^#+czI*Sf1zrPJ=uRdMz_pX=}z%nVeH{+iB?5ez9 zGa$wGs5h34O@n(v@biQ2vXzS>z6Vd%1K5i?Y+K-ALWKyD!(CMs-1#?)08}8Z#%v>s z4v9}2Y5_WgBJGJ-KAsd7boIy4^GMzgeuQfauY#COl)d2;uc}qu%J^y9LK(Rpj9v@# z@%_)$v&1E$$hs;;Pj0t%d=2{RWjZBKs?t-Lrx?K?wyJJVQ%ZhkI^_J$K@e=tbmFO212-Si=mu zSmh{7^8iLRg`XJf(VpjmL|PJWecLX3@63(Ow8a~dU55S{?MZB67qdWEvGl0%Yq!K- z36fIEW8Lv1My)y6{&l6i-pwlet*LE{qVL2I+jMA$q)9-^Vm$HW#OVvjw8RkuJ5XWQ zn%`aU&K!cX-#y{tQ61Mb@9+&kHLS)?xFZ1nvoOTv^;KkNF|$Y8uz0>BAf~91*hI$~ z29`8YVzO+N-D2;v>&Yozh6mLhOJ=__gC5Un2Kny3*4vTCs@J1xu8ee*<^KLSrfIo+ zCDY<;5EIOKYI0d6Ipz>_M9|16U|s;#qC zzvLbMwktg$jA+Xrf;9{@&L0R>&7bTP^9NTdx&SH`UL}-}VyHFdryfp$#u1jDw@!4n z^-&51aaKnp9EC>f6NQl0|1fAaj7(wzLkooCFvIER(PbWNt{-ROt{hr*#N6V0s{KGe&&CLj)?6@0Z z%iMv3H^vSeyz`uA{77Af{dhRbwS-7ybFBT%dCC`bMhTg;6`<{{wG@kQ2z6UJ2egPo z9J4@J`tAQ0xnqV<<8T_iHH@ z!S(6G>lkpZJRZnfE7VKdj7V~-woSkaO?%6MXGaalfS}DN0s#iJX__IGQZ5S6bgMO| zXoE;oRYOSI|ZvfU`v@Ew@-im$f}l ze{njXT57TN?&M@`ChWy?Ed*%^hE;ML=ibTFkKtpgj#oN|D1)KH?v{JI`NT6nApbvJ zVA9<2>ClqwEkAPdyf*7ecU8a1x-EK{-4QaK6^)>|?p zl@rT6-CV1oh8!wbCn@8x9e*fV6@>%orXsE{FM{EqFfg5JkKbM9sdh1n=BkAzt->io zP>zbfT86_LjX81$I!e+(k`AaK^w!)4AVA67Ts9q(XkM#Tw?rqw@(%39ezg-TM$&7M zLmj>nw}2za+j!=))pyF_xccs7+lrccF6-Vg*HZEwO&A+I)C)h%>F-`19BnwX>}kQu zrh(XYG(r=r>w@DRv|GL~cT*0+V`cRe&_YCAliv4^`QkE#VMVYs!9)3t=P>n?s(M&S z9i&XpEf_h*J&h;v1nLOied=(FouS$0RRsn?H?y$``|7*AUMcd_5H7`pT)e<|QcbL~ z90TC{5bmg#kZug3B?s(5)exrLs!KR+x%@DPip-`=t0tTjpW$TqbxCx$@(5FpFedPg z8{B0ckjB*%dYO8Zc|3?OV4zw_f)pLcD|28tWr@2?Cx-_T=jQC8pOIdd-`yl-Lz$UE zg)$zaQejI4yZ`_vdmJ-3ODNvN_VQ&aXu<~LT9d&H7{o3&dTN9J%ihYJzn3oZCVqfCmYdgH8%VzWw7c_Pp`3jrKHI+b(T?Rs~Yj5mS8-SX}7W2 zPN}Dj9&;hMYYf?oPLL=x_tiS`$NZD>+hqJXLCn!Bs!Up&I}9U&F`|Ig7o9?Jmnd4A zN@R@d0)kGXH<83Y(tCJt_|y;s)d{3V9Y~S|5MG)?R>@-$KpD2U%A$U+$^ak2d`rJB zKZoacf1f8VGAWVTs>0(srNZz;cnhYo-lfjLu#JO!se8U#j)>t}ONO#Lndt?FVv3+$ zPMo2vV?#7$*uV-nY?0A(XU`xsD!9M4j)2Ifc|6zPq8iwl(McO>D7?9#vK#xt>28>^BM?24}88 zPq8o--pHaAL{6+H;>ew4D7F$0PyXhijaax1eX6BJcwc^;g=`nkB-IMckXgySSUIjk z%;r@R%8`|pI%8B1e!%CG9w}ao;Qm8Hrv5T(_o*>xwqH;54e6KEK1?;uf~*;!BLeteikdFoRuro4b`E?AtE&y zL+Z#FuFYYuq7(Ghn%#&f3Lqnk3j*cjfTB?RCXEK+35toSM>67KlPr=B!QcXfVTT5m zhO)#%t%ZrblDTCTaPZKIDm)%VI4B?~KE{;+^SgrHJ@`4GgV-vMyqi1TX*hOAVP^#| z{F@(Hi#tPr|1c2$RQE>}OMIPh_6GjKJN(dxZcsb}duIs76(FvHs0wy)85zn44y5di zrCH+jM=P$#fJ0K3b3N6u z>}g1d57KL<&X#kzuTd!=UKBMw%InjIwD)zFohT8XF?E_23cHFr&2MnlXx-WA3Cjo^ z%w;=voX~`G-`HHSv=IB=UPp%@jGaq{$!o=@^Qye)U4VV^b{DILNl)K5yd(4J7h!UM z)+vd2IE&|^zoHIT(Oo8(IZD?W1rbV=)@>Q-JH?6LGWtupg6kds#Ug#ybbL$=?XkU< ze#c6m@-D}O{1R`GJn~?A(qpxGF}Hns^6DG9bT2B7oP3}fg5-p%ZeI^47hIoe<@Z1N71913__~Fdde_#XU5j5fC_#6cr zhYubh*$a9YnMl|qWBH%A)5cc}%j`p8k% zvEdHU!632juz6ZXPb6_8kA7(Oa^DuK5&bsffAToPRfZAt_*_S`SX@6FxaQ{%<3d{Y zd&g7RI!d*avVV}KPh5%pfAKbnSf!ZdcnC(C31aziO0|j>Ny`ID^;`8^#k0i^A&pRC6dfL+T z|9e&Wxu71M?=&~<_OzO|1s(s&xlDj$N|+lXmX(&YZwfB{vXK?2ynQdK=wPekv*3u7 zaiPawxDl|+nVMRCSAt2hVk>%pY!6{BI|TWae@35G{u#Aa%AS00JmeU{%Zt3eC|SMo zKhX8EhGi3ER1V+tZ>l%S7dWq(TS}7Q-tWilSNp<`PvI8C5n3LA z%YQj}07Pz#JRe1RoQL?w%Egk02EwVytdE!gf`1{0`_4HoNP=Z$EvyD;01JE0Uz@0gi&apj6enWuq&&vgi9XkApWj2&E_Q=k*WY zyH|hCNbpwAkKl`JwXz|P3Dy)k__3s*k524Oebu{^g)GRuiUK@HL3Sn_;c}#BWc6q| z))oal$$J2SU?3w;ux1QzN6O)$k%3MH25Txj@C<6R29lW^gBY<+eWvR{Vs>&PMRIZR z^}|E|7DLt>i7SGOnX>RTGmGZG90C>X!lG`*DIhII%DVQ#;Tq6b2_nTwSy*Q`!woo~ zT%}*tkK(NGKdeFN}-y z{qhaEz$8e%LG}L2m+tQ7%6rVJvu-os7widsX4ntAhT>(=Dekae#Kmg7h4asQkBDb+ z{D_#%lO)NSB}R3zx(+F+)#YWUtb8nnZ@k9Ma&0-#j51F=<+NVweJ zhv1Hdq?Si}`(*m&wCfI|43!>{&#-YT%}W?obhd2%{oK{BGb)4C*h5iZMszp_)`e62^Bip+XX`S=)d zNkinY0mM1<52@z$lZCn1(l^C|S@f)P$YC2f-8H8!iZES4Roh4_28p=qwVI9U@@uQf z+j(S?!F)#8p&jtD)7RTO9U9*5Ai^$-UTqlA4=MgUoibarT2~ybIFnc65U>QS()h_c zV#Tc9|A>r{=t(aW9v0E-xG0P*4fbILy(y->8+M^4kjJ{4xpr68g%1K4bI* z8wT+Q+uBj)!**s7o*!_zJS*fMXzjs`+EMn|tYJH;b9VBb;|U|5=u6bsx>i4Ve|kjI zhc!KMN*_xOnb2Tp?(7J5G3~)|N4USxHNV;qp>`Je2sTC4t8|BG{p_1v3{Znlbg!WE zM{5n;}{U86lW=%HW)1LhV@3%G>RGn@Ts{Ye08!| zgMsC$C6krBulr7wm9#8-aFv2!jA~OcpkPq^fqi0w7tJLVjLq7UXsXZh#BvCp_tg;t%Zw^tiADdykFU2<= zs!b8`G{86_V)v^9aDp1oqG(|e8na6?zr<&d+!n8cW1#WkF-Ra4tsF~%tMQZB|7TNz z;(k@IE0%b`y)Ib+r?(1t9DX|qBy^-ox71Kn8eGh4xB4@U%!3~GL4ZI2s(vc%{Fvgz)7XH?Crm%7-=aEzR z^+k3ujWu*Lp?gB<6h<1$QuJjqDXJ^k5>lXuw0lk9Vbhp={65-Ie3K#xdzKm-=MYdt z=}`Jp%m%2;2AyKT6*eV~a65BC3gkFUB%Z?SFFT@fwJ z%)rMMg#(nTDcuQ-Y{;V@Pr^kT<@4wxys<^%SN*8eY!zI?1bKXQ@>E2k+C-H2iwU(r zmP8ysz~4%RXT4dPN=|~K&>%vAZy)||NU~-^LsuDUT$;(^JwbWS8{&%wh#C4&^!^?F z4o#v@&}V4!A)5i+_y=&P1vd!|)C?K35|q3^P5#V?(*ysHYwD*Qo#G~2ch*`eTPmzjY;M^JJ*PM z2i^-w4i4rCuE2?Ouv~ZdrRU7#5_W-+O43tN#Y_WtFP<>ln(YTGG_h^6S=?#6-b91h zr>oyp8&=@*vV&;CeODJpi-M%?8<@*N0eIjV=RORl0-BFfKf26aE=xVM=pe3F0-b{@ z4^kKE$cEc+kbtE)Qpik(&C{Nh=L^eFd@Kw{(@ln9W4_ilZ|U65n{N;Yybe5YtYk zH%bUwxw1pl&>^hKsgc1lfY7DD<}LqY^!YDOKYT@o<;|9IJ`Xmj8Efeggdb7(F=o24 zH(xY$pGH};6hG%&5jDK9YwXkrcjYzf1ZX#X>Bs|Jb1x_#kjPd; zAqIt_{4RhA6>C@nC|uUfojc2E9VVFRuv?q91}ue$OgLh(y_QXiFP8ECk$%CT=MM6gG3G!g55cIS!sH(pFV{>w4<@x1KBCoup0O$^@IoKugmg zUXEx1{bfqP1(p)Pz#iMTn-Azu_dZ+sbhjREe^h^+L?zljf8Q^Msn1-{O@hXFa<{c6 z`i2&a*ok@I3NSBaP2~(8Vw#1CF#O39!|MGXu``Td6CkJYzhFNxiyndarHz=t|JS_Q z$Zy5JN<$MN-@)5u*n}w^rQ0s>rqomIe5I?3mL9HZ<~2#cP&ZB*aDHXnM@xlX55<*sifgU4EiKbc&r$SEvkA@ z^AA`eey<)|SpykN>RJ*O_K*021H(3E$HH4wtmBpKW0s;w5x9jpP#Es%Zvto5T=^+7 ztZACu!!x#Gm3ql||4hW-{<$ywA5QDi?o z+T|)+Dp1Lm_oGm^G+~WsOpsS~S7@cT#WNN0QV=&RM6yWybjmfSf;2r{Qs~?K@Cr3Lxf0Z3Z5f`X|hVJEiHwToHyMY!SLotpEpaN z2$2%EY)?=Rn*uncf$(u_hcV)!SX!_dui%Hg`qOwA3hH4p&0)O_Ew=V@_klwr9FP#l z-$LTD=5ZultcWatqZPO9$rj{Fjzy9h;dxlLP?dEW2?Bwv`OORL>D@X$odeo5h~(sH z37+7cYv?{P9^@lO_4o4Nd&Oep?S*uXMk#C)e4Uhj8HKKH`)qxu`2hN$l_!?6+%%}m zyN<39HKu5mtl6FbU?2!!Ty~&S#6ncenLwR%*gz{Pmszy9LtA`+dX(_`?>m7PCM-1N z3{Rl0+s}g8eLw-F>RU`Q_V6qV+ZwiND18aOI$W#C_$xurb3sl_bMH4VOZD2kMh)E4 zN*bSx&S*{hsGB{*b}BLe+yW2TlR6<-$M|N#cON~JnO>r&5VLu_>FVH1CmA7}B2!6JP>fw@O?rEbDsYdaujX05Aog?U&8ZR- znfoUi7SzSiXp7F;)MRRIke7a=FTOdzW5mK<@b3@Zd#5))Uvg_3A~3@#N*eXetbf|d zr=b~u=f@WQfDSIko z^b4B;KSJ8ODTkdKRpGAy0<&h`PSIA@jFi zy+AQOg2e1|_@Mxrw*muLyjUB<5-jw3OAT$C8(#jSZG1A1v<_Kk?eXL&Hr~;;Nd$`+ zCrP#pc|35~ZmdKkR-kk?*Sle$1O&eb8MDiJM@#*R38_vI5qsJx7f@qme;6!5> z*c>PE)^msPgEPOr2Ry@eK%$f8fl}sDM76ytkvz&nd-@UuEAC2w7?7?{dQ<8^D)=-5 zwjo)NpN2TI4>>?2Xog@; zOflAmFtD-x1WX4FH5P?9V+NC0GSefNV}cJSJU78;6PdxT+*;d4_Dr3b6cWrfz(-7_ zm~h{T#o`q4bw^=Qss!ESJnhqR9YQ&m_F1x&AXTu3(^g0DuqiDmpexpic`lH@Ey=>* zN4>5?By8)he*k8s@>q(p|$gIayYK<5usMS*kp>cb$0#SqZzmKVDI zHso~4q}vGn+`cthx9~$(gMM!kg|UNMvHCIlqxkaeq2MqW`4T3MYBvx7|F)kR%ZBP< zx++HkEK}NNk(HA_xLZf?ke}ABPMWs7quJukjg%6AUcHhberWz;&=plnC$NDLUXaz9 zrHFuq7Q?(j?oX4#i@~L+rq$MCTl4ZKBtk-qf?2{G#jcTA-Ue1*c$S0W;!)d8`>uSe zD=^|?GekGNXw(h9DD3t&J2|$A96M}vdKPCdNf!&4%j>l!Wph#LnTOknTkO2#4b!H1 zgd~jC6OAUXv@B#TFHzY@%xf>x_FAV#2!N7AB@+m;+Z*RYV1p4)-iV~8-X@?c!D#%y zCFqbVPpA?}hJ}<85y6EGvPFh~ZfN1K1Xm;>1AN(z4-dpCuTFlu=4jwAH-65KMU^gr zs8W~|_>th_m$}bGqqdHP3fyxh>pxiC&;RZ`*%rc<_C*p5bOw;U|1CJv1zL4tey#jY zjw~`pnrwxl+u>}jQhw;QODMN;_0u;*1iXR333?a}8U@qpBH~*T2KJRHHjn`O$XrPR zr8qEWs{QyX`)!($7qb~Ck9mc1QY*_>kzg|CqA_7s%P!-cmbF1UXWt?Zb?5$g zgS(ZAbsl(RX?m@5cF&-MQ5;J;fJ*-@q~|3y5&3jpwRyc!f6Evqz;w)dNiZ|24h{$7 z{k}$v36#g|CJ^zH=eLN_uXV_m3#QYw%UZ(BvfFB@h!p#ySVj#y|7MwKQ1I#@jvZA; zw)+r^lwylXt7dN=dx2kZxC3^^?G`zkmv`M8Z8@x*B_i_E!iGQP8M@yb>aZ^Jhdwzd z`-5$F-esm-KiuD(EzD66>B+m&S1MT4Z&XJ-w>myxu`pp6PNYK1Cq}Pr`OAWDUJ0L> z>jsee@Z3tzPlJ#4RF?X1@}*d6_5qv@|=N60UV=)5|uldPyN0%DDf9ByQvRpqXFM z1E)a+s+VNTrBzsfEJ!GZ&l$9Dlm0h0?1g?f`6Z2$ejN3XfO+TFa$ARUSaY=T8?`Su)9Mh_K*7X<; zjH30!P20Yx^tlWR&uJb&gX&3A`Nta&u&mIN#FF7HRf%UKcbag>ZNzGS9?$-=+Ai#w z!AQf&p*u}ug9FyaOCaXT;_B;J{OCPj<|{eHC7Sq3fEx?nz^MZ(&jsyN#1a`T8vQnw z(BgfWo0Rt+=7(f@y>udqTvR=;uleu&4M?6p&{5jOgjy_x&`XwsS0=5*M10hmU&=xn za9&SJNnKRbMFWV1~TWGl0>b?tW(zf+ueoELcO z`am~EuY~%wew<^gvZ*d26N55Ho~8_WCtCxkghu!urP?{ZBSaXR)Q zh3`{_p;}w_2N|A!lc8!xo{(&4H7e;F*D(<$7ATw#x{7CFZY~lIw>}n!&#PPvk0?_3 z3{)$nX!Kw;L`Gub1+6M4!K5+k0e>PXH1Css-Z);6w=t}a#(}HpCR#~i-?4G&Ry7y* zgHkh7X&GoW|3Az^`5(UDBC`tZ=syQrKJ%IM#pA@-jrjGpXyyj#xz9o1Ma~+4zf|jM z-_k*c2W+%zR(@Qju)-1dy*jx#+2Ld!Q;xTkS!rhBb|coFw6QX@<{1H#ISS77O!p93 zcR(^|)kz^ciNbHV`Hd@&RUnN27P_@d{lph9{lCrKjvq=^=)*l%?Ph_A8+MgQXzJd?F>FSB>zu(fWGACvB z?K1zktv4tzxaAI@?NeKk}qjXOj)$6BaBpwrCi+_5mhoI7)UciuI#sX0e6E|bb7 zoLuoJmiD}Dp)hs2XVoUPH4ndd-T12?$UrO6dsEyRg~_jfw9@tU!)azm8%pZYnv4A;bVnSy;NE1?p7mAuh(8>4LqB8T^}Aa-0Q1MgUxeuS&Fub zj%|Gqq}&rjM(peG!^B`~(+?*%)4iTrA5rCnW5+uIqV0K{-zJTfY~;)mlP598jG|om z-H8~6CLy=6pvM*3Bd((jzTsN$dIN0Q2Ze*=8ML;(vCvnsO@fbi05shpP<|^i!&Q-r zMAn#0dsp|g`Kr$xa6TLKm9A_1H(eemN9#_vFlWmYq@V6>X*9BzAIIZLM|6SF#A|6n zH3mRqx}ElLWc7K$#9 zOSmb$m^Y)(h#0eq$6>*xCiS4K3~l9e&t!!~h8} zAd%Q$syBe`Q=ki-mmB)l!ZCso{ykS?1jh;~wM`6OThILP^Q~c+*mlt&R6#K%(i%ck zc;%~gmBysv{o%MS&Mu%piN-poFojy#7x&%`utNI<*okcYCDhutq3r?$bo*%e^`lA4 z!~qE^F#THvP_3<&q+|yJf54*y8}}5!H{+)726{GsSCgeR3-uDqwRjU!$&BLZdIPs&=YV6U;!_|#0iX*DDIb)I{B+VhF083GZ`8ez@j^971|XW&u&p8@27 zQ|q?uo3$DYS0I2O0;q-wem5Hz+#q2=4*wRmKna2zmo4#N$nW8Lc%Jug9K$emTw{{4 zPR*zTwad#j3!^si61qDmAzO?Ua_#%zNCzB;8BFB-f4_Z`TU=WS7wo<41j8VQ|BRq) zTSxcY+m}yfCI*{xa(DiIHFa@d>fZf@e@sE&A(g9lhL=7QBAaHm#v*VZet0lGaZ&Q$ z5^%Hz$N=aE1K=E}XOvY%`?(VXBRNWInOg$`BI6l!kJIK&Wa>Dzi?MUtZLM%F&VjrA zqqO!Qmh7l|SGkVVrzB$2@%AJU-i`kt4OKmFhcq!3`W`!d+Q z6H@=FtM3j`?&>q=*XQ;b*_bfqL?IkhqIBq#8lb1o82Z;sU)tD5Do!XAenm6?wI5uC z8XBrLpkaBO*b(a!#X%?^m~6hp7aTBkbmJ;W z$1Xhbo~S~-8^Ietj{d=!LRkTNfi;V;j!HP&;~T~j7N2-Nmf2-3#dHNfRDaTo&thz@ zdRULggls+qem&R5gl7zSu2;A*h}}b{E1qgT|ZNmoC|2j~yzIx9mT+zgSarQh^@Necy?Q zb2k_+8t53y6niuwlSYv%%SdQ>mKK30{W-~a+|*tfF$NTOUT09;NP_Izsy5y;=Y0=vK< zH~)`|)P;uR<^ci$n3lBw?WD}NIfYPxOKBYOQX)(1F+)1(GltYoC*a^QI_amDSC>m$ zJQ%{IND|jtiz^HHOn)tv0L}%QnsX(0-l`BxjeqgQ+_iPP>`A}hrOxj$Uw1S1giE@s zYvOjqp42TaO}4!_eT*@>gorG*x*zCj`6C#x2At+ERD`)}kOr3|YYK9pMNP0T!&ypfU)_+D80#Y5C&^RW_24MAq&QvqvDy3`A~>_Pjmp!mK(yCJPKl^}PnWlNSP`R^D=vCZ_Zu6*S$a+oj0F>F zdkGwS2g?fV$0Z|G3TI&iS1qiQFvqeq9THno@*|Vxr!KUvSmK73<)ok@KSmN<;(`xkH#pyUgqsl!^hDgY1i4;>wY{?z zXKP*(9ld9LSW34~>c8q2a^|5yFr&C8E#>*q+m zaHZqwLk-g;`Mfj0&2H;Rz&*0>l{KUPeJS$AoUl7&#?+y1M%@mu9r*Guu006s7Aw8* z0{)dkPDHH)lif`15nirgXuALqDsQE1PG~GlrWvz$w@*TuD?-+g0a8&`4;};`2r80g z$>G+=w(`3im+{b8O|NLMQjZQhp>UqcmA!%uiUInSAzwcR0g06w3Ia9fUq-Gv%+F z(Y5$;kbtWkj;v`)+UeUBdWJX6OZVSx0BM`ci_O?`A$Y6gq{So;ss1ZCsba%?Ja2HW zQ)Z28Igb0kEBUqS@6ZHCDcZ)nRN*k&tRIjUDOnDN4RTdveolY|BE2>oUY@h#<615) z3y6vhQ?6U_+)>!k*}8ff+Fn zlzH9ga)xOxi&UXDdgkjn^>3h$!tx3qM}`0i5i4(XOgvW=(S!1j$Rw;a^Xj$0Nz zSumb}!$Hgu!eqtz0?UACq@6wV+@c7A6$XaDs&=SN>Huen9atN~RtwqWiLEN|K(V!u z_jlF}Nto7@uxlqpr8G^87GDt$oY=AyJkLaG{=kGN+nej_Y3=aIF2w6hMioG zL79lcumX0|FRm=PbDo_oY{+_kFtwgjxkyp~#)maNH)r~FC0sgL6G08k6Qn!M!x4WS z881QllGxq6t}wr;X_rRm@20??ilHD_oUAdMtI!Lju#|X`R3-%h@>5nZBCa4{Jv^>S zRgGZFQ}8#GybIbG$n+WL0PfGKq#+Tq|-c1rv&;jxd>^ zg5iuf?`bsJ_i6N!`QZal1l?G#<&xWvb-h))X)H$33$CH`!FZYR3 zp>&3#ChrQD8a+ZoNJXwhBRu!r`Le>1wOUc?t_}H|HFIMMg#6Q29-8*rxu6ALE_PY;EdpRw{4ct3x{>-~Ltcp=DVIE8-qLbHtv#8T2} zTP)G*u%5~yZt7>JooG^y;QkWLphC17kEB`ajjQpvEtqeKy@V9PWc*87He1)j;YHX; z*xHQGzu9}ZvA*Iu(ixY#A>PU4)uW(o8rf)bLD zqlb@dea>T~3}Iz#r?a6TW8TJ5fkPqQP!rwEbFwT*{=DBDE}O8iG^#LSZo)8tADX3q znum*HFqO*W>U=kj7|~G!#Xd$9%@RE8U?LmnW$ygdc|_leq6_RG^kes{pY=u?G&3S@ z=+F~5z(hvT#9xYG9w%<2*e9&W9#bg56;g4!&=|$X@Ss4^H@a++hg>1Lh&9;YDkx&H zqWtj%2FHv5E+%#J&mQ~CnsB#gA|e4yaKY7us}e6t_KEVlAL4#NIMn9Zwdcm9ip9zG zjhwCQmfzN3;u+$UB?)52R(0*eG$bs*31tKePf(+Yzcan2{9A)%=N84dT3jim$$ZCs z`x?e=k}EQ-UQY#@!4bxUq0HULN0B|~vzXq)gs_e+lI6crYmIpiZPIYaZ+LbF&+i=k zv2eG3RrqH6$Q^(v=wO|fK59j@>muV4i=nbO-#Big6lJ5nQPrkQKQ_dW1eF`rQcpN2 ziwTLoWEQr$;|CFx^LMiV)T4ahkwnJI+v#G17 z%7nu`M85S(9w*dhgRR>%zP?jTxoNrDk>oa(+b*t+`{E(0IDm1i!V@XY6Q+^PgdZ0D z*8QJf2YC;ZPi~$*I~?;I^Tkl;=v-F=mH#dG6UJ;*{YGMPM-swT`0$}K=WT(?LONnI zbTz0FUsM=3`Vq4cT+^0#4^u@uGEx0!INqdeTan9c_B*Ts`_U9}hPU6)QgjjrZ1~H= z&uExiOPTp<7-_S)*V;}d{@wBM>%JPVN1`G^imNw%?`NC7Q|d^8FQ1{`f;m3d*5{Ad zt}Bbj9mlm@b+RH!w(bq=W@N2)6;JhYsOgC=5~G|_Ak~vHCitzp%8T5k3bgDBlbtWM z*zuLRTA;v9!`o!yY2AQ?2;`lG2*#XMJF@Fk2FxSFuolAAL=!{8v+r6z#_3FM$TGiH zYXc9F*Cqr^tgFq(?WWeC*GP%^YR!tB!b4LwhdVV_u&uH|0M~NctrJRD`YXilyiPsq zITMRUPsfYVTy$o4i%_?KAHl+ooJf(4gcrZ-H5JTSlGfp|K^Xy@7DF|SPWl|`h7>cE z7Zw%%>0GcL8n0S&-rUpp%sMI~*rwMi!es2BMe?%kHOt!2)R1&u_UBi<{G+`*PNy|68TYgjPAN--#y#?U_q0*E*dM4_|BzTi*EO=iK_ z5KZ7~ip;zwVY!C}1X#?Dzqk{_nOmt5q)B=(&cycnsphL?+>Qz49q-xAzA-##~tOBl-faTr4)Xd=(L_ zufKeA_2u@n+@NXk+a@7tf|u2U?csv1(Ng#Y0=n}4)jqfau(D~8(QFKJX!&7J z{rrtD-6%325}eAZaJbOIE}f7vOWCPZ+qkpTfnIqouec}ZLnE+5SmSMotCn$O{UVjS z|8Do)$wQKRj}M3fs86$hzpll5CHdivYOR{>;n<_uGEw-K4yGn_?rM(6*b8l#glE_` z5mQFDhRZG|8nJVTk(7aD(6lx`Dl;1?6@Ah;@fk%GQESi%;V8b!Jh;m;Ql_l_fMV&J zMaQ)_z+i&@*%q-;wT@518BBz}ei3Ca^-{=h9Z&gx3S<4I}c;w^Sy`%s3a z{MM2wtF;5XMFDmI+F@cB7QtFP$gS~F7p*VfbXqZrqI)pRa?Z9kfo*ZCF39z5{HAc^)FNk z{c(7C_O5JSrEPn~DooI594?c4v(Z^@eX4Ba)czz72EBJ?q7=QOI%{U-3`N)~wCWDE zhvKktH1phYZb`t7Q4e6HDIqcV1(2NV(J?3BvT?2O(t0Sx5EMdj84Jto3o2cj?Yhy# z;(%a^m#4QeDdRNfCW`ekPCreukKnh#c`mHPSi_L;0b-r zZOm`871(m7(>9l5N7pA^*CqM2_oZa@ESn-YBY>;SVwNTuB%yb*=W4IYQ$j|T0~I^a zPHZ|SwlReW9QXh0R#}at4b0L_eE~)eSkMouu3-L%bPx6ard&J>U+XII9xh| z!|sWa10Ibjist0`k}<<{oikn+qi~Jvpv_(s1|a zg$3tGZht6s-@Z~5KJO05K@bLgAAYOIY z?perVuq^48sdAjE>auF+fx$d*fmRb(op)X2%kVUsx_A{?mL$m9rzztFQVivH0suXQ zTn?xsRE?D<1cc@)My^vEnI`Q~sG~QMY40nv2q|pyx5@ApNbId)H~F&9Fk1L(4Q~8uT0v@D?$}FP>(l0%4c@+}P#KM@n?m_|%5*^pJn-U-3)>+z; zpL7D%(&RbaZe7u(q^oX|4|Us{F{Vdl`C2?Cb!*yPO@K$#rx1O5N^K{khPdsxE&bRz zy^C)=rb@UBfhfyJ_xoSP8(BDvK0{4-1PH9*MdL+3Ff>UL%l~Ncs?;m9@f_ z>HPBE)@Nur z38p9(u%;@?PTvi1&j%Qw9fO0lqHI{RkWd|BH%mtR&qP{2tFKgIe8-R{CRGcq#YF1u zNZRntsJaaQi2qHT4mM71uLW%SJl0jWuyRX_cKJZ+-a_MB$j5**bxVpR;ZXMlUJ>GH zg$RLWS)yNw`wS`S9m&mF>#)Binv@R7&x-Qsqv*vo^mRXDTDi&SYXVx~Df?yj*><`a+Lyr!OfVT znUdv{D?~7%HAK zV50A5(5Gb6w!I)uW3T^E>uxJMwW^||Dm~BCG)pAl`|0$mK^Ig)`(N=L7D!6T?!Y^E z0vh`Xf3bG&^0o^nUL2r!xd+V)rLfVbZ*~`&OD$Ld%Py-JBFFcMV3PL-1ePrtRK+1b zoXm-1SrBy}oGJWf$Uy5T{0@d*=%YsfcuzE#T^9)2#{Z^{@Pa5HT>^G5C#ZtWK(Q+t z-R)q!A{|gCgZVn*UA2M?N-8nb3H^PG>zY(fo_VzwTj*sPY1>Egx3fZu}m~0$BIdgKZW8JxU^F&ft&)a|V zA$+wCBDr8x#%-X-z!vh`<`0qk+Db>1?>`vLrossB&ju69i9@7f(z$AjA4H zQlwgTQA^l5B6qBKAEZLMP^#F>T{Nwc1L7QIaB$g_B=SZ68iUyoxDch04}7KWD0Rm) z^(B~Czy5Ia(BTy+w{F};fc1MkAju4gt}1qS%Qg>)sa|ew*=!JY?+#H5Y!1N_xIj-C zYa)aMb5YOh&#e*{v}+Gm&szx?f=XZ5;Ta z@x7Nl9A%N8@I69=ad3!(EIKhw|fCotB)Qjr2B4 zW+F4@6nJ)(K3$ZpXIUCY7KDJOsQZV{U#X@DMlAs$Xg=6+FKXHhJHR2BsWZgcd`wS( z%n0ipb^ZV^To@aVcL?1nWwKNxkjHa`wC5{bm{!51Lp0OBC}64_F@~Bk;+S}0w;Vn$ zG=@RC5}`7lXtF~>k zp9Zb}yRR7$OilY*dbZ1%IKP+@LwVktwuBLEGBM^VshbB4qwQxV>O_ia=!*51Y}0-S z@@hOv^i8n}~u%nn?~_kntH2 zHoUh)2&x0eV_VORnvgqV+vH%a7LH_BYI#w$+`9RV!UBdV1|SA_dm!KAV<+@nl^Um8IYk!vm*<9?1Nz zJEy=IeEN4d-t?)ZH7n7Xmp=H+a2JzLRX%w2oMkCzo3`G*Eq7c#ml;qbeI3?T4 zh%vmHbw!02dBCun;|BSwR6G6=Ta~1oT6%DOpX5jBcZm~aT^3h@oBiuu_iH-v^+PiadlgII>>s-ph0fugft*uhX5eYb276f}bl_WCi zv@XbF{7gxle|3O;>&(i0LQRb?IBO#O&T~K^43n|gz_>hHQv7Sw_eGSDlPzN!(FHUigYFt1FFQ#P`7~;d~4dYt~4Q-X;Q1Rs%CC z1#7G=E-LPnkD{$MTx<)xRh0&KfgKi}xKzPdRr|4##kqh_5%HmUUaX#tZ)p5-JN5c# zth-&5x(Y@`019C;T1)~opB;k$mCGyIik(buLqnto^3<^U2*b2``t*0{eT$}i+B#yg z-G#m`d48ME?m^NmFV0$ra=0R7P>lld8ziIn8L|FT{adovl?0_qx>&7kdHGbQyKRtw zU;8543U8o=&vng<2#FD`IqUJLP&qE#p9>e0Me6f$`~%j{rDu{Ie|*C+dTP>K(BtFN zn7cq@c*e|O!?es(f651>J+A8EBUA%9r&2`G5L(Xh>B6dL`X;9+d+Me@N9EAYnV4E< zHafZ99&&Uf8a27dm4l|Aa7eIgbn^ivfPUQ*sGoi9SFO@J3HBlZ>VZ|eu`j+Y8f?j~ z-tVwKuPN;kDPuKn+}7&rF7mX=c(ke$M~>vuM}5*jw42+!C*hM^t}ZoemsYFQ&DD}U zWzH6I(^GlU_ZSbrv6xdC`DFuvYdjiF+SWV0hV-kfEJVoz>lIeFNZ9yw);7ooORK@| zW~xxq(p!3`K;mQZz#B9M{#c<8xRHXMji!L+HYFm8E&qmZMB1k@NmQIc5~aC_y5<$s zykq}}oe^Pc4~LxWQPWIB1Bd81m2@qlbS0o`@h*wMcXP^^AarnWi*_X+Urx1LU zFEaK0aUQz81m%x&Zlw=*B{NH)b5N+)*;4yqE@5D;kbv!=g?Uw-A8Cc6=&-HJ}83PloHgXegJ zI*>{aR?Te^e2o$3L?LPuZ8(D3Y|Ac$t@{e(UjZCY=={4?0_X9bt~@j#qT(!(OOW=)oPzS@rn`8&62M+5p|e~ zfF8>wKHo?8Ep1&?zN1wU)!*CbAHLD=>m){t-l!1@XYk1prDO!hYK6sM304ZJKdl2V z8OCX zfU?cv$5j!p-xux`)8%~LZKNCw&D7MmJxmuEjByka%{{8JOia+S2~FX**D-0v!`C%Q zt?kM)RmHYklR=rbyenoj z_gyB^=gU?y)m(#Y`bq*yv?K*B-#Umy0MEI$Bw-gEuJn8Uywz=5VNlyuFB$Wj% zAJ`G}4w1Nq2|Py3sVs`$r6t(`{Jt_jNBfA%C{UR-5e80Ym-$gL;l&M-{JHX!lCpwB zqktcUZL>{EDWXx(m4R8r?3p#OYGpEg5sAbJZ}^OdBk*}?v6~MyCR5}}RO#>N8*ng! zvrZIYnoOrJ6IjJaT~`B?BIS}<&gjXyhbrR`?(XJIeZ`xIn@I&ZUI$%#@OHFo$fx7O zhH|?5q}0_cip{4Q5hFPaM#^=jZsEGqjnPwAlkP^44R4r;oPuu}cG`pz-=^{?^tI-I ze%l*6k-`J&Co}Y^MqiWA7+a;ei|kBnKsE&Wdq%Zh$`<5^&tDgd_At$+F=^1gcbE+r z>b$2^%lRy=y9`=xlf|ngW@2`)!|`dZQ*{|xPet3kB;!a?4ZT|&E`!&B*w2STkgqcl zPQc%7Mx|l+=2u#Zx2zXaZi7Ceg#Q@Tgr1Z;!s=lz1PS1ZSKdptI8yqpFhT>!Dx}j5 z&`Ol+UO&_;fh>W8%Q2$Uuqy-@A~=E!hIVo)lNtyK$L&4PVOrFNH35Yc@M*7C5U%JJ}>;;mN;~j>M1&ak5`=vCLW#R}$fvTiAcs>FE`?;q_X>ah zRQ1%X{p+?r*wW7p=^P46RXE60;2N0Q_uy#(l);4fC;sr$jr`CSfz8Vk9x^~)p2g zO^DiCscs6YUPs-a?L9X)N!x3K!S;>I8}0t4yoQ06*07KOZI*r3=er}}MlqCxAB$6( zufHfJqN31|o^%Icf1fnz7lCl4OL}Wr5o6eGuqc4wg5v#v`2XbU(;2%O!> zMA-wTE{lg3LCr}LX_v(RP-!mJF#ILJBofz}u>Bg04_~G7Q(9eX{7zHCQI%J;T_Y$h zq1LhViL^+YEaQbz?&S4INfY4t3TZg<0J&pHGb9?yYq^~NPqBR#+JzlMIa+>PRB>_6 zJyU~J8l0%`uycJOmfMIzG6-C5S#N2jT(XLjhp~NHJWbn3y}h1!2*;iKtdP9B&VBki z+&P*7rcQ@-ee}GC#f_p0=``1?f6PNeXpv4Uj_pDm}Ss z{?3CwZ5U@mfjud-9AA4VEG_I1XtS5;`6vy1z_kQ)?Gv&xJWByMF?(hDs-wujSX-z& z&4cEPJhAqFQdh%!^`)uxjmkbl*eH$@z+>;02lG0X%v~L$QrY5xD%L-_e7$aZSL>l0#18#49R8Ae#AuCbdcI@>Nfwp5?v6%FVyO_8(K z^C(2=eKMWE7J@^IuMGLj@mX`F|Hp2&K6?)5Fl2`%QHYQxBzHrCNVq5MOCIpncQ1&| zpPWxAcKoCVAw;O{&;1%o3M8;7NS@>BSfU>c%YW2BgXVOoc$&Uj(#N=v$WTnDbd>RP zC1oYF*KD@@k>ETp6l4(f)NB0s5}4H#t`FA9`H@b_;5HC>wc1E4Z`aaI&Uu!hnB@+p zWV?)iDHYSI{dBjM7`5!wZI7jQ4+k5aaL5yW`5O34)sx>m^M|2x&l2va&1Bm-R8jTR zVe2mcTXEiqlJN2{Y104RSR|jtH(CFay4uXbQ;i(P=;|#c`5Xa zXhz@}kbS^p-#l!}PgQ5nWO*EuOfhP<2tjJLH*$XC@i*-EQ$9y4y6EK?zF)8{9ivJ% zc)%>Nps%**Z*Qh0A{Y7)&9P-|NR2@B55=6sG)c|8-B(HsMNl40?A0d9HFvNb@f~@V z1{XHQJtw54tX2l(Su`h07CrKNYr=qD2Mjxt?BzpsPt%N~4Tcmt=^%l;a;vTu*AOk$ zy9+7fo~Li(E*597DpkRi^RwW`34#%o z>DTG*i}+{{7Ff9OzI$}HF%QeHp;{Svzju4>2LJLqG!$&MOp9j=fBdYsI}|l^mle~s z>d)6@!s6V}F+30w9X!28t7?&^)sN$=Y6c)Q-u39DM$0BV7R12pJ?35~D$#El3Cj`#YH;w?iKAD8o(Z7!)+gRV<&WoZ;A+ zEPDz=qAR@c75W$CUGey zvu~5S{m_{od8jvI=O-EYPVN{fwjyU!PlU!zC?!vPYO+&bq^^meydMV$ps@0gXN!e= zP9Gc7bA^(#Jg0yxDkXv0ziJqBqyfD)D}$!R3WW{w*F+vTl3mS)xODE5 z8akIXe2U$ zfcIXP!1?bVArSWfWqkL6kjw>QQhGP3nCn7_h`6wb2Gr4q}1rZ9Ve}?3{_Q5V=27gvRY4~!<57Jh-J@I z2u!_av0@Gll8dyO1S$z&-}d`|y+Xs#(yk~G{#w4Nnn-&Gr{i*+^>ClV}W&Nn!Z=e7&4MAYJ-NjYe}dXqI!P$p0I zS*hj3BMrpqkMwF%QYeFE?3|mqc>tefWx)(H7E#q!5u=+l+vsm@S2{aRwF2bE`9rRb zil~%n-{E;uprGEr`pyCy3x8`axy&9)C!I@w&yTlBr#MC$VUTfy2NevztxOEN$h?=s zGId#l^%piN!g!0V&FnFx5`V8WZRcU!T6WiYwf)}x+qNi?we75Ip?>)HA{mNf>7Q59 zj_aaMJBl*b#D&wR59|pV6WfyJd9pBpR(k(AJimduJwi9*hA)B}PLCS;`3I4MtH<&g zs9C+oZc@8pvBJXQUD+(uvJC5MO}|mhRyZ7iV72q)w-~m<5z42_+;>5dhd&Awws)o^ zxbE68%TSbi*CCmYN%AsT#_|F@A*5rMUZG#gRT>AXi{MOuCc>qZG9?z_cT)Fl4rOA8 z+O(@xJ0>+ZF6&pPNklOZ(EB$qRIMaDbzTUcVC7r0-BP4TRoC;lfR1UK`$-}O*de2=?xeZ5+BvI%*3+B{+@XDl^JlEwVJGC6`X`VOqXnkRx&1e&gPJ_d_eo3rTR8{U8(3A#>?;Mb1 z00sX-`-+K*621(~@H$4wc-S2#4{_qx@9RES`IgFWlTdB>^FUi*@AlW1KjUs<$0Fuy z?AH=5$JTY56S#UWuG<J8jnr1vv{&s~@?e!MpWcOl)0hd@XJK~}O1*FT$R>7NFN_Ke9g9q_Rpk%TcjKMRJKL{KC_1R8E#L}stPK? zw@4Mxcjg9$Jqe-^7uAX<+nllLtsap7-9$vS>%9KJ{AGSpE;MCZ3$qj$oGsww1|E2E zhv|KJ&FFTh$LfQ5Vvhl6o4%4H=xqE*YB`18IlAuSY|=UVFToUL8h>Yh+$Z{@{`>w) zTAjC{zU|&Bi5QJ z#XszCM?4KMa_LD2YB&YASd)8Ib;JJH1faS&JE(w_e$Tq@JIcw}gKElEW33=T)56`4 z9WxW|cf>wef*niC!!MWTokX7+lQf@|xtosERM@bfhSvEu;xFi_Gbo&Sx7>qs7 z&yF)GOHzq7NEgHrK|pxO3!bYlYNR!6{&<5F{_q0b(Z!uiy^9E*sb5xZ)r+X5`2Um% zzTm=m04TbGysAB@0LRb^Pn*rQ1j2w`>HVD2-K2S{^f`v8*AYCvYr==yE8aCG#nHXK z?&|z6j^{*porj`KxmBu@Vs^ziYB_IJe(D* z$>>?MoVJ+hf=%oKdsquN*0amDaeZd=4woZ4VrR-UMmhIqP&PYDjHbq=os;8r}05Sl<&P#J1S(5f%L3+w@WMspEfg}GNC4-uoXc#h{yt`_{@KO=N0 zh|RzFw{K4em!qMqg-VCxj^j-4gp;wy!IrM@sc))fy@U}HemJrfy?>(-jDYGsTY8t7 zn>Tuc(6ll`9x^THNb^V=QZ_F_oAX+~M?c!2CPVp$y}$ zw9g8=7qPoLlP{K?OrFeanm(F@ZyT82qgU((4Jpqs@IEBLp}UWp(o=?<$Xf2SfxITY zTg-T5E7Klv#b_f2f{`dNexCkHkL~KtUXEUl?63Ba&60{v1-`ov*-kH?>%25|?}$6Y zFJEU=yH@e|3Ey67YyG;R1Q?-pJWwVcw<&w91|f(8Qh2kNPMEiXnRqbDZTm)IPluks zHkcyJOm_4z^yGrI#T#0bn`Pw@%>x>h7nthfpjb(yp~$~KQTOJ^(Xki(X7U9ks>-ba zvN(1dY(PBU(C{`SSYZ#ksp;{zVVAcq>I_l7KokOa>qUA-@xF>)Xim%guc*kR?iGgQ zl?2U#0GV(y#dh1t&9#yWf#DsLz+te6`oCEg#F?4l`*?Tl3ts>Z-HQzdw&JgzKMN0r zp^Obv-LYK1IB+>%Umbk9?dHUy^Vzy3z3|7~<13NEvki?wuAMfGeVFS0=o99@I-L1M z{MoJY4HY~e?P`Q&?r@4b!^AiPy6K8>-N>&Mxc>GpLI{hT!_mWPCJtCo!fhg+%r!U; zr}Z=tAy?cM6Sk2F5Z!c(9Et;clQW#=Brl}7>b$)0!b9JSUz2V>>lTTGG%8n;kFv$g zjV3nbZ9>S0nZ%PeKJzAx%Fyhi<|-0!-e5qagb=st^}vist$1exA-NTK^8^LwPo4AG zGYQF5WnT}NVYY4G62pup!MPy2vT3esI-nF!J4~oXD3MjDj2J$c8hTy-IDQnnlmLII zOyw~NpTT;3|4J@=caM#rsKAP7dLUX9 z6mVd>O0;kC5kEyKW~IdAtzhyxXVV&{U}KuVi~HtqNIROX$3z~5T38>FQ{QCi{kq&&xri+X9<88y1(t#~+6 z8fayWHZPm;<`OECXTu&d7|9^JG)5YZ zIo`IKXl^;5%6R9A6gvzfx^oF>Mj(u>V1FN9&b7$30L*GJ`o>n31d6s+nuX>jz?T9V zBv_<6Oh}(`*Z)ByxZBRzB)*C-<1;vlMLb3hImD+uji-oV`vk3(F8~GbbhoKQr@T7@ z*iTU+9s8qaMiX5L)d>{!uSGE#rh5>Uv4PD9MjnWz>cxDFhLIM>ND1nFM17f+9+11c z#UN08{rbP``UXDYA0dBmcavfppqr*jD^Hib6mB)@3A@(Fah3WIZum^Tb*Uyjpk%Dw za^V9e6+_z{$X#s@CoW@7Ysky?)JZ19$SfUJ-WGV6rGX`amuR9lpF@4{L`O=|D%)+{ z?K?hMnFY2(kf@c?mxIAAmjHm`hg(N3XMnuv`q8JQBbsOE>^9RZ7ov5QsEsE_Jf7#> zoXL&f9St=Y{wv(vF`T*X35Ig^FOAkyt9ry&TF>!C69!eo*6Ip?m2Vvy)#SB`kW$ry z#w$$s7&bVuB4FsAW4p>O4`*0`0*=ga5ECu7vWupIjl&yoQL{lGtEL9(UJko;`&F`Z zJ*_kiVfV3G<2K?0m+^Bd(!&1FA9xm#?T~&5F0wEyPw9tQJoob)6{i_N0R6D;ok`6X z&Gg0f*vOJ-U>>#AGtJxBjD38AP29{&ns#2Nje5+ZCk=FuVaBj6%K&c+t42sT;9ES> zAMYM3+Ibtc9}rc9p^aXUPni5%`{8TS>ZeYmCTq%zEQ~6>y&hX7@PCe=n?gc(zm4`B zzY!fLaRkc>@D>fe_l1#+srd09cE<8HV3+I-5>yr@@)8&uLz1LUo2aHmZf|>dapc(* zGWFBGl~)Z{7SeKiyetM5Nxv?-VQb~1KFlue@Ct$c&x?P;!^6A9u)9-g?#N{|oxm2_ zTpc#8A@v50GvG#N#J47$6o;@_Ip0Q$kV9ga<@-$M#z8se zN}@q`XTBu^ftZl|$mhE8Lj4*S9%)xsrI?M@&%zTPDcTR!)RocLDyy z%I9^d==S4VvOv5iLW!(f5Yl7qBML?{0YG!Tj9;jr1+s`Y2}CUO3P-fpxQ32o7H?nI zR}*d01;1*$x|rkRdsYvc>NhB2|AZBOCpM_ReIu8&bN4QwxiG+S>C52mr4{kqa>iAhT*(weqXTmUm7Xk zmh8z-z4)gQq?*_n(zT$B1zXV4HUdk-=Zt>#2fO9l4}a!!+d4(VzWT?XPiKK13Ox+E z)E?W*dvlB8`t+&nZ!xTphtt~z4G|Z~XaBHHktSFx70lh|GRiAx5$V@1IOW~=q8Uz9 ztIIZYBuvR=TN?H_*g>^mW^~0g>m$HPx%mp5G9o0NR?(>%3{w($x)=7s90C8_`2F;Y zk$2w=hL5$ygZR)!jR+fbw!*;W5q@B3NZT-$S9UvTX*+;5bsld)+2mmsW6|90Fr6ti z`Y0U6N1%f*?{<8Ndw`0~0yt-BW28u+Jb=*=i+_L~Bcb|0oPp@fe=w4FhXbP_Chsvv zWBTb9!Y(E{X1$%Bi)^p`1Wi~fv`;d-ZbrtFB2lo9^*itW3T>)CA6r-P{;4yyG`-M< z_v7~WWb7OKXc(THJu%Ef-sS$hPQ@hqg-(=ebi6wr7}8;w-TmVUDXsW9JL)0*f+>`h z)(^7r8t{9{aetCO_oqWFdt<2wsAD9(yEKbV6AC&m~)B@=mdCzy_Z(@fm# zt~(CdT%xk?l{433SMKavyum~|_qb&SG*y||09ENoN-=DqH^nOBv#%@4Oqj+9;d$A$ zs8t<7I9ONM&8lh$o@m3v}7uA82b#UPFR5uHW54dX&*$)|zOg=5_2%uTT` z!6tN13$vnbzPX7RIR*gVzY#gVAn_nwjmJc84{o-`Jhs;rEl3QF$}u6(P? zQ67+@fIAjdm$?uXO1vTu*Q*5fIm8R^_0e~QCyI^Mr|uGg(7dK0B3-fhnWLm64m+uP z5Jf31tgwZ-u1m7^f#pss46(>fi#fsZpX8cZ0qOu}NlmTZM5awAv*4e|j~-UQs&TgL zmKkB`-y!-~kL^|~RVnfat6%G~!h=F{d8WM9RhHVrI3stQ=BZq~6RSkz!wg!d=u*_Q znzx*F9;aing;P2Jd8ui}{^jh@$k6b0ICUKa4X*#S~*d06>O%-x?g96h+&n4y^ z=s@?%{x?CfmnmK1Xe+m6d0c$V&)t;L4vuJ%zBbHkib{K>e5F~&DL0Sd8*kpo;W+=k zb;9=D(t>L9qTa$w^4bwrtIN4{7s{WG9?nh%Mx`DP??GSq-@MC|CN>i7=RZ{JQ`Xz> zXkH0hxFZE{lFlT%JMzxg~|9?F%>8n0qZi`#r-Nd|SlFL+I>r0_x zg{a@@IQF4(qiI~ar20=pQR8i`Z=KUj1u^Odg)qP< z0%b1o7QN*(Tj9$b%z9((4gqh>*Ky?8vNN%;vs)wg%R{wOdMw%$35@#HoeYN^Bj?RsLOmhtG)H& zoJ2bTYO5iFTxXO`#g)=CKj{GL#}aVtW*A2}ZviX4c&y4CAqc0s0K6$C0W7)<^q#5^zudtX)nV=*faG+@SP95dBs)Z zbt)ziZ&d1w`C;Fdc+KMHGs8pO@JY$>{h)4eS9R){G;xsvGXncyCD*2K<=!s+oUeN4 z7mWr~EJ58BfZ+qzj=!UX8ynh>=9JmxoTlUo#fmq$$BXf$^?wlu<6SIKm`gK9!S=1- zp|cea10dqXR24a0^Rbf#DfwuO22&TMyQ$fHqVhiclBts7^gi$rhl0l(``4MrPp>lEINJZz<|1fP znCf)fFpVRST;TwPraj6b+QEK`K~v-TozxPs1L~8cPHCkjMW|~VJuFE~2QLmGo7mJA z&5#^T{QGgWlaE~npcu`tX=1gdfoc)gMkkT^<}sgc(Ekz?bxSH#&`K#c7yUXwJeCUK z)4Hz#^zMtkZPe_`=AJ0h9g9MwjSX4y@*A+%*o%J`>!7T(06bZvi@bd1O!!abt|8Uf z+SclN<6EdLv^8u*hGo>iwv`E^!YN$+YnwMgY;6C}Ud59~<7P7&AnFwBFy;)fWiuw z<#_HW&d#))NoO+AxAh#xZZA{RWkX7B5fppi$_34@&i=_uq}Lx9?#j?uQs_?(bFk*V z;t~B4k-wiNz4LjP=e8$u%AVk+gvRh9>pDCHK}DKE|D8P9Ciqyv&5)16!PH~waG9)w z+kmKd>$3wXqI4#MsXjg-7R9#K4H}3Av!QEYp9NgXQ;O-7B z?(WtWFYa30-JJr(-QD?kp7(zDy=(1%GJCI?ok{XbveqOc0nI`xqXNqQ!kc|I?#vi- zC05YaGNH54hbF2W5}?AT(b6B*xB4y4EAl{DdN14puL3f|?aeN*ZTEr-CE8}`N0KY; zFoDsm>kX?Z8U~z&-j5!DW7~7cG?}vDs;_*{8^3G-^xZ9*0eLFg%k*7!q2s0W$&&y! zy$MaUHy8J!{l(<9IObv^={c4s*s0h%fmS3rce7cEgUbMn1jsVkZs~qL9p8;^Wlu2A z;ACBAkE<(xOXu58#%$n}5Pmyand~1(Hj$64xx4Ns^tSDagi#{K0ysC!`W&6`mS3F* zlYxg1+w!h7FaSWG34+S>mQcf8#i|>lAS8jh61fvRt3RaUYb4>8MfgafFTH1>Pn00f z=H5*-jAjfg7&J{JI)fRnjDbo%-?Db57p*NgQuVZrCW@G4Zwr59u)gu%=q@1G?yi9w zx%PVkc%<5&ufPTKo~+mHwfQ4zAe2m9N3IleXItx4Y8hW->&q^ zY^RV7>8hq7{-&S&<;Tz%^~m$O$ubgn`zTWqfnq&x?Tz|oZ4}B{j*xd)2I61_sQ8X! zYbFwbCDpp;OnY}G={ilGq{1n^(cVtMD{)&){yC|&J$_>OO>zki2I22;e`8nP$lik%5T7DQZ-ZGg)BO4*6_< z%c0=+MgHrc5KUx909+q9ON;*qY}*%u=>~iW73SSMms|MHLizAzrkbH~Y+!?%d8M+J z*lSFIb#~8G!Nzd+)A|Pq`6@gkL9)|mw|34#wtT0Uow=I z>bs&4EJLuZ0-{JDM=`?P+()UzC5#aKVmikgi=NiHb_W2P2BMLcEqb+=5I=_`B+x1f zA0pZ0yv6(WrVV;KN?%fiD_JgVAj30m+DM1mx>=payl^%`H3e#`?a%@R`Nb)>FEhd@e=Lv5EUWfMVB z_BWqQU6BJ)RpZKDN|?~UZbgUZ1@Y8HK&V4&Kw77ad(rSZrJk=;F8Mq@-Xn$+0X7dt zdM{K613YVwuo7D?RXZr99`$_Ahp36H&S>t6(AofdV1h2pDP-&B=hdx zPAn|u!!<)zEAe-RldG*kHzR;{=|Bso`Znj|#XFXZaW+5FKGYC7l^WTky6+nKbC$2#-I0h$-&v>B;%U#p zVH?Qxki)hUX)#!V9&mF-t0~?1OKX|RB#xFi$tr%+WSmWYmh+16YBvRB<3e#@s?*d* zCE_6&9r?wzOYAu0%IF#dqSV!?!ttYN#g`P5b;VbcW01YU>!JmW8^WuQ53Sp^YI-dEz&^7zzy|*B)WPE-U`rb zh4ZR2^vZ#(eA&&)N);PhWI3o7Syqa{Pit%x6e9OvOQnj?l4;a^ayl4pXp=T!3tj?J~_lWe1-GpL>5Ap|f*JF*HoKIN_^o=u^VR$Y^A-!>=?Fh_{_6JA!qs zisu~Hq7R?a+xF*q@XpVRm6;Bv5SxEoGrGQg!8tp8oIut-WBq$Ri{ocfidTO$uCCR= zRGOU`sv{*ePA@AiOhyGN;CRD{YFar!idXL$kr$t-RGzKH7aZ)co+`{?vk&>>>&0?s zj=bAqy%?2IggSXDAa`p>tj_kKNgExqgP01ab(BBsJQ!BB9_K*OE2{{t%Hnp$#4M|q z!ipy--kd*x>NrPRpzmVzyU#eu2MK5WK{)v^1S52T1W=9qzU=C5#vDcEu_6X9%bY+L zT8Q;=QYYppgM{jZC_xa+ilM}i%dL2xen^biubIfoKXfiaCAd62hC>t8Z zBFVVm^xavZO5Ku?ITIJL;BN<;Fk*FBQpo{es=`L%*^7X|b>dmJul>GhYFYI}Uc*+f^$Ye*xA-OK(0XJxKO?bPLG#J0e+c(WLr_aud@HrHC%jz8-{PelX&6p4nMPv`Sb1Do`!J!q=Pm7AeS;k#dH_&+V5yACWaPYKQBcwXh<^v{_h`{M~TA6o18 z%dJC`_gO%i&F%`-0|$CO%IUnu&jb5~#l=j*#vXWsv>SGOSz68C)j zkytjQ)i9gscsRh-er31(@@Bsvn)Xy9*7k;G~li28hcZ!W6W6u7LuP?{pv;KR)A}{*@#but+4-qXh$*W4xrT2hT zSE;%&k+46JHU1`Bb45VQ1HR?J{oH7_aGI?+Pd`;gqd|b041%t?tj0Xq1`ydXS*LW6r&uo`k z3F*GKS3vQvgl)sa6*kIPF@`x{z1JHR7MLQw#txPc_9WzfAwLd-au^XLMBPWj>=mub ziV)P8WCIAx`-1|;FNn*c@l7L@q1Vj?&knDsgHFq*i^xt?n#ec64Zd@@rmdL9lBE#I z@gn#FS+!-(A1z{CX?WS@S0>P4o!20%0rv_ z;Yp*ixJDc!+&nTHn`hU^x%#H}C(&|3%H^hA4);l2#vo(_XGR70;ux@1>%s@bIyG^G zAcR`e`Uyw5MuD}PJHV3iG6)1mH)uE>zaFFSK22xT`h^g6h9IelRKgSWUdF<2km#jl z$B^(K3mqs(!;JCH4(wqsQ2oj{8JtU4K4 zw$j8JZ}FyFk3^ zBRamQl{L`bO^TKRAUDE&3wdP`%GinLYJ53|t?b@!Q&HaqXHM^BCC3?4(YqZhF@nZd ztqbVxtbFUV67o9*$NUN?YkOI|xz$Y$x-im5h-cH=U76SkZ;kZM=`F=~8AN;i)%N^Z z;V%0^vmwYZ5epau+uc+?~Z-79(Q1-n628boe|))goYEnmB1)8-|BE zkS_gO;$saK9+fj$TYA*~w2e{T3%rS=|JCpEpj9Mk>T;o*vd`B{mRfGPRcTXJj0%)} z4^rhP7pI2QLrYn{>TQ5A3!p_I^Y3Sd#LK&EOFN24?PcHOlm0 z_5zXxzl@->uwbXvd{m!V1Hw14s5_YIUSL+ADqfvUz^AS`$KcR61Qg@3_{f|Ct=Nr) zflvtfYLU5oQ1Gpsl41y7?tp6+Xx^RY%=f&>EqPFS4Y2j(TDsn2KdZFm+!$|b_3!Ee zxPVUSEYzRf0%M4y*K#rFdKp}VaY!k_ABx2jxa@rH^f`t#k}feoUb#7DBvi*Cpy93ANR-U%P}DF)i(qFUpE)xPyzzVJSEftEC7M*p;hwg7)<`Wkf#g>G&3?Eu z_{j*m@4KV5rh*D#FiYANdEi`w$}42a`>J->kj_k#plkR#if3c~Zhm~EBBU=NNNYfQ z@?7;C`C%ppiU~oG0?KBD+99tpao;bBy>W_Xh)^W zieiouFK@zj4NLnWYD1}25@Mv{`fkO+r7N2zOn?`cg){8QrJ7lunMv9B|l&}Z_9u_2F~qe4%-hE|~0 z;YVS4fJ>VZXE+w3!~wxhSb`{B)OOWG7Xxlvnz*$snCa(??pk=RvO>VH^nK59O%ZXa zV}#&oEcOX|Zc$IA{oJQWXIziC3HrK;E`$a+~wh1J99kWu^jComNltLcV3fz_F>v_pBAh#-I_!f*Zap-_mQ zOev65s0B=Zw1a}KJ@J*qzF@x#wQ~t|w!TE`Zd(Tv{4r~5%JZo1VAT$~?F;e=k>_SV zY$#6kmUBW{K(h)HrJ)`Fn$h^ifK%W|}c?0g}+RzW{$0Q^S# zh$X&ONlLNa#~TkTeCM@g5UJyjkl=YI+;-4cLk0IR1x1J;cG^W&iJQHM&irkdho%K9@~XX(qZHenX- zUo4O9#`TgPnG|P)!#dN?{YLQui!H$66AvJ<&BYQ?+7>$d=SgPONr+vZu59r1QARax zLA&X+->~;aoUBVtE$x^e=b&ob;gjuI5?z$#6_U*%@9QavldvNSz_GW!h z*4cGY+59hBL`&TbW;*X2ABuqn!s zW=71s2Lb24p;U@FMdU`&zu)#~_Hlkuh2?HX^;0o(@W$0~i8>Cg;4}nyWd@@n{ow{9 z6WO6=vQ%I5C^F>I;9pOeQ2Cqc3PAw~gCG+%cE+5;jL=j`N%YH>Ok)cM8*PLaG2pMS ziz0lO{IY!b1v396>qD(dU&BVMcZM=R4m~j8ZqxgU-KitX*?pxJC1%UV_(}3ENZg4S7m4x0 zc{hh&X`4MRGFyj8eQZSFjU+x zUZqjg?CWDx-j)5Kz}aA|prG=50?1QNw-m*G$+?Y&rG}xA zA*fy#9_+U<`3Hga!k0+7tB9uY9Tp(&+_sbCq~U8f$#KZxh@OI+Vjs)uFi`=Xy|;3> zE8CBdoIk*jzB%p51>PsHA}v0{5w}=HU|M7ly6f{LCz0_xJIi)d0&+0qw2&zRkTBX1 zY<*SW&^Z$Tu{MS0Sbe`+fTh$>r%Asb{_iZ*$ijbXAo<8`ipiS(Zn~*ZJI6j!V*#ruJj4lRE$$2)$ zZ^BCZ*zsIBp}7I;K^}JI&@G-m1WjLd3zGoXm#FPz$bnKcAbk&xAMYC*J`Al`Z&#rS zo_wC%=e_q+mxRuO{m_;C#Rh-i!R}Y=MoJP?LPMYl?ug1L$=x6@$hRrLp$#Gem}2l# z>rH4GM|p$m{^)1cC#IHPLXY|cM&$Lyfq(T!oU^_eE62V&S}?5M7PKUb?nZZsp);d3 zhU{w@?bcYj4h(TP-=aiWZNe4HHP$J^<^&7^X6rWvrN zWnwMB-?}?gl!3W&i||-2dN#lhCN$~cEwX{WJK%X zj)llqF%YB4nM2E08mRQp9mr{q`ed%a=l!ZHZMjshkvvVm{BHkE0TYk<4kXE@M~<1M zxd`G>OzcBy8!^h(*v%%i&mt={sR~75hPnDacc}tCvkPl)AMADrdMyEc2fIqMt1Qd} z?=~IfYgQr$e8``(#39Qi&>3GfHZ0F@qm#l8eX*#M@=#p*#)_jB>%(CJO+X$XO*D;x zisS~#CEhcvec-4$OB$R4u?awgfx`ZRD>UREWA(#AG533f=8PmrIW8fwF*QgHxk!`I zOks(>a~2&pWdQg_CgMm57D&NQyS)=g=HE4BG9?6FEJoI=Y(}M1)4`sPKnKS_L*K7S z&y{Z*0~7aqy)nXyABqQ6h;uz1+%}tY$BKp8?z`)Y%r`KOdk2%A71s*w7mjcGZ=+%M zB`82x<&1AiM-g8{3=I9G?bFfX-bH?reXtm!RcaTS5JB|+%w@j*ImvCd%i>G?bo~Ce zi0$-I%QjMwzD8^s`?^>rM|=0%EzaJ}umhxt{rH)d6(++}^xu)|jvIU2C*Y|C0SntA zYEkku~6;)O9paq2PQ{-EU)a5L* zF>?f4xd^pegfR`Cw?7C7q^&Zh$Xxg3Sti(paL-n~F2_%Z^)yn9R^W5#5pJ8|gEvMkH6bsrLiP3WR>la$;{BDYN= zXuSS0Zn_w0mg$-K_2#o-272@bK0;`}@HHzV%=Px2NJ(LUaf&d9I)h1)zz0i!Ppbl# zv>=vQNGn0HD7vTyVS?A)^C<7*OFhGHG$xD33GU$fwGeJcY>?07ZgYk^ z8THdPSHiA5pPZRrLI%-~SN!oR=!wiCX# zKRKkyeN&9FJqEinO@I5iEtc97PkXTfA(AxBj&rw<>SzEo>S_zrol7KLT}peLZZ1Jj zkI+sw&8_X<@$=i>hc%9XSbosFN@`pp zU)3nQ%L0}S?Sd+w%vlQm9V;>?fi;))qS&ugL&9JWVt#ygwj+zhzI@!Oc#SXFv@@Xo zC`=a7e9943ks{e-6l(Ee#ub;{(d258Jn{kA6neEPu_F2fn|T=Qk9NqjoWf|VjOm$D{;<1gMskEqnd)IPps&p0h*_2=0h40G&lARu@0 zoe9W^$yC+^Q*)fYkYK zutpos7UHakDV?mpmZ_Ivh-VmuBFuqT|LPFJ#S(CA<)t!>fyktF=mS+Abtr>=5~V+X z^h=Nehl=8j2nHvxV3QO05E%~vyZJ@gjZhr#fGv=7#1>&-$dSNavYT-*M+ip=D-1_q zpr_0x4eD6zr*X-Zn6d_OWP-{do+SikX1`f6E4JEDjLITM@I#ZmMxgr0V4Uhe9>K&& z5lr7iU-aG%Zg(lRdbk!#;b(VdZA_K=2%IEM6??O>{suK=Yq}8RKIXp+E}O&fKk7O3 zTU>S~A;A-AtkMq9#d85YVj&=eJ`83tO71vX4_)ipn+UKg7QcK-!4cIctN8pZmdvKnOzC3mF*aW?#EIF+jnC)1^J z%_JQhL*S4sV`P1jF$5e{Kl{Mu0l&yHOqeO03f2bEh&r&M6aQ6$Lz|J5Xqa)3HUq9F zhNZAtl()oa!Lo@A+Mq<}H0!a19O|At8D()&Yp9r&+O%t*t<5nG3>TLNqNJvr2|MA4 z=r#Sw3u1-6Js~!W$5s}GEwieeYNdp&oP$p7s#+c6WxiFqe;!_MDXizYJag-QnlA~T zp`X<4ID_hLdjW8QMz<4MUA{CsNW2^ZPzJTQLeNsbhQrt+g9Z1eyj*Apv!y|2b_LU} z#fM1KbiOW(aL4G!8_wTOLuRw2eO_O({Kvi%bTesBM~ozkkq056-)yl=o%mj?NYxMQ9MkRBO(d~%gm}~IZFQF!X&n;toUN~fY%+$f`7?Dr(&!qYhl`;FMursf1uF)Z3G*O^WQQqXu!PC9Lk#tNW90e`e7 zBzPC(UW@LGp?>cILkbLnLPU?ELy~KOOI+s72S%euGbpx0MJBnNJQAiUi3~$ogw=?| zc5AOJZ%OjSkj1!WiDd0=OI}@OiDmC|1hb7fqSzXCLrmu9Qnj0tF+i2~E=DLuY18mg z9doXPWpH3&QY&O~n=a;fBjPaWG=Ubf+zGkuSBkBN>WwtQ1&_UU=QD5S`I59+UHl&2 zw#ywm+ni4(J75v%ai0Fc;&o?6ADvb5^56nYs&Y7sg#q_GVM8{a8~|OG37;Vvm5vJ6 zI&Big4px6+L>NUfR$n5W?z*v!vlR_YsI{i0L^EpWEnW7=eoOr;pAl_ZNVJPY#p1E5 zxC1>?W2O5o^C7;!t1W|S2RiI zr0qrgftJlmaXA%2hqfQku{`igPoAdHei~eI5bk*q(}2>Cw;)P}GHN%-xjN#dKKP`3 z{Inftl_YG9IplvvZi4@{j_A6w?52}&=d5&h-%c=KhVo#j`l|K;q!v(JLyg8dfs0O8 z-98J&0C(E-kONseEEoL`9{W~CuZ6yA$WXHg6SP?RKMFUbT%=phlU3>Q>(2?QF%)s! zVDgb&r*_pMo?-&lL=6$kr=Ks$a>z(KYxzMMqLMSdAH8SOu~POq)Exwe`DuM$KJ{Ft zK8KyzOhwau&f|?$(a@Xt+ER&y5G+Wb_UPlM4;us|VE#7#@pz6nfeB0`N%+r0Q}ADm zh_B-JD5#sI04NGtNnB(!mnP5dNRIsH;P`)5&M|aLIPihlcC5TB2W(o?$VdcyTG?J* z(=VC_tdV1@GQmbhH3tHBdKZS)1SeF+LaP}e%W5hXRw`Ol3n1(RGHh22ur9=vt^g4V zGv#ZOBt>{XluY9WI($!rra<6uR6aB!YtSqZcHj^MCgx&OKKwZJ}!=4Qu6cZYH$ixBm^DnQ#dZo`w<@V4lZbhqfpTx zX2*Ihd?{?5*;(-_t`>|S09+8Dq?mFkWvdh^>60maNgv5%xxQ*kgQB@)Idgxv0Fc}F zynQAziSRP`7Mp#z5gow=!~yVsWIh*-oa8d)zvAz}#>hho2_9k$HSmd|pL=i{1ol6K z%TY^l%?O7K(WxU41@*h$OvWrodAQDu+ITMovx;_5W)*Q9+$JSubFsi+4wQB*E8;5S ztC!K|)41zWdT3J{rlaiL5zzofQD^BWvzS3f++;eKNSWS$U6dp=dm~ek$ArRIL*1?5 zkuu{R+KH!S|5Yv*kzTUdYo6p#Ocaabw{`$pOfH@Q(Jr5=Ly;izKMdz=xW{SRIh6i( z*ZW0E%r93_(DmSe{s#-SG>J=Dn}kMol=R$}~_;1pbu0@{UbZCzV zK5dAxDHid3g6kBIn4H_q^e#d` zw(C$(6za}F=vW2iuxgQJl*tt7mS+gca6Lp+!N6!GfIlAd}|%?1uam)t^0=5aG~_J`2nM zyLAXRcXbd|bn-XbQz+iT`^Kyd{g*jY>CBZDG^-LFosITiBJrhdV-d?(vf8FINGq3y zmuIW4M4uvy5*2}yR7RqajLPLy`#mDt7TT=D4W3aA(GoKv0yR&1oquxMP5 zw8>aTaVooIbP2z6mg5Gq+8EK#ss>zk?!7h`-D;vtb$$KVsw7A`X$IHiQ^)P}%$eg@ zcYyi3)j^@%L9SlE3t#It1HM%=DRr!=hD<1VL|5&>dR#{>>=MedI$mKvWOvJX$Dxhm z679@l%Uk&{>?%jX8>6+Kr}kG)kSMVcFp9EHW2@`HxLsPKI3rVa8#`TmZ`g0XhfkH7 zJ@%1_ELGF0j-Gs8I*g8d)uO^bUr{Lo5FNm6nNmg*1UE zMHc^Xt4#to!#Gx;Lo$3VlCc-~FJ3~L2t8Yap#`CruJvlU3}BA6UGG03p-f>o4ymel z!ZT+0cH|Z=q>fR2UU?!Iy8m=&J0a_rf<-v#TwDUMIV$9 zR&3Ofq?p6u4Y)FlA0bnXc{OSkoPHaIBh+(?x|qhAeDHF})9G*t>98PK$uie6 z4YK((ec4tyj0!{EC{t*P5^jOKRXuLV0U7t4&zRtNp$~o8=N9Naz{1l4!m`J0QVj%Y zuJPIQimv(=a=*n{%1U=EcpAN_uAX~ryH#cCc5 zP6y*T%D@#pg@4n?9Ud0Zy2}w>t8G&Y$L)`>YaB42*^0`ApM};{OGx5dgzfk-JBA~@ zxag$<+d<|{4jIFT72C=H2Bv^OK}&ssq699+8U(tw0wcrgIqk>*qnNF{7t_g`aB_9- zW%x9J!ZBOZ>zo$}kx!vujm^kPCsE2IQQE?>2JO+pn=5I%gGz!-@WPb*sM3T+w9^c- z$I`5bcj!tnztdk0LgCd)f;Ti_f&H__N_Nx^Z`_G#tt@Y%Z5{YO4uzV96z|`6*IrN* z+8f%L;~+}TY0Q@sP+-NcFSVdhEo=%0E8jeP)Bf;TIX2;Js%={L5=0*=D4B16vfGwb ztNplA$VAyweh+!$8gc?699<*4;oCd1(EmR zy=jZ_VLuq~S{!Yw?Nay^Mi3_aD2H;#RPdpoE|MzFbxD9oW2K6I8rri9!PxanF1^sGlMmP?i;#84h`V~1*Qr7#!hbbJf^t7Q zoYo7%l73}WjFFlxzbJ=ty&*9p*Yv5(Rr4$y;`fdp)K91FYOa`gMD#4bhdHb~&)yBc z{54N(-Edvxw{tgmwcMF9;n?oVS>zamWFtS(r+7Dz{q3+%=_wKM_=!CJ2#H+e(eXTd zwUbmy%~9KY>TW@2A#GIR=zjI*4{u!&ocXpdu~q77C-8T*z4X;Y7^Ae8lTU1nPofHZ z9Yc8r$5(ybUYeUCJF2emX5o+ys6X&p)r@RoR3v}NOn|^YVPxdFxHs-r`Ibl>A}4o^ zFX5`V_`VMR%|G7`q!kpRe=Cs@dSA#m%(ovt(nR0}Dueh}b$CVVIti#VL}z~Fgwlp# zentib9uZDAWHA2~oHb~*N?olEn&`YHcm?Bo5l+34GgN4QU1vmoi= ze92TC>cSl2qM%M+ne=zLMZ4G&TetIm0k=Cka3PGF0@lxFdL9S9vPx!K>)(X z3hZCEteBvFa)EXLRl!IRsCH@b&-^TB^dXI7DFoy4W>)hgW{E_(9zAhfM$M1e32s+sps}#qOGXq(! z#y8Q}{ete;V0O2E24igQokHF3CUu@|1m*R@tbAHzCZjBF;|?mBW6-;2Nou4|tvXE8 z|0H+svP~T{LcoZ?ABdmjbyPJ!+e9sp%)Q44|8rSjuNZZx@XRkDuF$ovj3A1tlrbWRa8 zWGztg(11}(@UKRFw>&6U)UGy)7>}u6R0>}nSL$Ei@2CTuPnl-t;X(l@k&Pvr@eT0G zOKf%7T#Ae*5_Z{Cl?CSnAjtmES=GoWz2x_*D*RXt%QKQi(+@^u;UnUz@5d|^?9qV# zHl*hpI5&z6m%r>1Lf3C zK>6!YwNc;4O{?S5w~yiL;sY}$+ z=zY2UA+vc~E3Bm{vyZYHO!4}>$ANR7<@)hwv@!Y@E$@Ob?aEta8=Jt&{*CUP{7t{S zegvJs_r`{On!6h|4;;ck4`r<_!7y*PkaO8E7ZNlzD5G|G7wVykbfv7gw3=IuOQ~iu3;>A6F~Gu- z1S7cPMi;iRj>4Y=A9dY-=~w#hPco)t>$;-6PSoyd${pOZU&66JAbU~h8I}lsnOWY8 z1k9-;ov9N~P3z+CDnl}EM~~}0XeQw~_c7e}qPLdp5yk2e;25(!pw7f{kv;fg#n}Xd zVZes7Ly<9rH?x;U+QifN7Fk&^?|}dRs0eASvAG`aKaM-^zk^4i=%3;EznNQ(A@3&$ z%*8ZKMZ1gPE3xI|>Qr?^A4>9y+Wb%?oN_vU^;nAo|Ht+IC&iqLhW@_<9(}rOhebVHkmrxWJBvtqG0E4T24pki+UpX zNBqq)3!xDI{2}@$e%dtwoXH7T_1_w@cs1=%nQ2-4KAj=NzXtAjb^6fcpI&$R{+{7> z@fZDnAPj3Frm|kDa=m((up>*d`BF^2UV`Pdq-ns`VeDer@o2ijAa&Q&NUnAN;mf-6 IUJ>;F144@HzW@LL literal 0 HcmV?d00001 diff --git a/src/assets/fonts/inter/Inter-roman.var.woff2 b/src/assets/fonts/inter/Inter-roman.var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a6efdc48675a7fcc5970a8fda1178552e837dddf GIT binary patch literal 227688 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 z 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 fq0KnsitX`q#YV#3FI`FZiO=`^T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/heroicons-outline.svg b/src/assets/icons/heroicons-outline.svg new file mode 100644 index 00000000..dd3a8301 --- /dev/null +++ b/src/assets/icons/heroicons-outline.svg @@ -0,0 +1,695 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/heroicons-solid.svg b/src/assets/icons/heroicons-solid.svg new file mode 100644 index 00000000..1bd3ed23 --- /dev/null +++ b/src/assets/icons/heroicons-solid.svg @@ -0,0 +1,726 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/iconsmind.svg b/src/assets/icons/iconsmind.svg new file mode 100755 index 00000000..9b62ec45 --- /dev/null +++ b/src/assets/icons/iconsmind.svg @@ -0,0 +1,29079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/material-outline.svg b/src/assets/icons/material-outline.svg new file mode 100644 index 00000000..e4fe07b2 --- /dev/null +++ b/src/assets/icons/material-outline.svg @@ -0,0 +1,6025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/material-twotone.svg b/src/assets/icons/material-twotone.svg new file mode 100644 index 00000000..a54f93dd --- /dev/null +++ b/src/assets/icons/material-twotone.svg @@ -0,0 +1,7590 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/apps/contacts/flags.png b/src/assets/images/apps/contacts/flags.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdb59bc24504e92949047482b1cfcbf181bac5c GIT binary patch literal 33805 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�fbUvgug;S6}?HUA5*E!e=I5-@^mqA?>~8EU*+t3 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–-_Vn+SG06}e%5-PP83yj~>A{~ai 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 Jw!=@0|Jl_AV<`Xt literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-01-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-01-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e5c15aaa4290beeac962f2d68abc3544605e123 GIT binary patch literal 2332 zcmb7_c|6qX9>;&PkKK&HWSJR^5L08xmNom9Wu|e%2}z8~G1m0LFuBRT99yEYb&Nd> zQt8+lOGubwsdE#uU6Pb6hLWfZf|X84S+xZ z0OBv;a2ButU=S!23W4!A7z_qS2qO`Ei3te_2&2T%Xp|TVB_SmzErF4dM4_+>SQ&YF zJRUD0tw>bF5#?}r+>b{<{Hq8!LKKM<#bHnw-2bh^ZUBV@sDKd!gaW`Q5CjD}>;>ci z01N@~1^g`p6pn;}AYi^L%Rm2N|LyUs`4$|CIGh25A$(IDBF;CbeSTB~z%i~m3*#E` zz=fH=ijtD2%i9<;p{8E(Xi51=KgZj;Ug=D$f}*-&+JRTEg()Q}_*5`j&R-hK-mRZ9 zxhKYqO4RN%4O!yMt#mAg48$(AHhjH4jEMf!I24X|4e>k}iHrE8ohNx>tfg;fmQ)|j9VvYPR z@%&sy;sBVR5DI}Jph7=d2S8v56o!H;00^{%qNX`g9HS*gP&)1E%a9~rDAm?+qlG2p z=5>vY^MfP#0|A)=-~QyBdC0pSaBkWp<*(I1ahKai)5)#_kw6ofuxT(n{36$|(|bGX z5Ln_ieQ)FK-MfAAV^He$=S^A1OgR++Y(ze(TNRMg#CzWJD5ugcduLWOQ@rU%#bBxs zw7HCJ@5SiwtUo^Eq~>ah{liOuupJXcFf*GgS21C@I$n1OTy~(R42u}SRW{Xc_lWmd z!;$;Oo1ywC)O_W9UEz$<+)PEWf(hP}#fE0*u%@Gh^(h}Ty44MB6Qi=eTBaF&_pybf z9~rVBHRUW-pMOw!kxM-nJW1vzbw7TzJ(_PjwHX~K<5}sxBkOj|8s&Fwj-*^%nQ@`E z@F5`BwmZ~&CEGr5%}wv06S*$8H`%gpa?6yH; zYrRo)QOD}h>e5@!ZxVdd&1i-57p~tN)NWMz)HNmVO20cAm9mvb(P{37*890U^iMhi zUY`q13{ZLhdg*dxRTJ%`4t&uzk0T%}7`(gzUd9SX@8X#%bng}2+U6(CeH4e7yo%*5 zg~SxYr?#`FLM|mfV+8rfbq`2%=qq5i*VCdGMB1Os%+>LDY74dX2{g4!p5Z<+*E{3M zTVe$Sej8_v+&KoVLqyJl9O(Il-)a*KC8LNBr-UKJdjT1~E*zLvz`t|Cef_ibsDjz)wx(@=W-?jqkF0a5I8R0ww%Zu#cW5|8bug;A&bRU#5S0G zavehfAPApaFxXFQ{g+$-NY%N;*E3JNv6>^@2Y;ygg27(#3p}7?717)@=vpPd zCNjT;lGTpB+v~&W6yS_S$7q=F7$4Q}ivFuK>4B97k?kbZgzBoMTQ1~MQT%f3@f&GD zk3j5W5rlPpQ=L4R&<*!j)c8-OO3TjLb_!-F_SIuBqR+TyrFOg4eKVtU#Nrky>N_Rf zEFc=Ag{4YHp+bAduP=Jf0 zB{a=leF=<&hh2)~(^{d~rDH!w!2iAYBe>BQ`j8~#Uwvu7)$CZZsk^C$h|m+vx>WfD zv%O_`_5s_Gr)xG%jy~gBI0Pf2#qhA-Ess>64tgCE?52D%RLM9ym3L=?s_$y17r3^I zTiDvd>Irhtm4;>4*N^P<;c{qXvj{8tM%cDdEcc2mNq)GCI$nyT<~b{knAlWhg{Pr!)8Im@wYL__~*D*YFkSk%Pl7?tx1!6 z{*K68d6n}D#V*tCUaV{GYGbRr*R4gBJ^hAP_9tH&SXO-V3xo_M0|#ptUOg^J?~uln z>?u1X=eUKb_0+K|b4g?y@oOVWXER0?JF}f1fp*N1cKzHV8N0r{QaqRPLf$atMSFp) ztDrMvd`Q}XlfU%%Y*$$xTe~$=OM9)Sw0m93E|-S=Ru;=`RlV2Z@|a`KdN*EN^VSS9 yYUCBnIr-V19dWUyz_(xYu5^&prmgooLNsG{(uumRl~P2uReJe#9<^h7IQ<{0oz;v0 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-02-01.jpg b/src/assets/images/apps/ecommerce/products/watch-02-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..606b4aec8001867c9a7bb4dff780a06c5fe291f1 GIT binary patch literal 27322 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 Bji>+s literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-02-02.jpg b/src/assets/images/apps/ecommerce/products/watch-02-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f085bb33f17834032d07e3666a8c4c554a15421 GIT binary patch literal 44651 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 LCH)M4l0X01O2rv^ literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-02-03.jpg b/src/assets/images/apps/ecommerce/products/watch-02-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9ea7982ded00696b5a7b93845e016a329ca0d1b GIT binary patch literal 32916 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 oBXU8L53rKAO~^&VoPx*|FhTNdN!< literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-03-02.jpg b/src/assets/images/apps/ecommerce/products/watch-03-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e3f0074c01053aff28da6fd24990be9cd28e921 GIT binary patch literal 47572 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-03-03.jpg b/src/assets/images/apps/ecommerce/products/watch-03-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11a992c88004c67754a0454acd9bf5f9068d15c2 GIT binary patch literal 108543 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 ?t~A&a^)D8KF+e^b19OjYMI6?=$p^)>Cw)lL-$ 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

f_6fcgmT!Ca#ghH|=ql~G7EJ4PO`@+)OlYmLz(ΠF7b$tpCXmulS2KCqUO;?h71229dSv+x?)F5F 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%0AiZBSEN!8s#YLcSELRh7iPThNi|R}CpN&trRn(| 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 r4-u%x&VzA{{a8lkTAiy literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-03-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-03-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b398b9cf3f0d8962ed74b4fc886096677be9fc18 GIT binary patch literal 1870 zcmb7FXH=7E8vVY66nYW}J&+8=f{v zAOL{k1Bm8;697y?4Cw9+hr!@TStJsHK%%5&BxMy)iV7GM2BWBqQ&m*bP{Lr;wAC~; zwFm@)qN>gw9lRb6Pr&aE0by`B5`mOQBIWT|3>N=?L-ZIxBLOmS6bhmN2pWW6YZxww%!~8&j%&d{-!?VK66C1 zY{7r*+$lkPsk~U`K@od+;Um6FF%%ImZUR zh1Py07R3mxcyUuZ>QQK9&6h>pLUTU}qQ6y!1#8BVc;d(RLh2l$T54BzZn! zBI0*Upv;i+a}fFsa_o-Ys1mrsIJ@l)@gO~hwYtl`Yk_xbpd2{f1R3Q=^mEO$L9uF3)O1;pBc)L1`#XZKu<2)`!m#H zCHU>%cham@GpKXUV=50hqr*K(ttU3DC>cA0hI3*TNi1E8!QPnxJt6T!2lK*?okf0h2OTwdSO`xsP~SS0XE20?OO)ir{I)ub0ig_rG1MmG-Xm zdFz2NVQw;quCl-5Cjr6`Z@jIoIkSwdTJ5@&Y}p*!hb3=~a>ff{YE+k^i1)R@Jd(-* zNfpqI8(qxJ(>D&r7X}J0cjLyIU%oN_>9M?Zm%r*L$$IdVCAz-)gW#46*eb}HH+~v>G%y$ph=6iWUVx2G(Rd&wmk4N@A+6vA>FoVWG)a%L&{b@kp#8m2 zX}Pk57*ea0-IEY}((z+1Nqbv}HCSw-`|MlL7YwHGX<@Xw*!zOIa55t!u$rBId(t+! zlbMc>A4pAJp>CcbQ>GjFjcRx97BmfZZ$8Uicy%(XhI+{FW-PnTuCp3jQJ@jh7C*N~ zZ%Te^r6_EAc_g5cW)5qk8x0}V9GQMn=Dbj`+iIf4nE??ez<&Xv@kC<)1tE|;zPl;} z6uauWZ2DQA!}=HCF2XL8*Ym)BT)EmLMa)-51OH1FPXW=VNZ*O#B(ehfZzEGgGyet$ C+Y{IT literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-04-01.jpg b/src/assets/images/apps/ecommerce/products/watch-04-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bea6491cd151168939cebd040fa859e8de6d16a2 GIT binary patch literal 29274 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 T`I;lOp9(M>$7}xpf_MMfgv(O^ literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-04-02.jpg b/src/assets/images/apps/ecommerce/products/watch-04-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4441d0a1d33586b2466bf1875d0f5c43d30b8774 GIT binary patch literal 37992 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

tbiN~;K)2ZS27(|9OHqy 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%0DY~niu~SjVNr>>bRW!&-y43dD1IC|m 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-04-03.jpg b/src/assets/images/apps/ecommerce/products/watch-04-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ae92247f08aaff404ca3222c42f54660cf659bf GIT binary patch literal 38757 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

b+f^Lqt=Bh$YTRQ^c$~7bID54qWx~%+`0?vP zr{(^7w&Zq^e3PRSC*LT&P^leI(8KETLTY7~4|65FM;8xf8k{&|K1K|iSi;b8pOeXC z`?gR;)c(t(i(9@Zx{!%Z6K0xyd&pvk_Vx1MTbrS}Pd{y+vh=Q0i|vz!lT<)(gW;B% zCTc+>=a&bN45|Ax#_74zLGtIyp9|Y&&O|gO*SFra%P;&y5$&~lO)f1dh(664Mj1YC z$FxP(pOZVT`GcGO_4?+ATfr2k*w`hA&jkpqof01!cnyJ$=DI9&7Rg5pO7a{viv|SM z=lzF=YPT@5;^$HjPSfZEiSP32uJeb@N9x5v+6NI#{VJS-dby zl0hMyieV<(c!*#*Q`&|;@{4+9V8GJ>Prcyg{(GlH_);A$^+hsg*23?F;c(?lBQwik zwe%7Ds`+t?+(+9|29f?^%LsqvKVJ`V@9romy=l8^ZETpodMfEk;ZATO&MFD_jGH!b z@2-ypFT`<{O^-5m_(ZOaSLBEC-7<*tjB3H@oT_Y%wD05m+PlLo+QXways~c!U`=C1 zB~l8JQo8%_iJW&E7TWmxT-{%a712svX841^u9#7Gi-qxxin{%*0~^nZD{RgPTh^gz zP1GF0*%%)})-poO=>h$2*k|8Hx`KK(Xwi1(Txyj0?lkjLdo1|^(OLJ`jAN@^G%bFG zlf?=G2ow^HLE`?Cm2k2^0F9y8(RB!>)DODJdiu8R0i35}{|*!+0uGeV)MY|_2yv;Q z92sriNx_=__RTr8xq8j^frgR=`EX3CVW90aUzeF6TPnEd<}zh)-Ky5FgV-^^n~|Ai z#+69QinJ)!NPNXXN?n7mrw#Qu&d-r*m#Uv}7AbJr7oeZL>OG-kTL0vY*W0#?TNM3} zxJ~j+YQphGRmfg;1p1bPB zk38OD>TK$#0wdcAWyeK3z~0;@Px|hviOibT_#-SB-V)v?Fg*qhZ-l=E!vi!#vBSXZ zbY1rkvw8v5eO(n zE;CmjPI@t9wy)w+X>G!sM=$;Hy6_#6uRdKDmTvrzpyhht;g#5kH;u7^j<6fGF1|OD z4P#I55V>kQ<81qyLca23%z?Bh+@#RoW6psfa+fF&_g#->9c*xZ-QAV8=GvY&?vK>G Z4DH^=H`&pIqvvA^>eDw6i}$Hs{skM(I1K;* literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-05-01.jpg b/src/assets/images/apps/ecommerce/products/watch-05-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1d2f429f9ed6d8a2e339c366d097124b8d4e7fb GIT binary patch literal 47786 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 z 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 Y7RTTmxDRwWUkUpkUL5}bkpBSx+2PdNZvX%Q literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-05-02.jpg b/src/assets/images/apps/ecommerce/products/watch-05-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..586819b82bd1986c7a7abdc3dc0e205bee12d55c GIT binary patch literal 67235 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 z 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 XuL3%~Z=M#SvQ)1V@BrMg{{a8lk_J1j literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-05-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-05-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc8da5235aae466acf9bf97d36aaefc811323df0 GIT binary patch literal 2120 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-06-01.jpg b/src/assets/images/apps/ecommerce/products/watch-06-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b3a804d47cd562158252a6157ee1022facb037e GIT binary patch literal 56982 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%0An9+8Z1h77|f7&TUb4k(K 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-06-03.jpg b/src/assets/images/apps/ecommerce/products/watch-06-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e6db6eb8452c95d19acd1a3c162e5ae2105fc0b GIT binary patch literal 61953 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�kEEKD4AgRQwH=}%`fLRT# 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-06-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-06-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7597532081d23ac313c57925bcd1a78bb353ab5 GIT binary patch literal 2482 zcmb7FX*AnuAN@x*yF?_WN~}d}wWMLt3DF=?`_h&et?FWp*jkE`s+Sf`VjGPPsUjVe z)KavTmTsA%r9~UsPFiDEJ+%#5lg>Hsyr19uob!CS=l49ndq3Q}Grsd4Kv112&HxAm z03gW$c0_;^00l!J5HM77L7`9>TwWS3fs&k@j670FSsAH>M4~Y2swfpTG!prP_77?r z8k(A#C{-Oj9ju-@RulXE5s+jQ4udO7ODkekkSf^!8#@mGq%`0M*n>exKne*0BSAa; zfVyN)2w1Y{zkmTyxU>`)@|{%!0aD=aTK)$K1BHQh-T?BFDJcXPA)z{sUf}i;4DiL) zn_3PRG-Vx26JWdajFG_uw&_fWf?ywYU}ohneK!Su*ARQ+zzg6C+$LC za|=rv@$)*({m-j^VsUl=>-PzltSeq{#;2zuT_2*HiZ+v#cK{P{-`=cq*Lrkb_p|CB zF^#LbCuW>ZDRg%?3R-gM23^|@R&s{|-;i1prR&4SWp0)SU6fLAbeMUAbTLclIrG~h z1Pg283+^ePsD-9&#aOVwgVp<^6We_uF}wE}Q6iRr06<_cSPBeCw)ejO|;>OjJAhgJZp1?xt+^Qw&_GGAh z1^UkJz$Y2abJ#lN#*X}r&@*eHb6306x19UMQsyvwhjF^ zyU6P|s44a`gP31^%JtSDwT1KymGxQF`rCSg}^z!9(@2B?3#eh4fvf=I>oG8iO`KG&;b?VP_ zX0Z5v*t*Yu)GKrxnwk`R$~`{D-MYhMRZ0aaY*RplwnJ0a9gkZFw!Sock-B!ssil-> zZFFNZ_tFDJ?96k*=b|Q}JniST4uY%f=*VPq5}Lf3MsW^1u*ZnRo{W0?I_vWGJ+7Px zU7LYQYdw-ntFB4icQy}4#>MJobcSI zMd6wrd`1fYBFwxxQIR>-4)6Wd;R%2~_U=ML{w`%yyHF`7{4LhusJYDJq16+m#SPH` z*6IXolD&FZ`&`s;;4V`mqIr9_^~$IF;)#4-^K1UCxOvQ8+i@qpqiVPTtHKTy^VR{h zia)C`a%}5vWKelA+Jr;-`gDK&{w`Afk8@TrzFw_v;qSe31+Dq3_iSG^UyCp?Y8&K_ zMlf!NUjOVAWvW=2;S?d;ne9kZPe>7r)Oc?M*(DeB;@xZj8LboIcR^MSTQNTBRU>T! z0c`)0FBZ7LO2S`zB4oD7{EzJTNT4AhhHD8MO?$(nDW7~6G&l68&Qk~dZ|xyV_99Pw z&9BjB1i=aIqX-usJotERj>gZE?7(p8(|$CDp;Rxlyj?A^CGQ};$lP_6f`O z7XC~?W_M7vU8_Coro-Z1Owv?Yufm7`6P|xNr$2Ext+XE*9e-vU%}jh4+@Vp2GGmXd zs4y(`XHN?cml+PfuZmwDo+0*iUh>eTJjk&qkU{IZ` z^J6Ww?3q7Y*w{G&fq_gk_BS|gG4Qi%h2i31=Q7z+E> z0+18{h9I>qppxEEMrj?>v1DYj1+e>nEURF2&8>JZ{;@(*&O|`e7f`;G#Zik|aW^Q| z;^NJKudd<)CU)+2V~x}kMbi=H8GZ7F8$2Sou{Nm11M*dI$Yq_OQdl92p0?4h$LHqTM$#kaX{?KXtJ<}$dLb5s!9i`#!E z+0f5zYB3PCpVjU*J$dI^mRzBy=h{GyGmmo6?#c(xwZza6L-a0nh8LU4Ca0t6e}VX)w?gAE=M+}+(h$l#XX9vEDMySpFue!u5E z-}CeQJhf(e`dYQ>uBx`xJ=Og(_wpC;7APev1%QJC0N`FPz{?^)0)T}0N(ld?Z;+7Q zpkSh)AS0u^MaMwJ#Cwa6hx-;67oUin7@v@g5Eqw(hJ=iQlA4+tpZEj)2P!&pDr%~K zK;V$xyg@-m!A3#BrXs*4p!)wzFTVjeDDXLOe-Yqt0Pr|)2sm&rJpl55%tV6w$KL-C z0vtRd(i>zH)K@m?E9aGm@PD!4;1T{|zbpVSUT?#{MR@xv_`vcX>Hi=8T8(3jUZiA= zgR50bKfi(7#}!+|T+@#@T}{iFpR+bX%k1o-E>8knUH_$nlH2_8 zB+}+j!+a>X8b(JS8ZHxtXTHP6n$nWeqRPg>`$=qe>g#`rAoqLBMwlO{N(PMD*MV|H z6m@ab3%S8t-F5oS_63szk`@c$Cx8A+1Yxbp^E{-lJfBqN*oh}5ohg9}b~y*;pC+3K2{ zzm(S7{$EoBYz;+wS>^I1`WmwngcLhT=FP`+&00r1 zx7@ivIz1g%{>CH?%0^2ZWN!V(9)$5T4-rtMYWW9`hKuuJ**Wmcn67*{)r`?nn0|&y zPoVYf&%UwRcuHrA=5RGOUaoVptD6(@lMDJu?X)_r+JmSd|NnypxBYm6mk!Y&>JK^g zZiItz6Q^ zy9v6sts5Q^$JTMtNT1Gr{r#PJUPX&(+kNQ&3!`_{4{in|RSKXBMk-e6Zde`ANS9`akP^9N%Axi%KVatJ;mc0&TkLN!a$RX#mnBi2F zt_f6pZgx;^MQQ%*os#Aj??%~%p>BRYdwpJ*M^Su{OXk_ozKbaLl>O(XVkPsUF&e(! zd*IlO+S?u>{r`Z$U7WBwy=x=}rNKTn^4V5w)Ik(U_8m`Z_&J-Cg2Z?lc#~00M!UA! z47?_fotA3`-TUGPc6LSULfJg+c`jsTwjT=J@8h*JO8$e0opgJkmEJhD9Tiu5_-B5| zxm^j-Px_q0$LPs_kx4A?W|NvXCa*-Ucnv;2MSm|J zO`FHPYN-z0YPW77-+oWS1eF@)6KuI(-DFVi-Rcy*k4_!GG8lH<6YY&R@Pkok9k%&K z4~*^e>y8tJx4|NYVHZ^qOV&;VM-O9T{{JZPxMB6^aVIEh-e|I!xm~%*Oq&niUtfo~ z2wCql^STNCCw)==-U*uF}Hus`&%K z<;!+LOMt(LX4(j7y86?JuNU%xukg$#-X~$2Xziw}C~YvL>>QgvP~=!J?)pBFe~mWa%D?Kw2#(Dt4H)@as~NS1Yc_ z`SJfLCX$l7lceUBOIC}%=7TA3QBQk&NnrA#TI%_uBKk=O0_-F6k*AW{(J?5OKpBau zUZ&1t)o#DZVd4eAbo`8b8I?cjby!+MDQe=p1o=5!l-&PV1;RGzc647Dk2ilRoKbK4 zM-4!r!Z72^vt3?SpcAjS(a9A@RMu|7l_vR`0vqXGdTVi9`s9gy?fHf~TTGb|fU>nM z(uqC(N#QZQ{LZi9utV+$Yo#6(4Vm(RD_ybtR|_`T zRy9$y>eM+|s}i1X<=A1UwfOpe$A__|YVf|x3&84b?EC21)2EA0m?yi|Q5686z}`ML zoApWh+~);QcJ0&O{T!H`6_-INf2lLGiUK*t0!3+?!Q}oLIAC;sO4dveD!5_u|3?=B zmIy*p)BPo@62^v4XJ7j@%k{99I24qq7qL_dQF7m7zgG&{eCjVh>L9)J?VRvI`lBo3 z2~N+JHxNGedo4cxWsCj;Uz$t#G0`iKO@twH_t05eThs7PWpeb)K$wjJdpv~fuG(zF zPVohxNT*aG^skGUbPnSg$EJhZ(jg^S}7$?);3_N_t=>|H!lGCsYlAaEXdU-X8yK2-{f__FR!XAMEP!8 z$qq8ESK@v4+ee8qr@A&e@}oAA32jDOOh$Z)Ba@3O_aT~wK$kRc{a7D8m$cN^R~g)p z`QyXb(Sb^7(OGqi$HF4ZbR-CKw9np+t##4UK6u(IMP7lYB|Y+d>$!M?v%P=pl9KwK zNP4$@yL`?A^a3#1dw;dEk^T@p-ZCEggq*duWnbrc>>0;u;IQbaa8rK6Ehn?(RQaVH zS=4kx&(*`d?yRWlQwr#cHvh_sk*et=sX%$c3owYlCL@NOD{81}0TC;9EerL4(JIPf>8C0R& z%R$c{0B{oM6k5Mo$RJPkrF*Iisu7u;D6C2W;Qsq2pOYP~})O zkx2jAY}9>q&~Do&i;l||fFxtV6l`w+T+iuod4b({yWBYZK$h*ado){r*x|LuWws$? z0o?-D5k(tF>^{@;-TBbx-CLOjCpC{8?~eC1gHEIQgB+5_C-AbTPOF;xH#%+zfgwlO zl@F$`JtL&|ZkDKX>Y`m?Jh0PZqhi0MX?bjeP<+WI^CtV##J!J=M}{bvv4Uk>p4zKU(r}|+9^AK zkbCm*By-Bt-DEo{{~xZ|Di&Ah<;g!a;QY>eE7FZ5BQo)f|477s*<4UzNXsJJiOto? z$J$jea;J2svO+m;13XJ~wMshwSUo$dGniIkxP_rTbQ!9os+Dy}KGdw&>SL|L6+I zpQWgx{}59r@}WR89?yHnh!l@N2hAvFWKu!pTA~R;)ZbK=T)~n9XYx z{r$VbJ2Ua4@$3rbc9T23I~6A%3x5ItZ_?SZ`kGCuR=jnCIwH=hl`<7&wOz;d%}5qK z$J{gbGBet>ga8fNbsn7+x6g}P9WBeUTVME$XN8+mP+%SE}c>`f#Qw`Z1s=#tp0_c zYOT&^_ymUcEY?`MQQ9;q)r1!wfA2Ex2M(YjtL)V+gWr^u2^i4)l}nJYxq8n;^sftB zvh>$ac0X#>^`^9Sl<6t(dMDQVON@IOS{>|d-Y@SI-CWhmN?OMtF~v&uZ!}$)Br8I) zy&>*3YaOER$BcNHCugEWi`uc(==|XWKfgBcJ4h7orbVr_2cdprWVPj1<%o=dzQzX~ zuytZy9F`A{!46D`v*{{pef>@bki#GuDK_l(MfFTKi~dkRVo@~CHL;t%W3e!TX4q`1 ze?mC(`7Z#?AAl5`wtl;9i)`3-+ev=^0zfWyo`FChuIgzzv^DI|4`esFH!I)Sd(W@4 zuxsMj0h3lO1Io2}zM?dvQG#jbo&3qjTjz%~^;56{uF>>A_MVv*Y40}6=Nkb4z1QxN z9nIf+2Jz7xBOF7IdfNHkx&tOWU*B(sFJlZeRt|T+HyzgKMKr_y=*j$F=d(Blkt$hZ#eR_`>VNS|*Tr*^CJ)BQ=*vUmT?#eKSc~SMT|t zqtchUp?a8ONB8d=fmSOAHYOQ4R+L-uW=Ko#>!5PRB25-ZIE>BuD-t|oDWr%nwAFq0ZlAdX zI1|-s+qx`@;0Pz7Lka`{kUk@!B{0EVNV9%5o42>z+Q_e+3K-`dUAn!$RCF(n3efvq z$ZZqp{D?XcmA%O2z}|Ioi?4={armz$Hw#}MgGDzs^eDA zPNltT(F(+OZcW$%xk|{Vq37C`kvMU??W*i!{Xtf%@;|^xp8@cJKnm8e#}~l3KIBMu zjIEfSotublW#{7xpWw(6mb+iD?pVLhU@9xPoV$`PB{XL*liypZQN{uNaHL`rR$ZW3 zoH?DPpMLep_Hx1hA5bR1E2t91j<;7<3xdGaSZWt+tadhS&@!E5Y32j?ATJ)rB*ZxI z>SL-(Q{_}@c(7^Edh>6Z-6NSgccBCk%B*&;g58RLkl>U73;^VWiw?VST|BM^3#HO6 z>2aYf7-??uZO=9mA0zgr0(0|t3UE41=g+?rR`|l# zYEcGY^Y3_Id5)Ei3@v40!ah-2yJuWYW!}5??b9`w25Dosv@|%`*~;TdIVTR=gS|2q zoCRiguh~5{5Vu3-_S$p)F^B-^HE~Mm@EX^lbG5S_t45viWr9sMA26}#uq=@3W(FLY z*jo?>h1Dnu@+K_(+Dn%ogzR~c8BVqt3=9Cj8~ma$j|bt4tHc(9#@TmwjB6Y$^|OpsZe!3>9JXOVc_{Bvg2vvj2gEY33lZ! z%PILEtXy&b-0EoIt@f-UdD)^b9!VFcg`O1bl9}cyvqJ5oMMY2>{E(46cwCP--5ajP zR4AJu%fV=kpNf-vI5i`eX~NXJhM2NC!K+nBaN>dJaxygjTW#&K>k9ND);oWfMM?P~ z>21mS6$iXrH@s(vb&`pR@A|Cl?O3{D?l8W2LI+-Un)G|Cab2$awuJd2zM`=zCiPO) z90CUQ8~{Fpa;}k;Q6L4vuq$6pYvpvd=)O0sbZIMZ z4VY2eWKC`NSUvrc2z2^gO`gF1jLzlQwvXN`sh2P*mjH4%_NE(o%c{Mbh)MC+}CRj8(I6Y($IFJFge^ zZf$J={nY`=_^d2R0+B4b=s<0J2DnpcQScRNV}ut6lxoE;nUwFnbA1GujY+b|tp1|lfXP9VkV(2cIl{U69EPxxy0r+KAX#QMJz@5#-;;AK zth8J-Xg@bZa@peN35#&I>Dz`cm!SCJVbgNq>*rrm%|EcQF`@N}LB#(7O2Q8b(?v&P zMZ;(KzJYRq_Pcp**i6?%4OcIslBJ@g6cs1SL{oFq6nC)n(&&Uq60LCaM=YbDU_8q( zC$(xJFp(Kg5?$^+qlvcaYx3%soa%Ia{hg2!YV9yx5~!Jd@^`FuOhnUS{dCMeXY5$ zp14VdhQc4rXc8>UsAONHao(mJM5H0zdU;<;VtltZRS%qq5H}DvNrRc%j)>CHM`ah> z8&-=Z*l~jiot=%1%?5^Ee{}41vp5R2#ntn!grJX=H4jaaM`;O)*qK%aT{!mtT$IMRX^hzGyT%DIYCYBIaQ%y zoye5PU6*SmJ~5^5AeNKCDb0VZ(V!2dJfW$m1pr@%=Zt(=quAJ}^>Zx`8+Ua)(( zXJc(KGs(Td#Kq*1X+f8y9uw1{8?koQ6L+nTUr;y{S~S$W0yT6(fO_ zhKA-nHRphgyk}3vm){(Ry__;AC?UgQPSl)nX2d~8Nv83*xbb-LxWn&Pk_)#EoR{=o z<(*WE4AdFW#a?|1e5Jy`z#pa`G*D5|Bvo(-X~XRjnDh*QK%jhWPeG!$o`HcuEm2|b zu#=POZc8}kF*(wO#(tBg*RVg`bgt-(TY_vTp%! z2=MSoNSH_{@NkF-uVW$r9sviJniCQ4y_m{dDlQ`@BpMFx&*G}i-(quXPVtqEe@zg4 z;E_-Zh+E4$Q|JBiwbs=C_iI!JlW;G5pNYx*J@T&yAhuM(1U^T<{2QrswsI++k-vh8 zn+K=TsboRKq%>e_o9`)PTmnzy%hGmV#vSO6#Wf&Ijo^T4;pXGk&*A0R%?|~B-iOvA znU=R$&}3G}&1!aMrDIb^_oaKMr+dT7q1I%imXNbkULEj5l-E*z^|24b^9|#p90r7c zHu$IAg)p3b_^aosB-LUO4lmrF7YdovGj00!fF7GxVu6E>$|@5#;-8M!{*X ze(_35nfWreG81%U|M^HOscm`bX}_tew>4%n@1yXPxWK(8T2`Tn&)Z5e_wQ>3_(x)Cz8E7RQdWPe-m|B;wr}$B{bY{W#8H_{y6MB>FRWLI~;GiP$00 z(-dljE;_GI7N4Ho4^WSh9X5MTY&oywohcmdh&_tm6z9Bv09pB^5bXR_boqzl(YgJ z7)J?#3!40BSM_X@?re&|OBD+OGe4|cz*hW3s96RZ%8yd)9E@&9fJe;Jt(aab=f(c9+J?qPpK zo%pit9`pJa-%2)8WmQddk=wCkHD*h{S|kyLG?U%KCtBoJNAuJ0DX2Ttiu~9!mp>6v zLV39@{gGr1O@+EB>4e@}}c3YHnvd-DRACOp{i(dPAMNUyM2Uy_8M zIExD&2MIK|MO(}^e_@%_T~rEHZv;N?djlPdlAm4xc?oL3=aT`()5-Syt>>u+?iWA^ zNa77Nkr?hm?KAP$@b>?nviVjE4XZt;h(;T{_p__5r-&4!@g_?_$*HAIdx+aW^Fr^nJKxazZdR1i5=!># z!ni%oaqQ}})SFJM+^Z9inBCFq{NIY@%?t&a3^74NBayKuEagbQR{WP8Ec@U{jK82~BgZm(O5b>!>(YWtgmC|$4U%{rI)-;pnTFAQ;A$Ua6Yu-VWt;+7vDow_ITP)%=B9i7V^`G@K}Np zc=JpZ5^pvaYaTnSD#2TD#b{5yGHop?t~TzS2Nz1dwdOFt+40R{xXB>Lc{TAl$H7=DLK9aehC>)nF<07l3@kog51VmNY+br>$mKZ08=6zK#X9k)eNKytL$P4ITKXGl zj9cNNS3+!x0gLedGy_&_Q35ihwU?Z!Z9+*QQ$c2MhotMi^f0$%KYQ4;)_kwE4^1o_ ziloQH6oW+4z(_9nggp_bXlfSU<3td2m zmEi!+!)0u-7Xae%UH+>5GUtKj^4n>Z-qy0r0^aqc=@pw>CV^$Wx_Z+e_{b%i8OmY7 zSOWMuT33XB&Xt{$rj#$xZ4?VFAEyg&Iwnp&8S?Dv+UsCLlz!}FqOn18gf+vk3QV!- z1dtF)Lp4JdZwKcc069KTALx<*18DZ9-*n05uDDi*b{;-8J<-+0#SS{%gSk)6v?h`E zrb_t*z~Klv&t#Ydx@)3Fupgr9tQ`KnvPrFH+IB#8j*3Sh{R#HuUCF5rrS7i`MCDbO zmKkack|Z;%^Y6=0GcIELomwOfboCa;fM0+#d3Z4(t9pBwwEE#@;^q73rmXNYWGoJ* zHJyy)yF>!`A}oL93NBP#`Sc~yIAddeM`-XxKb(QWmUNp`G$sWI&EN2Xc%Z-L196_# zjpn=yD_ky`j?27T!lHS#`(vZ%>3z#YUBE|fIK49RxWRDRV}y=sgn|owX|2qPh)hEA z2C_vL&C>5G`8W4Z#d5HOYvk=J8-ola>rK}IWH(V5}PHa^rU>7iM;d#^+ zo_v0@{i8XVZ}xN@is22Kap8|botkuUQ0Qi(CN?yRQl{9)3F$43ovGq&gvgtTX7K0y z;WrD8oBPCbTirdjax$n~YnZa0aUlpco-^8WQYd&|71y5;boCb3eUNLMfcH4tsAH^v zd;*MwIggJi36b+xv-;D+>1>}^I85c@1RC#e=lpfp1i`49E&;NwH^0#wfdIl#T+QA zTy~2Jof2eKo<0~ZRhtydWmXdB`on=Vw9SW0Jb9p=BwD+i*;Pp>m$vOGlBSr>18yPY zz-!hi+M}!O=*pWgjwaDNrjKI{b`>7@z+>;Cc7WcX&~Cj4jr<*TSIlpI+klNF8hXJe zMf$5cU81u_>i5lM-THS9q*km`#l#52j3Dzc*>p0Ym3Tk2nSi-vVl10crtpX3()yM} zaV?)>{_!cC%$e&(>wLIs8i-wdLz}&FGn``<-KK?m+{vra&QoEnGJ$i*Rf!V zhdEk?sa|Bc=cw6bGs90Ow2iQ~%}XkfX!|?2=;XIL!SvjtG$!tz(D!^(0o!Lvp$lgsK1?97mA4kYGp!s94EZL1+w0qZOsSCD@F2MAv$i*t z1hz<3&O_6YOFx=ahh?JgEe6D1!-=VGe8&5Li_j7j9H(PdyOKO8Mw#W4(T|-|Xy%MB z@@9)P{T&PIn`650&Qv6&vc6-5cy(67>%b4VCahLdPAchzLX6PEfXo!e1fh4(ta^Y4Vq{1>*0lG ziY4nzc^1kdQm3U!_u!0uWd}Flq!_MB*A;_~x3i^lXKtNh!aT&H853eRf{h*1Tbm}b)6Yahvc2$vVphoqYT4V3YybAbPjdq}yB8)Xh zpzetwMR7k@C6b*y<-&CeV$$0d-?PW+V&5P|@`Jak@Vf5jw6fPD%eajqz((Ly!HS|a zo`hrpoSF0jFm^1rz2PmZj=Urw==wA9NqYL@4v8sX(T1nefNo7>b`x}6S)qg-NF@F;Fa1_U>>pRe2I*|{z$$Y7FmYc3i6IzG zQx1Q#CTG*LjhNnLziaWof-2B_z>jy=P-iJ`XJf2Dww%fmr0}lM5Bb&ozSPI6js}bx zANwPOWSHO4OcD)#?BDC9Oq9l&P-U{J8GsC*XRpm)PvQ1cHLvPWD-FTk`u?l7lh~+$*6U<0(lz$)3n0xV zo!L@K__w!x#7ZxI-!qB~>!e z>u=+Sn)rB{gbq+sxH|Qdaj2>k@JOX~eRf4xvSux`k!5b${vNIqUQK%Y;b;I%N|uCpKHv22&G6V0hVIxZ6#POA@Q-7Y+qPgT1Ucuk)u@KT_GV3MFc;bDIUtN zC_)%1O+0Vt0!CvaqDD@|8o1#MN5ASh*im3QD)1ZaK$c~`G6}1c( zv&OV|dp7;XLKnH#nWJQnO`^IDpGvFzQm|{}_w*U9%$Ngvt<0k_FLlN1F-_|2Z!7^P zntK%KqC?9xFpFm00#Dl;hHCq`#XVJi4@P}EKS@sP9*!z4bAbXTVRPYkCu$tSpOAF4Y7A%bQ1F(m-MR(dEUr^)6KZyh98DY z1ysUL1j})WXUE;s)SR0Q#AoTsFAyI40LSHHZvfMf82h=;X0;1xp~rr9NXGI zR?q6NjObqC5%S@T{R+sBEL2U5VYQHE-38In^*ji(zjvPPh)QlnB3M2ya1n3=(>*hh zY!>)L5t*jhhhz?66AZC+nsu_z zKW`E%CjBZzw?6N*$eeh%%?2d+yQPCl!{r)u=#3*M32kdeuPYhHJ8@240MIv2#eS9& zZ1TPMrpWv@mSJQz(bJIVcM*bdq$W<4ct{kMvH)c;U9|R)12O(=Yd*83$C%xp4rspRa!&b{jslekAS0n<*n`S<`A@JLzrt&M?jLf8X$~j}II?6Dp>~xv zb$<)$U22(pG#2^&?C@0u>ddMgW{oFDQq;Ys2wMHxd6fNH&RgL@Z#){IQha3-LH9dj zF)`g@8cz6hh53I|7IhQ(FUdkRDaa3*xHEi%{Xf8|#f|2(R^|^KKAz2Gcx{3E zxiSuFZ1h&u=@cxB$Fj@3*1e%v`N8RuMPEP%?bI5%;kk41no#iZ-kt z7r?L2=v~hM+=lV*p7&Gf~lZ+J9XQZbK8J zmn!Y=n#y>4RbMOXZNk&HaMH$1DKtK4#XKTHB-XL?nkwkz$Qg?@246vs70cqQLOPnV zaH(L8K=UC>|0u|oc6lTMmV2&D%40q&-8vWX0(gFVlXEMx5Lvlj)+v3ddjfhl$NrPU zo&pW1MwW0G%{Q>{@C-x^w6n?D=vAonCdOMx4e}^iZrRQ%I^Gt{UCw_W!aqId3Pr`L z7?1?<2Zr#v&TpMOY1}RvmEp7d?l@p7L?pq{ax9OJ%UnO}EuhVWjy5?8hrtJBB0rM- z$V=D##Af99&f#xWXJKEGlUTZEKL$h*sHMuq<|~{r)h}2*Kt82FuNw#wI)99f4a_`C z=C85-E~#rp&{bc|Axms>PJ_RUONWO2oQsn7X%AF^0zg6zaQ|GoZeLx%*iy(R)k}*$ z9Q`JG+I^lx3KmdbD^8Z{qsM&w|~72N0FR z%H=$fv5<77GXs$SGQ?~C83bI}yJB3k%cv|_YK}3kAFtHOtBL!=j4ZR0fRnR_tux_wjr^81 zJ2skX#7UG9N{mAi;P?FFI|#ycWW7ykt7qz!E0d+@hq;yIqL#!Pf_L8b?Q`A?R$7jp?92OLPE~KG zNn9)(4tQ93OFZC1C|0rVae&CKjD}LGP!aNU<@^;=kZ);?P!i{yC#}?xp%*P^_1g+?UMDfdtkF~+EMqzKEiAiotldbukazy^E%oo5+3u0y^i->Lv~+3AaK3M| zakw>A(=~-VV@|*L_>weDf|2NOh0Uj5BMeDyO^CDhBUc_eZCZBtKG;|rpt~+}E>_h6 zxiST*{h|hbY4^@B+b@`|v!~835pf)|=FU|}+P7PFZi-)iboKEq4|$llnDs&pP0b5y zVld%-Ls`s!etOVLFMPKwn`Z1zK7@LeVllfm7R8&IRd%d~vhE}*1c`i{VsD@JsbM^t z4w5+0Y>vt=!?yl*Q?FLQZ;$d;iULjN@RalfuRN*^JvPbwZ_oo0p?m~SX5l%IElQ_D7 z3CKlK?YBmk<>nH(P^2omruD4T>zYws;@66)AmCB-(wTI{@xZp>Z|3{D_rV<01|z%6 z$K|~Ko`epZIWV4@Inz>$0!lv>y%|P1nP_QnI8ozHwITP?NoDt)dg2ne`zBSqSicu^kStQL^bHq8=9X5q# zx9y)sNq7*9ILcUz91g^_jn|K1%CoE4NbR{pjQv78L!Jd?D{J31(0yj&=B&5yS=+MLn=S5F^w+f=`-Gguv6+dq75f@l;rixN~C`4KAgm!RIIl7$% zV0ge*9{4CG45smMKeI#`+%yT8{xIHdij%?LXJ;qmgn6sV zQoBi1JDUbZ&F?v=44^zVHsu`kyZItL3(tM@ecRFG;;!{gRSp=HcogZv!h9BtCf@h_QWwQ#W#{C7oiKrN=tR4T#yF|8QBCiUmA{N>Sid-RRxr$k{< zZ3Oo4hne5@8DVIYJq(+7vW|U)D8oTNNs6Ggwpuo$DnfD1(Tj+7m}@3jaT5F2nK^4I zN?-eYlJ(qKTv?L9wVYKqu5>_`&||-!jv#?Oh?0vG&h`1{ziZ`wH7FYsp)(@$nLysO z+;ogj1PbczcsApbxnfjC;DQkb%k@1nM|(4C-XBd_wSiCezf0r2)XeOOoJ!^0r776m zXJ=$&gJ!muG@Pr!nGzZ{6pL zDe4Q{xl-cy8A`@B@=f|mu`2#d{ae56J|8;Omy(dO*jq?&tTii=SD1b;Zu{1(QH!TJ zskg8eXR7cvwU7tM#X zKF>Zg33TUsNAs-fWkLxe9K0-g$xS(VQ|va3O(RJd7Z=>j;2uidBySPF+UE=)DJncB zl^z*+@Y?z8@4PwUFKZ2(jo;C1uC71g?V%QcPw!^HNlb`A*al^CWA=~@fVQVLc4q%V zN9Xq;pLiK_bGZFA7Yon$@~ye<;b?1)5+$mkiM32l`5vtz%nWU}R|7Zn}QFiM+Q zhK(yytaQeD6;B#Wr6Q|`mMw|9PHuHeQ1Kw_%6=BLa+u(BP;Y0moONDMQ12~2kAPiW zkucjYlX35#$q$L*R6ZH~7&&3QF?oMW->^)=?$`X0kPqcrnlc~`FqbawG`>_AIQn(5 z(z?Jj07#-0uJGzhf4HIx00usy*4aVnz3 zG^_jSM6vJ9aJOms$ppt<|G8%Cp;>efR`jmFNoqM3bZi}Z5@tO4=kIdAXPqG{m20=q zsl0h*n-T#qQBtz7c9wJ5n)1~@#WRJg7_^Ma*kQ%YO1lq(n1a(3VBHvI=}8k3ZWE)0 z75!#$giA4&9pBe@q+uM*k^WT*!qt80My*0LKYO)v%D|%bV;X~Rdzg;(Kt5Fj=e}wO zHwJ4fM`3ONnWT&=UyF#owbZOs$aQf;3y%d<#CN~nu|%=i+NL%VC^IM;5HGCnb)%oIkybPUfo!iW@+S9J?}8Nsx#_Ssqq947qLbh zl_m`f24&HXoxmoX%}w?q%RIh^N=VpYui@z1hU?rBICpK|!|vO7EqajQN zE>_tSV<Mk4qHaCt7DDVHAKawb%Du;xVa@PN<&(@XgLxAqf^C+ zYh$Y(jM%`1kcIs}CP%r7-&QR!T&>ck$n}f!4AoxOeKslz6elO2cm}j@8A*ef7+tKi z+2)%E)70{tYb9NSDSGb63FDb{Mfss}+~frxrTV{(wZfL}Fb%A;{UuOEv*RW@gTtpN z+3aJZ!s(5}d$AcOk+g+11Q|*Pm!tpA9~9-3lr*jdm@E@Fy)NhJJlHPvQ&8*Xxik7E zn-G4XE>gsL&;fBJJtrnvJUaBhA_{=A3tI1@kcutg=G5x*oMOAxpSowBa3({;syu4C z>g#;9+3Odj^*-B^bg;@N@VF?9QZ z3eCi3OwJ!b=5Bcbbk)sD@GLbml!k1QHM==`5$@Bd6F$~%E~O8?e~tRvUP%w9dD8Od zZ?Wy>jvjZOBFu{MvndQdrUXt8a5(QX@5C_&YF@gt3uO!n5>GgM-Qn(yW+GeJe*x^h z09FDV=r+N;Th7ZGJ?9vwo1YLlHY+u^TI0SfIUGv3TktSEs(FbN_VB3Z7jbugg>r@siGota&z=kob)&=sed6I#I2hA{41|@z98rOA9v*fm4?(s(sqN0So7L@j*;E=EgB@+@ z(^dl5wf@il6} z^k5PB;4`MOS9$a+@3jZLA)&W=$ZoN#koQAaD<3v6 zg&!r4+<(Z@L^XD?UnvYd?U;>rV33IS^C!!XL&1nbyhNsY$ofpSAfV33WBIt8u&c+_ zALFc{m98k2Q`w6Gqp?8C9r(E8sA$Y0CA1BtwoWRwo~fwR0o6jytcRvqfjBum@4hRe zg=M=C=JguaXjf=56NLSrj7ABsii+AXh>3}bS)=U#;zB`{nq{wdnS6#N{~_ytZj@`3 zP5+zum-7#E{9opOB}&gUuUn^B-U8rX&!i(GBK+qR`|J63YECf~qqk1~Zk3|?HL=F= z`Aqq%|Nrie;(BeZVd7I=B8IYY^>|BeVxs8)E<~%n&wPapYg_&Hr_v=+?a#Zd3L)%| zb(d*)0eVhD(!AO!*0ag^a|m#1B$(bXc#oVKBJY?9r>(b5BZaw`Cn%Pf)C579+_bp) z@1Mbl%*l610u!6o)ch4qtl)t1LwY29d^YnUv*THl*GSqHgJ<8Fr?}H^b?qQ@_}rQw z9d)Y(^)1;O7sS%h43@voE`yMOOf;23pEaEN;z{}>ol;P`I(ijMSW$}{r9Gra><1^c zZjW%1Pu>v$7nIYCxB@(c`t|2*iIPYQLn25wo~?M=-|~R{18oi`$i(@SIQ`g1v?~4bwR=Lw|$%9c?nL!b7*s3O6&%?_9_ygy(Tzn$9ygH z1wfuwAVA2`V)2Hmp06H3SR5u81$O4w$-`rNpX)r0}_lqYTw4&`RCqyF8=3p}@l^5|l^ZV@XA612)QliGl+(CbexvFIJxs zMq<2p{Me8EKK=8tboTju_k@9}T34%hnmVTMZPx4Y8K}2KB>X$%Eq{mk8nbOqd7%O` z-h?=O0Z~w6ABnZPY(zfORq`jUZf%>JH`lb;kA2DPOV9L6u+4`ol^b|eFL>JSr#L-F za%9BkFV8&BJU-h+Z|hYXIsGRwB6B!(R?M9e-Y%GbuP1nGFp!y=`lEw3qdYu;hiPQ{ z!&`qXoo|-0CH*QWf$WL7eWlX*e!=5dU{3#4=a7g;&FJHv zWAF3&-D69b@S&qgJ~fb120z*!w{CBbI#^bvjp*=Jh*IlY(P;g=6JoKfG|uPe!tfbP zcDP)0S$U?Ot`K7r9=GNnGi*8j;NK)h;$}Q^yDKpa7Gh87-gf)@J`Gmi?P_?Es+2_# z9e**g5mOfZtbg;KFQ=N}kPCxD{3mA#`i3Ho=xG=t{t1hP_Km~bo};ZY3jR~sG1b*y z3>Q*XyoMNE(h<^cS8uIhU|qT1`icO{XDS~C9(7ze-a3+faS)SKp2Cp-wj4MDO@D^L zn8^SAV#vi%*=cZvGHGxLN36fO2q^&i8&Sbrq(~VBQ5l62TD8jIX*2P0(EI-(>Mfw! zdV&Vt;1t*5F2&v5p%e-3?heJ>T}yFy4FspSOK}bE#oe9%WUU0@FX#I;B7J$>JqZM#>$&+PmT(+>=sC;itiO46I6Vips~$%MiSg5B_g@cP6zxucRyM@&-yQ#+-)FU%Ve zKgGx~rE#Ed$9o=p%NNv?X9N@`(T(#(c0Jbsvc40hyRkCq^zKQ*l8<4Ov*H`?#FSkr z3TziLMn~8qP;-C^z$PF6Uw|~7#0`U56bH5#dz}wrEiSnaqH~E^DZ=0jyehmeC&By< z+Cl^&D*Yy`pmY4O;m()=f=cBX|M(zYydpx|4$~-t^iDXV({cy^&_-?Qa$R@e`q7&k8C`}^1#^goX}lSXCjz`qU~Dr_ zJacW(*;~Ak1RB81-np_dFFN(uD6mVfRimoN)#2Fq$`ZP%S7-Sl_FsT8TL)2wtgv14 ztqomZ_n7E&R#-vIBRbjN!T|KhHI6^?n=mf?6I5EKlIsAT*ebd>H849v1TWbz zOfFCFIR*?2??n1BVk$%Ypz&}oI~;jv%V%^)O4SE_LMHLUORTzv4Eg{dN$;MQ1$BY2 zE;!SNgs*!LcRAt&Y@_#8cu0Jwgq3g{Y#n}$6CZ$2bxqh(QDtg4mrwoc&$hk9F4=Q^ z_;!(uHd1^)GHK=_mk$jCn&Y2etx8vYOblEwqFf1^4%fZzw1jB!eTiAa=4$aoe|%cN z%qbXb7$=0|dn~UHI#|0QY$k5bH`qbT`^*<-7T5G=Uo6M>Qk;`2A}dgaFTK=);UQ}E zSn~yl@h)0M?7?5Fy&{MRF&aeGgN{uFhtaD2J2FDOdMV}FI#tB%0OvqhS?tt4OP>#GAQ2T_Miap%(=Z zvjnz|WYh+0u@3_V6rK1@2~!=@=88|BkCdji-D}#U=TBzhsM(j3OoLaHD2%o+PaZ;N zI0)0cC}ZN3io2pT_l`_E3lTYyIRog{mzajIlfD zk90``;hW^->5|vj^Y>ke+EL!epD79`obo+#6!B5M;tdvD7ol+^qlAM4te^4D%Sm;? zzZ3g)MI-+LK;+H&f(3|q!Nyx%L2{AR;|-2TdE|M9;jA zYcyz3Q;IMRYYTr~?G2k*AejhD<7m4TLNzP@AR2X_Lq3WXmZg)u@>ew<<9n|-T4iP< zX0iNWTSf_vBe{kYMxN7mP7t-pBSLkj65oJcQ3^tc;9!HvkeGYwdbP8R1du3UWLOow zj`w*?tyOjPgo1GZk-cIhOe&WB*K!4inEZyV$%(6=%hvOluRvJ=@lp01)if~>G#rwQ z_Vz51oU36c_7tQ-mP}VU;9`pw7-TaT^~HE{n=q#z#I5iVRRSO7vLVR}b4v{?Kci9A z9l;(deJPP8pj(=w|0gFD9s1y#nRXIP72njzaEN9DGJ+t!kD3ET98Z`tB{u8((N)gw z>Wm7NkPNj=4o~|8+0(pJdg`wtUkQK*W9l3l-7<7}{@@Z1s>`jM8e_2kp!b~qxsRkm zgsuz>m1;}m6j_ECBK(&_=|edv24u3HE&gPz(VrNOL1SQ5?%?Oc8u{ZVoN!pge4Tk5K zY=)-`Q{Qw8f=vSO+C6^>F^|KLb23vj2KEZmLQ}fMv7sTYyPbiP6do-RKFQ_ z5VJf)(y;7KSoM0_d>_MqU6c{wU)~ z^>b~kZ!xT@T+6Y%^kXOCMAg$K8A7q)A~IR44>I=bsUV**IrQoo3t1HcJ(4Uo{r2=Bx{spY{>D* zuIRxR_a_W~k4gSV=cOnt*u58)UezgD>}E!Pw_u$iz|pIMN;^q%nz;lo6hWepk`^1Ug{6Y~aYakdJ{)ep#I= zj)H*_BqS+kurKxAwJ*9Oyfvyj037EE6pJdm%DE^)$T>v5Hsb3`MR1XA5Z?L?ABAa` zCp#w(n;gbkf=7ijgaKWIO+Gvr$I$VqsE0*Hq5+Zr$TSts!D=+T*avUaWelGj^0U>= z0Zhdt%BYN42^hWcaxAQyt)v=WqG*$t;O{8m73C92f59UCHJV}zElw>IAQQ8#4zEYj zR*ga9#NlM%3hKfxc%&8>53N`_#P`U|5*1HK>Yo8Ky%+nVCsuapNsiz%h;6fpYjZ|` zWvXX*2i(NqtnrlD(rE;tl`}PiFe@DIj_HJ)8Jr^^7{Qhp);l=r8#`OjnJ&Y;?)Z)p zv4CE2Xf70>|T!Th_xyw zkR>adz5N+&$F?@p1+5AqX!#G2sg^MquY~E_Op@}6Kynpj*F9?Wk;;Vqj5o9~TesPB zL#;l8GI$zCa4JzH(*8Hh=bMDIJ{g5&&FJ}5w*x$#8E*>BKY?%NQdQOM#A~ufMXd=! zN&_sP@#LDQ&6b&y`V|GMGWktA{VH7bF~J3_qAjG+aD8i961l-dGv)859xY=UyE1Z%$sh0=+o`(^|e!q?jmsL#dlSY7vEKW#<7DG#zal8X+SAZoXMQZ~lW zH=Rq70%n5n1=6|-ZHU+8m+hg}U_yG#8@<*fF&xy-zpKx&VF0KRSM%G;o+SUsaUPi2 zlD|ut=OnzwF%xPc>UdP~f6vYt<>46;quCLY4HS=LDZs#BBbS+{w{H@j`Ee91h=9SE zYXYWob`1ZDCM`~4T(O4mO91DpAY;MgMm6UeXrfWSiuwyWX%*xADHhOi9B<~x&R~c_ zV>V;HfpB#F&{yy~e&@1r%mU@<@uy*>E)kv{N)7bfo{J$uH=8{jLc8E^ESQqmY@3|E zDfm&Z;WS4M$a}NGHZnN+MPGUnHOJbwuWqD{N$MoW!_x`avrsx zTZD9J4VjJOn+FD>CL5lrO;b=!+ERYYixi0GU!{cctoDRZ**uJPl{vnk94a${&Si8k zVg*lqHXw+E{>mSo+n2ROj+`e$n)F3&kT#kKR@OGR)OJFmEgA^VZNx?{2G{!+Zf4zJ z7Lj%fA9wcz*;fJhI6nQ7znW_K9{`5~m%o5dOR(_PS(|v%NIfFmU39Cd2}Q1t=DAC` z!|u8pV&f=qZe zOf{9>S+9ttpUp`Lz#aZNLLS2&XPWh^sy`A7V^%fA?1iygNOKr;OA)444LAM|4qmib zU3j|&irQ#0P{K1_8H*Jocv{|i{y^Vx05ehsH#I+VlSfnqKRznO=dfZW8wXfwWv`-^ zgG_}Y;IK-r$b2Mg`?6|_Pe2G+`HA8Uwpub?1zj5};p*|dUhX-)D2bqCO~o+Agm3d- z2K+vtf%9fA71e)Yv>Do-z5c;oj9|g`MMN%VR1tdq85z7aq9)Ox{M5q(xu~AwwFBm1 z>!E|Uu7QUT0QVe15fqb@SO+%Xuu54#{#j<2Bc9@jn)@qqwCizcV>b&z)rM*J4tlB~ z-rqgM6I6IYQbTMk{n*M<#%119{(0sV& zc)~C&TA3_y7GPSP)57Wg>yJ1y0mE}8R<4%7Z+P7=%vWvAQ#qtAZzC3FE*Bo?6BBX! z^tij6KA|%GJpWY?dw-^KdLGl_QDfPwj4SBb> z4EHm7E>F?=f9EG>AcMeHc@U^i>^9DhFxVQAA_S59E#hkwIn}HH5Biu~foV$^#vftc z$QGzVRaUN~p3HO|xy-f-kCZ$ajvjV!Nb#g$E7;MjXdnshhni+dybE<(};`xcT zfx;P+^}-N294bVK@g&#AoBWgkz4cRHg#C&MZa?EOemjWMelP&W6B=VYHVvb4_HwhDPpw?UxaWCR2Ef>;Eg-lb=tALE-(h~Sy& z7m*bQ*F9Jq8g0X0QKQk3LYRxe9G4O;yQI}(0kUda@0 z3x`?CKg94v2#Ult5e@Oj_=P|k?w3BKt8kB7nZct4 z13DCTKetE+BoWsvbUR5+7=b3*b@NwWv=d?O-pqr4!n(B!E3hDp58;~Ttn?pN`egK3 zpH^6)u>ow65c16H%NBxV3Za5ZDd1_@64axWd-(uR$f#i$(A=r)zYd7ymc}EhtyJGB zx^D5#&Cx^9v@cKmnm#@6{ilx00Yi^Y>8rr7AgZ8tI(+{i(679rBQ8?Uu<+CB`XgUh zZWhwZ-UnP59n!voWB-zRW7$jz9tMPb6zXD0JAB_NXBPx?kpjak0--^73#8kqnk*c2 zm-OsH=_pu+Ckmx);5|_magQQFIq7H+j=2c6vX@(ZIGrUn()BMActabu5$Tm(pWCp* zdqP%vGH7c2Tn3uA-#k`O2P!|+zoi*+q(-@S%uqaeiTIn30S5I{-q^MPMBstZ9}?|U z)05=*t@6FjhyXdwp*{*6b?5oXt74;JIn*SNU|TA2scsa2tvg}(pg+RgW8@ixoUoUY zcoawG$c`C@@2Mb>Y;?qT!os_0nIdyat2;?^{cRZ0T-#OY+eCpyNG+?~&r8f8>EH-g zh9L1;w)30ZDN-BgsGvYe5C&huk8&?5W-cv+FLLbCoswTA;O^|*8HD<6N;3#Hwu4%| zd=uD;0Xi3yxpKi@VxkYvBJ^T^%3evQ$|rpdvBAVCzIq6T>B1hEj&k@5+!epRjSPb} zXDpt!QFpUiDJrE8*K3#}QoM?VD~(9F_@ciJnSLu+phtXHZLzDux3aJ6%k|8hhmhrhlMwMk4A-Zx3H_QDM?Bap5amxHJgyJHa2vIB0Y z!1QAA*i=#1cWEryJ!98Fen^;-JLmXXP{Gf`j{Ui?-m83PsyI7o0bkT%2NS-J0>>C8 zlP`L#CT7k6^2k|WK66rm>fb6jctz)-r<``D+8&1}I7h^WO{ZVIRv3B{FZrMX;V_eP zx4xMAQ|2llf;tpDvW9isWAHYhr;fV{zx)mv6_5x@of*|dsdoy|gySZbNSX`EpaPO! zWp$z%`wmQCRdiq~)w^lV1&c)Q(^)(RzlufD{}psE#}DI+-F-asl84@#FBAC7u{ z{P`9fos;mkU*;I^`1%Hdn|Pah>!rlxl$P=QG<2Jj9$(UlBOy!K8Y4w(*5i^45N~H^ zAE&9usH~Si;}(jcE_*G=GaFlPz0)sduPNI8XOzVi@azZ_l&y;`L*+P0|m2^~hpI22|99FJCnV zo%Odts6g8;jUdm32%cy_-Zl0G%5_(G&lr_%HOvzcr!A85gDton9;EI3(|oM1;TVoi z$rDw!lhW%d{TfC}6nz&4*gEMS4DE#_ILWVIw`xw=c}i!I3$WH|DvCCcvR>9yEkKIl9w<1ScWSujqG)0qn z%SW_^MdfUihyO(=s<#UXvi1EK6$zNpGKTLH%0(Mn_uEfNvG@`1#I`6n$0nr*_IBCs zRHw}38#0=6r427YCfqhbtk)P8ibwyhZLvy3FT*#0gFY!tIh65U+pumtKl4rY%)>Ug zorbW6No9T8#M2#(Q;lPAuY|D~`~bBaWEdBQJrwROje(<+%~#!*RwZ;BRH4L^CS=JG z?9D2d%X*e+RaU?Lm_CMpNKaCxiJa(V8%1h@OmWEKC7;Y>X72eCOv~19j6uF2?cT4h z^oZYUELD9BH=%40u_r?1qtGuJL`h=`uaj#KVoHlA7~?=%4daWg$ZffxT2g zr;=7G^&x}=0q_?SI<94OT7`uB?|`ujNj91r$>}~|RMcE%oU0*Zi?MEbTMuPU&Qz`! zS$~HpkN6NcN)oP3!akYeoC*Ek;kc;-I zzj%T>1&#_{8dtK@o7rU;_uqBGB8Zx2nL9i^^OR(JJtm5Qk-y~NPLIkw5l5Dll2QBxRD zkLM-nz-O!f)9}Md+qa^Ks8paSPLg(L5L!4fQw1E2Zb=u;;2+n|;)0wYYqLiX{8X5A1g=w{B=5rce)O(9s}dv!QL@st90!A8-{ zp~eBLF?2=>NU=?vA5}1B{Zg?CpCK0|Z0M zjPmr7zu)7iIG_-)1u_8!5wV0Zir)8eRHR?6$PS?YugUlD&vU#Jm^ZlpIldWv8r>N& zKKUe2FrTmgj~x#M!2DmMyUVZO!YhpWK60_yoohDW|8H}r_z!TYEV*c8=5@O>fAjjI z#lX!dJM2?Y8}pSc3gEdj=B>fCIzBB>@ExBDGrixM6Lov)PSmvFTz%#Evt`)LAK9d$ z{qi4RKXq{V=ZBfjN50@CYS*NL&PlgLQCinQ42rAnHOFZ-)8&B>F^tx zdts_gT;re_I~NXC>dB7rAJG;o&x5*NbhBCT;ayIhP0v#BbT1ZZ2SGL zjEdG#E7JK7kmzAy(*<*jt*&=3t!Ca6T`Y|1QX*}lV3-l2L-=gOm!WZ-L(UA^ADb99 z&1}`XeV6WZ%e2+sww*+yO&~c>8F5X}sUQ`hI}IpxN72y3YHwhBjd zOfVq-CVrxOnfDvfWA31%m&A@NaG}IGY&y;yx_ra$}<|d(*266L< z+@C|Rkh^Q*0@ z6=bfJS+D8YOC63kfk#U36zb1S+6>6HW=~%dXxu9|;y-&%%0QfUM$d??55dWxl+Jjg ze6kFE80kDQM|!b7z-y#~UDe%8iM(A2D4?PCv!(V&emeX~6|+|4Ej^dZ_3AsJFBu^A^Y&y2=DV$)XD=`(g>D7VGex2iTo z2J`&s&&3-X-gpi^VPn0y{UH5v`;kz0DS}csffQ=F)PpVF9q#WQ5d+of(i5GFN|?NG z-_l3?)3D|FkNje%+4TWu$W4#;%%trmD#yQT&}eJW27@|%(6yG4lUHhpiulttVnV)X z#Sca`e~|#nibLqoTFdH}rq%@d{DKzf>@yy}go>>!v%g|Fm%1 zMZ+9lc~*_>W_hb$Jc4wHj}N8}CEyBIPjPNv<9?&2Cc>l!)Tw_AAvcS0fJ({fYGA;)(thK4; zM5lF-e&Y1;x9O9deOF(M&38-NTMb5LuB>B{7{<^{hk*i6V0N7iX`KHy{29@Cbokdy z_kaMC%EDY!L{^@q6o-x_^Ls62HY8b=Y49uC0!!N*4bM%!S42b{oo8kXiL`G3MRa0b ze&)~;YOUugR9n~HQ*1T91V*mDRg;0_ndr}Y*B2Av$BV3vaV$1s{{yGP43wWooXFeF zb$9kZxQ}l^W3KMCNk|Rn16y%E;B#fLC#-~yM7f@^IIkJdLU~U}OXLhML6*f@Cvdpddto*{S=Y+h4^<>$w_H+JC1@nn zS88VNy#3x8N^W%L4zct>afEbiEnK@_XINEr_cBl?7GtYi&>TYdHZ{_2LjC;EwFlD) z+>qw$*4%A``Oc{ z>IytN4ee{}b9|I9^^hTrlFf@AJaZhaJ;^m2kUXKMXuF>z*@hBsmoVq@*!d5|OMCzQ z?b&aI*^bp+aRyF3s~BZRD(lv*#POfW6JQvbv!P!uJmYv5vBtLWf^qE!&ES2Ylz79> z*}RHzbs*RTtXKM12n9rCs)Q?V2Fjv`X@SB9Y z%WRqsD=o@RGm+_*SN-c>{2%I(FN{xD&xhsjIi{i;+V4-2&rxts)fT1_I@31yJ+qcU z&8+P%IXZgf)EkKMm%|P&erTr1F1vrvwc8s`J()pp zD17i+EN&Qf$y!eN$`rA?-XUj#Uf9osu*bUI^LudU4g(5G*P3|j;9N2jRl&^_)w=3X z>io2ZZ9(DkFlnKK(Uqg5wM)MkGUTorQXUAE*8W^pciz5Zfjd)fZ377jRlV}++eDum z?gI5yL27wil@9BiNo$*z%at1A{zxw?0*+`s14_Hx`2{Y;n?ckU=V zk{qn=Cc~ z0`JKQEgw=3T=%G^`-Y{8>(4!^7BN>(bnxr{_9bE#$H2gA_|9t!NOLU&oM9{`TjrPe zxdJcgXwP@By@=ekI>flt%xa!IhSPOLmi};sLNIN+xP=9)Re|%($G>Q0DhV6@64U@E z9rB6H<>=YtR*%>}nH9U&IL6MFp9}On5;jT_Y@L7k5Abt$-5ReCs{JoMX_qE@d$|#W z?&P9%8MCi@i-@$SsGm_mOZoSrlmH1f!yV`8cul(*-!apH{XK@hojZUtU>aTL`?1tr z`0MY^$n=*8PGDh)-GVTk~Uz%$3SGg`7MoPb{yFtvGIZPC(`3TfX&fVRd>ot<-J^$pc9$ z#}fq>7?_M#NjM@nyEuyJsx%7ppbS%D6w-;%x|TdWJO3<3s}LeLBudwMb7V6(lh0wJo~=hp+sOI6#;TAwDSKoIK{uOph+`d*$FdRAZ>aJ*v_3{F;~_S zM#mg#r;RMdCuIREHIhus?3ea9`2LW2-<<94yxat`W+6XyU6(7^17ZIya+{6rZXG}k zxh3eH+)tT)%l(_Bba>^KGJ0;QkLT?MEcMyT_furVn0NL|&kF(?y| zKWCp)=@LJt+iV|R(D$k9X7d#PL66oRVU*><@N%r-SB?y{?i7735zq#ZR>h=?jv!v;?w_FyK=$~r?f>v>3n-?!=wnO&ga;M zdovqo^2vBZ2(fSk9VsX0Y^{Y;j!1?-5>Fzv`SoYcH zYQj8BJ}C5}La1yh3q3{D_>EFimF1WAm*bE-#C9fLijJl8mXnk5zpXSDgoGVRS?lxz zs9U|0c)*u7KB8Kxxbp~biP~R}x+{c7SgG}9z5Mz<8@`y$597y0z6+ubok=^^v<^W} z?yF_U%XoOWMsf0;Pu?pr6U@xDpJ;5>Kd&Z3FsqI?ou-@p{K0*Vm>$1_Xa&jk|A-RW zmFTf*cjzfpZ?<2gS7qgbodGQ%>Tq##iI(`(EEAC`mH`?CP-Tb;*N9A7T zz2l^onQHlKsqpl)1EbAF5WT|vo>XkLfJjRYK`9CC_aNHLXK@X0xXx^s1X2iFhU^1! zPO-Yw?Ny(Lv~)~&wCua%bW&g0pLM&Sxk8$9_tU$gWeO$B(kFL~b0nK^I)({*v>}BL zPk5C=%GiS=axzG9_nZ7AQB(9|Js6u6p2(N6x0|FQbc{8d2y4~RQH&s-P}B>s@*@=z zmp9|}_$AYj@kt(`reRBM1Us|l5t05Wr$5T=*C;i$u=!90B592a(o(zCFAA?+Z@!b( zT-)42!@8g=@mo6qPdA#)=8(;+c2b%fwZ3f=p-)fsjeW)$H0-O1!)4N_xtG*jIiKP3 z`2^I6jWT7HhV@)M(7w*Zx$Va1kK!;>5RD^KYBynkMK8QZyOs5L2k4cVf%zj|s9cz` z>}=`#>O!@=6EjCl>RXF5jjOL{)Gd|=hbEQn>Cjnj(H?->W#T11Z0}s$VnsE`x;(1} z{7>LjxhAK)Hr^%<1(S~upqa6QLXOO3d7 zsY8^j+f7Z?!vHXgfoG}=rDyuVh8S$8;f&sQSaelibbm{1KOppK!JaU#2H2+C;NYut}a*3_*GN~)z|||ZAiQ?_N@zk+LbQw zjM}c58wEC+3x^AEdW$_fi|B*XMeOd%`w!J5mS$*$h@|;!G~X;*Tx&R<^?gjOM!?%u zf+u;`3|v6p5UahH7g|YW?-_{W8O&T>k`e=Jc4?_S{YDJ5Z%|8PEwWR_w=-edwvDIp z?1jIJC$DdvIJom6HmNuJet+^=V6?=z{c8SPLoN#0$6`iCrZIXOQD{TIR(V_!ZfbV& ze)WmM*wCKazroiUDYECCQPtI3jQCYEXz4#TQ+A;Jv@$?b12#p}P7R{zzcc6-wnCpF z?h%kKjE}E8nh$(sHf(XiD+E_^&tJ=3n2mNBb1N1dHiPa3<&_~_evsb-tkZL5ONSt* zMQwwCs~&kD_Q>ylEyT`+q-8ctG8w!4L-ARL_YGejt_`phUHVtF>|=x`W$RHM{rx_N z!6(H_NSREYFVrekM)LN%`vtf$e|oT{^D_iw(^ktmw>&DhG`uuqE4O0>wMnq$B5qRG|BWuuGY?bgR4E7G+GX=(rG_aDH;HMYFU zg8g9cn?xJeO^O%=MX^ntK#z&@4~Z8e-L03Xtg$9^{XBUo>y=3@&B|lA%YqD*1#%CP zZHM=E$uw;f{(97`Y5@(;;G3OWQKPJ}XIB==5zlK9A|l%z8;IF!((`YZ{{YFeBo^*I z;Oj*+g&2p76E@njB3`)Rl&RVyZ5N{6E~7ShdRnmXg;X2g+Wcjy{~y?CLY~Cy31Ma z&v~aHkvX}}_*ljJ6o;)@hts+Ik-Yoag`MaNRz@@L@G_(KnRC~fq)oqjrF&bX zqL06k&IE*8gE}zo-?M1 zG}2$d=j@6cH3@=-x$^VJ;eEl)N&gV`mY4n8&gpiIX?Ujz5lcUa9|Tz+FD8f`|*tn%#hSK<^{EKjKo}<}a46Kwbb5zFdv`g=Th^!(79<$&;fjnd>U< zmO*XbQu4R){)NAt)4LfPl`UOzyd?pa7A}T~DCj@lq>@ch?7ChoH4-Nfwrp@7S|3TC zXc<!R`vVwumsFtD;qJ$)8X?-MmF0I11y0YJI-_6P&@$SQZf%E>9wv^sX z^6#uNLax2L=#Ra=zTCV)L^)aLc;o&>anyzycHld$(ahA$4m$$ma1j2H)@6$`R0=UZ zW&N6&BndY;I*fW=MbMI*2(WP>9C^Mxa1$Y$_z!^mHYi*q@E_psXJW&P$6+ji&+v2Q zgXke8jl+yA2-b8p;Y-^@(Rpfxdx}Tfm~7R+oL7j1B7N-sksWGH4%eja^4xTN+PLYj z*fNq%$+VE@Gq!7XgGwP7tp`~~HWV!q0$=?fb}WWk-S=^c3^N0Uhul;3b ztXLpP^ccEh)ktyJhs?T&YGdTbaBDJt`vZ+pgRQ>KR%6l0n~{AD6Y{pwpNhj_Rr^Q= z=x1)-JH2i&2(z>KtPlZ*JCmlmSmfuksmUFW0#FQ0P0iy#C#9`kM^63SF^m4wgE0#? zw~D)Eb5{ZgxIYHBL@R7eOyiCFmB;|YO=X;gB0*oHd0;)`jD0g2tPK%G@Dj#&J_t4vjh{Ftg=A`^}gMnSR`x*0G&wVndTZeA_yp_TWS~Vef7n-&og~% zc&hc;smetmvTW92yK64a_MH8e*>byTa(HaheIZ-fWo!5*VfzU=g>UEO%b19|H!D6- zJ7tF0-YQ;X3(Hw^JvIoQgan(s5kQUYSk)HVYWa*uvVuI+un2{Cvvss>0snImP zIpUPV*R2MV?xNqqoF{XzJn#gY?Ya_bA*n6xZjloMW)xPY1cyBv5ksOszaq|bTTPmk zudyG^e$^&1E7hd}iC7(F&D9K#Ov=h_(Ab{$pWoT4R4Z=GwUHFn(sH9EydT)8C>#q`5f50L@Yn#$QC^>mq7l9EAgVxHHJsO$65H_#?7f@%=?O@ePXNLRLRNDW@*C#KizH~FeG*A*C!z`9Nl`h^2Y85aSg z+9(^IgH$HXz<-I34Lrj{-?crheOhr7y}ylk5Bxk|?ls%gh z**c3i9EfR$i}%3w35J1>H^kkb88me6cHZaR2+N~Z0l|~rb}<==Ge9%;YZ7*wsa#nGs}6VX5NaW@awP5jR7-*Ktj!#`#ej0j%t8Dp1-Y?JwyJs>$VQJ$}x!l)1?!JUBUeGa5t$ zq5y1AdGoBQpw^s#KjT}M<8B>BxYYfv5LfZm2U)prvzv>RVG;GyiDMW8z%>{R;9yL%fR zE{F3P_n16lbLtMD3JTs~?WcRyoN^`kWEx)iO+14bK%(^vUhMwH#87P*tkyPmdWKe$ zR+AQzM}z&gEoe`8y<>U@aD_HitlaIAMCY?oYi~XQLDP?L_h1;9{mD-ths|BJ#^WRJ z3Xh}Z?b6+dOFs9@0=P1UxpF4`m7pC?)9tl)TG{LFbyy6Q^;6B6(VhW!SOhyjg7G)l zhi=_U5t&NgG#*lqmqe{07($m?x}sm*GP5NT<ZUnXyvjS=y6LJXC?bd07q8xFri<86 zy+n7feNgQ2Luq$%bFCo&Jq}T}IFq=k$5k)}eACvf=`a8B{{YO&dbz^>rb#fibx(G@ z59*1wcu`nhI&#AKfdq+qxDnX8d&-@7KosB5z!1{LiCZQ?-%`iVya$4=h)n5~PIG6R znd$ha{qBPLYUaXXUo%*oh1tg~+Yy27ojjrLdWU}7YPIJUvd?jKTNh=5)0`8xLL-Vh zr$Q80%fgngpXZ4E?I`n^CwN4E;VTP}A8#(xGRJHkmJo7h%k4^cz4NRx{h5u11Kbj# zUCgt6=!0N5Cm@arftlcCV+4ISzVP%9d1YpVl;_7N!6nU1RO3B^fuC6a)CUN$b|GklgE#v`C}K zy!9ug=)3;|oU7nv6*G7Oe8^|p$6n9;g+|^de3tYFDyF>MzZN;(f$F6AvR3NkY*4CWj+rro#te3)El7b%i z(y?;Vn2;f3fgaN=@0Z-Y$ibnW(DxBiTMct(TxcGF))j8a06fqdKUQk#>4;9Av_6)| zrT8fV=vL@c8iY+w|L5>O-xtw!vM1kqk{vqlmH)5if2$|_tuhZdO=Xz12-k(Mtzga= zGp;)*OAcM)r=uo=M_DV#LScv3sYoGuN9iDw`dpUT`k0s}=rh97_b6PPqU3|Wg_EmJ zxzlR&xP<&KxHnNaccOj!vR)_uuw7x1aL-rSO5BbcZg(^0fP(G+F3~e9;^VFlyl#cO z^C*r#wZi{V59#Mihyy%VwfMYDTIOf}XXE7h{|f2z&)bChD$poD6^=@oYVe20j}H^N z;oaBWwTl7om`;?&)YJOAX#5i=r%JE8=@MU4uyuvqs(m0XY{M_ew7wmxx0rRn&=f)V z^oS8f-|owA#D{#w5zux&{*CJyVqm7v@<}nw#U-+$1)t~qTl{fghTeM#St{$k@@E%) z_T4iupoi<_BpoL18cyqv*T}BJ=U&~UNcv6DeO~vh&+Ct_222FJo(V;e#%$ylu1||xu>J%F63ge}B)r)OP?s9KjO}Ykm%^Tf~Nbth0 zqin_L*nn4yn*-TkZc!i4c4=xf^xt$(KW3fpKZp5&cjW)cz%7YqPX5MsuE18l6a@6_-*Kg|^n@W|RS zOlK9Bi?eIOrphkj-}%aYyBig{xgP@8dsXB|8J-B+9tTyCxE1X1{tT9CIrMCKJ`L-% zHozlP&fzw@g*zBf7|;qRxP`c795eM=j_4%(CZXkXPjq-vz6z-UHSTiH;p!>4<$a4f zM^2-Mt2y2^D;fFzc@t$Wt$<9slDEH?eqLTCgLbXAH20OqJS=g64(fb>{p`xt_XBOy z7!vQQfVrJA`|--+IX5ab53>trR`8=BZWp9=ifeqr_TBdSD)ZKJdGEE6a9<=Ews0C{ zF&@E;_2aD>Rna$aJrlIz`&BwB8~+mWcwpw_ot>pOVkTVLsZyN41-P<<*d4C5mLYMC zr(dclE!LX|al@3Cjf0K47xZ@&xj{Xt2>arv=OQ);`=1^%;4Ayb3PP4&p!tK$V?riK zv=!~0&v3?l2TKhz4pEa-tfE=!KUMp2F63EBkxzhW^0kgNqH>GAw6&tesXkka(TVOc zWxM)6cf;_33!i~8v&V4U1$>BvQ?YwW|v>Xffh zubebTop-N6&DBZRlE}{%Gpkj5;oMbt;XlA&m&C#8Go_+9%Jxo*X08Z_R#{$t9l_b~ z(uitCwdMHiadqLKX`(SIkUmjT@#jS0%OgAC)f*?lzu-$Eln6Lum>5d0K}JKU<6Hjr zs&a~hd~{PNW@%Qr&j+;6>1wRgDhLj8DyvC|?Ex3=ZkQv#Q0ZQ?a9Z{~_^~^Nv(xph zHsd%BCRX8^q}3lZBX~HI5Z}@!ifn!9(_t&p<|Q68WFXnRp=*v;>39&dvgxwZ<>EnD zLrN2zwAz+umC<#Wc>v82kzt^od%cBk%WPr{F_R5^q;_tU%)2)@O*7?PxwJy#-MzDe ze~$KZXkq#(n4DP?G2&!nFX+P6J}E46>bB4k+CDX@iE-Ise9EacCDv0*p*79*`@z-^Wha6OTvpt4i{6Ddu zsFbLbLP*I~n}YaPfW=30w)cVXf45NP8SA2%PqcgHcITx1GOk}CX#k>I)qJgcP!VD9 zrRLR34`tf)AB^-`yeqI!xx1M^_RkC$H8c9^Mh-2kk&8Aigv-r6%mjw>D`9ydC|(I& znrHu7PxxoBbbm$&g06eYRO)glU|cLgCGz2&9%JRDX^LrFtN!~#~v+a1+Q@{ zoTcOX32k<&3+C1B<_b}Ks`1Udj2aDZZHC7u?^Yut8$XMG5gOfgIJzev03lPufVu_O zx3NkiU9B3p*IyNsRSxPXe!ph5rvIvHl*Z$|e!rlQd_O2&x>wcOJLR1#4!HlGD7qpk z?3Ctsut!KsF_sxR2o>x58Y(Np195f#^}0IEm7muimRU>Rz2g%HEC#D5W$zObH=VJ3 z{?5hoz?oAou_^CrtkL?ezWnY7pKD^VcPPH%bZ5FEYB7ivpNO@6%{5FtjC>@p(>J() zd|`bpr0u+uasllrcb3N*A^%h~fM=jAFbpFS82Z-bw%@-1@m_~N2c^dpKHYy$)cQ_@ zzb5ms9}({(syVm6*Ke6UM|>>}_N$ipCLRexXf@c07dd&Qst(WPPCQkOd1G zSmt}l-my6uf?S@SbNs<)1BIH8T$ly&m?;CR7k5S3yy3yj0n zX|4dhxQ!?76{hvku?LS(^~Rs8_x>k;9@Y&)d6F-!&pEO${kSbhkd^cff+Kw6)E*Xb zYfjxXO$#q~ifgsKDpy(vNj#kL!gkWs6LPLcmN4B3#tPnK7n^>oy%pOyK9Ic^Eza(F z)Fw&NO&LgKy(SAgSXSS$HYDK6l1gqFCNx984fOQnv4y}5WIMcwP158QeAj)|cJ++s ztmgzVd*K*nd+e?-R_U_u>eix-!)v|r-AgZ!a}UxI?mFP@(#W)Ned0 zdKgVJE>7<}>YYwC4KkjyRvC)q>Gc>#q4|9CZ`+a#!}93Nr2s1vRvoUMc4gSM&4tp0 zh#=&!ts8S5tp1NK_-j{MM(~ZqkTM1sv0KhxaBV?rTK{fzeTTRMAwBb_reWJa9))(J z#y6EAzDvYNx>^i6h(vMrZPYi+=gkPKZym`|Lz96rwZ>Z4TrQPdqKbUdcy?(yE}FXX zhcS)5GnUnuUu^V3h4&mi7k-xI+QyFmT9M-H85;WHPk<8k1ezX?I{aS04A!BIwC?X} zdE?5?Dfj1M#A)gWPeau8gubf(PzO%IsaH0TPE9=vcL-t908^)cX(MMxXnyZ!UEG9| zY%^OxySNo}W|A7ae37N)#M`X%TZ0y#j#PN%c@%WUd(d2`>f;Gg&RYfPw5Ouw)~{nrkK3H^s;U4G&-jBYxFaX~HVdU@ z%o6VgQw!D%SKRGGcp@q$Rxrlj^v7W9MSkd4d#pMGpY-nc7B+oTz78*<2-^8?8wivo zGe5yf`ai<>ln$rrzk3fZ@yBS-TnFE@GCEU8x&SjlzpYf2d1R{FI0M^E=~W|k!)<7q zh`ofgwXbah5Tb(~Cx>)Iv<6lEmJA+I{5q#^6yCUSc(bIdeYtA??$goDk(s~4_5NL@ z+*&D6$o1S>LgjrRKf6w@4uFJ2#;g7PGl7SeZIaVGk962(W}qu_dCM_k+eR_Cw{PEQ zxl%CyhTAQvnbW8VvZmU-Uh3NBhbpm|9~A?O()ih*;njrS)o=DhiwS7Q)dcT$bkM#y zHiY5t*dbqYVj=w(*3cTdx{F$WN<)&dnJk-CR^7^s%9h=HkXe#xW>jzT-mm>nmV}#7 z3Y2s*<)VyQV4Jx?nFzF6@oIxc{Hg6J&ivxVNHz*vl3VruiUnP-=a-N37f^x5*-P4s zy@?ke$)MToiUhEuQMC7>myO&7VkdSDy}C!Of7xlP2XzyEKwZ7c-KCpLY4r?LTVcw# zqEMu;rEo#_fCt)}Aa@l75_RWLBK<#*~JpXkP{VZwKfL z#f%DJm#>N(-@1a}ct8lbxAx(@f}1hg)& z2Ni@++Wi?_dyD`U>)YF5+LVHAGTC^OEF;-pY33>qH_L;U-afIFk{~v1Q}V#hvE}?8 zBG>c5^|3=uV}+X}R{ireeJZ`_e>_&uGw&w@5YI32(Z<@zGjV;!p*dZ2!lZ9@X=Y?v zulw~eRIEPH4cM=)YwpF;ftkZVbigIfcmVr>Ovrp;4bk6iGs&kC!*T9AO#`b8++b=_ zId6*nUNNgPw~*{eHxI@F64C|tqj&XBR$na{j}E_lMeWr7r51;wG#PQDO28ojg_T-D zK>}6RUxy1X+KYgQd8)UbQf5}00?rHOz>#CMExCq?>1I2OMl0ehu`!j2l?U`nLdH=i zVqDAG4nMME73-rsp!}9=%|o63n5w}*%!@)V)PnNc``}EbS&iL8cL(N=)#bTnFT?P6 zt~gmaBxUgPKazSqTP_dl#%k&@T(7RzPxp_L@#tFPe5&sza4aU>k{QWg`^Tp4CdF_p zAu!C-aTwL07PN;Gc7>m~5&o>l1jT87ME|gxk&G1Q-=I0iGcR(cv~?P5F9HZW!z+Mh zmc6Eol7DC1KH0Z9rQ*M#m89tg1RuJu9Xk*^al#{afLt53Q8d3mA?(ABr!;P3LK|@-Q=>*Ye0}+-{u=c zd`8m4fA;N{N>J#b`{z-Ix)LUr!;uaFJN#ztfkh4vfJ}|QzTSyrm^c{x$NOvZR<5EP z7IRf-2VU(IO`GsxomOtq0GIjWIjWuU<|LnJG0?UvKaHUyU5~CZ0NXRVMl@C7s%_gU z$-JgED|Ua_jx1rv;M@qwuJ1i!2b)^* znxuX|>H2>!@pr`6YEEWEHEDoHJ%+y0mLu}^+QL7hJMj(%zH%*AsN_!Zzx>GcqDOhG zR`ZrfndqdMR{h*u(2QM_(jt$WIl4jXCZ2j1HCw)mEYR)ly|aDO>JHb>nH0E5S=01b z$IKPTbrNZOOA8ji3a7$7M6AAk*!~|6d9_yYuVn@pv6Xh z=I<~}lOogGVZ{V=WGOtR{c?UrO(X0v!}6$No#7jeF!${0HR`l2{1qPa@0^IT0cz*O zXn4c*PmR~=66mZ^l2uDMHB=<@w6gBRlf7{cOR4iNV%nW3lb!eBAgW*AaA2zS%W_c? zfyI}ucVS~F&_Q=~1yDe>m|SOPk!Q+AzVc~h>fN{W58^*C86+Uv(f8RJeQ4=-xE@V? zl1OnVJA{881Nv=?ce9(4GQLG zJA(C@_;25R6f!4tT#QcknY|ORb{v3bekdGw&QF}{3PVB0H66oaf$_x<{Q0l=uM~;j zC;A^)3h=AydvM#C=Q4iEZKQWr`WaNgcxV)-Q4$D%?keIgV84Pt%x=F_F<7{qv(H8A3xyu`HB z-h0TERyE=4`ftx$%+u-i8Oc3|!kK$m%SYv{!!|AAEzzkH8l`_~@fQEW4uLh;(tHc;JrtRi4@wotM8-TP&x6!}R*wP#a(ddXUC zlLfwS&}#EK_}4D7r=srM(N0v1#mzC(BcCF-RGzfJ7ve6i)mLhskI;R;Tg%4}FttyM9MK<32%Z;X+Iw zk|Q^!i}CYLK>oIC%wp8r?rR6T#ev4^IaLm4jD~zbSY*aGV=cW{TmPXg3(7HHfW-=3 zpaUax-&uNKtw!TM&-Scd-Zs_ybuMKEu3nXKgZPbQH6HlBWa4Kt;MgOB&JaF{{NCCF zdW*gFy&_eH1Vi*0Q(A9hYPVW4H!SYPBKn-HWQ*s&)cGs(`JVlat(f@P(4DF2Roa+N zKIz4V)>toTf*D7SC4A@By5{sx&F{esB}HBMj>rt=f2^@)z){wO`C`{!T+*%2kXGIE z!;hxwDu=QCoi})gZqN}-3-ZCG-f1i9lRvDLqQLsgA6D&*-{#m=iKBXnP7Aj9=g^Gt z{Fu*3|4+Z)HP}xN`cso|T$3M& zOGFzcJwnl}~-Tyq6 z)9AmM^={!VNB?*K&*lHS_5XJ0zw>{IOb`(N<1+n!OeSzNQZQCg6IGWaKu{q`!vM=S zk?HpC|3_r{4(I1$A@Delzn$#E?_L{#1V;iJ-FGqF8J2u50)nMbV)!rnmMXZsl*fke zdNwCH;zO(d5cMU`CD*agNPV*R{_0;d#xL!S#DwMn^+oLx+HX=*?}zvYFJn$9;elF0 z*=5RewH>)(WRk-U6P*}Iefo~} z)Jejna1AD{RB34Avxh?uBw(eE&hrS}YfvRfx$q@wL}(WGYC*Rm^*|yt65MT@eT+I; z{SS=XDMV;<>Cz?*izI{O%tQSow(@6Svj`P+-pPGIX$o|F5qUJ3YeR4h1W84oqB*?S z0B@xH7dPe+E?gAMB`6tV(xlK*oJ?$e_b#v%A?q6Nq=KmQZ`6o}SS&zxVXrO{j2C>Q z&9Yg*gsVtV7s2~9@WV7g4B7Or52IlN4;m{xV6zHI;NSr2hJ;+<^?oBwT*Lv+f+ypZ zT7yA7s9#m&^~9UEAY0ejVIzIO7*bY9qMM+&0UW{66y$veqA)~(r6nY5YTH^!+4~Rd zV522}?LV-bbcu?2H7dfm+^IW$2E28asjAl3eG2;LTn3T2#l;=? ze_&(b!gD9^+afTuVGHyIIZ~wE=GSCuRy#c0ol95^PSPQc;Fj5lV2^m1kI{)CK~5ypi2z8# zXt^5zE4`NswEn;>CPeji`o&-C-SPNPnl(Hbqt0RDK2h*7x>$d&l_yn53e?hg*q8=}(^d~u5 zBW|XYQtc<+{E%?Gt-K*m#=s=K7mNIak1c&s)0F|>5oO##ER{%7Dd?Oi2`&Ww0T?OD z6$gqK$$Vf)Ez6GYGz$R%bagaQ4Zw#8xNK zZtsnu;0NgdAbv;`gntk(XI1x{N6l893KU_=HatlWc&U4$Q0zy{toT;c9Kat1^8EW5 zF%6@pmOn&~9Lw=tXo{9=sD`EkYpJ2s65}|u2V#6qC~cm=2~bivRfJem!6^|^dmU+? zO!GAjXCmBQf2`crVMoK=>QehYvY|`l1ixYXvxY85P0~|y&%E|0r)U>I)%m;(k)?&o zOKP#e?}P7xba{z>_S49L2Z8#a_i~(~0$z>_6p;}jc1fjk8H}C0hE6V<fvqA#9Q=)fDfYwSMTYRGwh+!S5q5Zv;{J$gLIA zfGO*iNGJ;RbL?+hLB58)WcxcX`H$mdXj6&uI@e!$W=wcR)u29-&3j`GeT^^H*={FlG12&c5D3TlLyV%70(BL`r5yg#Q8+d!!HGWIQ<`0e|J#|}^YTAd; zWct_)A?ZnBUlP463ORxYhj5^Jr+|p4nLVWLx1-?~OqCT&F5YLzT`4VTlsTs#>D={8!%t*=4ffQ>KiBO*OqDg7Kbm zE93;tx4Sdy4=y|qt|_#%t;p;c5R3Ei3rRNtupi{saH!=vp#{ z6pA*1HuuX4yy%zfU&mx%(;aztYA8cGY-&QIf&o|v41kKPM?>%M4O^v3a^SFR-F#gP z3_sdPf;p?IS=v}u$C!fu*udAkrU=0nHon;qm>8OtL_tI)ISYl%n-*Q?xL650xI4<8 zib}0GM9XY?__C3BckxH?r>jrue_(&wnZ05cOB+biQ8Tn@vtyeEj1vz)frIct!u30& zkT9ldwCo2FJ3>bs6|##~*9%Km-g~dzS$>~YbV^!2H+Oq6sNEEIH~BB4&ujN$5YAJp z;}P$fzWBGy6%k8@oBs^a;luK*Z$0;7j;Ms8T&hz8|C)yf#F|3IiUDS%G3OM_LE37S zcJbtjcDO`4yB=)WjU9@%WDumL$iWlIz6ZUKvf$czfcL}lS(t3&I(llgTI_+{O_oK! zx{R!e;k~FpRQA&c1+Td0erg--r~QDKL<9-*>*dcpu>DP_TrlXOz67MqwM6djykv@Z z?;)CC#}u{h=9XcYF*q_h^jU0!O<|XDLmN0L+(q0>W2V)hd1s%NL`8CvBr=R={@ppS zMY#SO(w8?FBp_Yd!xV9j_A^C5al_-s%|J?|n?gDT(&uQeD;@lmd%)^Zf1pK!r0&T9 zlf*V&#l}&2+`fou@eEgvBl(b_^Wb!f7{j1o10l$K)FL(LhZn0!pGUInZNA(GNf(Y=bOi&{2&)-hf~nMcgP)uy|6^U$=4;#)(;ZZ^Y?e;|(S= z6^-sUL+^4hP>}2p@V<%rJHYaP0O%!JG6b{%sk=1}l+>)Kdv$k-mLOA_crglpI05FI z&cw#Uj2-rVK%*;=7L3i+<(}uPmmL~tai8EeYNae^sc0=Rac3JK@ zNnn2WKNOylTYSBBqfn6=OCpel9;&IV153jFZ+8fQG8DBDP+#vi z=+wU%5>xX9m5_c?JKs}eVqCJ#rDkKNO)vrUn?vDoG~;&e!!=oHgNg}c6Qe`&EvVs! zXOB}QP`CYuO+x#@E~#;*{qE%rgY{?)b>Q9~l1+}ppvtBoCsx>x0!OQ_JOX8>SM<5w zAdmV-;k3a8gg_6RzxLd3SQxYgjKWl|FK6VZuU$r1(I5H^ZQOrdF9hLC4uNBiP* zFy**ZKsR-_S_ORs9Ub?>LO&|3cA!%mge*}OCSr|3gG{C(J#JODbMPrwsU)qxGO_P! zV>{Q3JIOCwTzCZu^GLB9`h`qibM7NqR=5h+c-otKWEc`Q;FASmwvH=l76E18K ziTIdXy$?zE)L>5ZEk68M5L*}#*awx->nAV2_}TcNHBLca$A4h;Hpw|cfwM5)C$%I> z@V^sHHp0hcDdltq)`}Ug;~;eCz;I=ETXA8@k*E}qnwyX>;Yk}gEPAC01zsrXFYAvP zE%^IiF~;eJG#xmF#_)U{1&RWgNuoWP%M5f{<`IB#)blP8B(4-iFs$w}k2DV;3}e`$ zv3nPO-$(g}MDJegX&hSFQ|i1|epm>(_&OXo27$wGqX?-aQJO%NvN2XR-WHw{k;mk+D>gya#m}krBm$QR_Q?vW*Po1->T9yF*|G@HgErg0} zsh#4@ulfCs6B3l6mRTWLGf9AyF~{SUFqUo}MMM0U(p2CWn=AJ5jV#;!1<8KwlI{>S zw>l$Zhm~D{03VYZNPcE03Q`4%obF$vdquEm(FddCJ$r|e^(y`+sq}V}L&?8p8;R2a z?4_>}{t9{bdtvJ!-YGZj#c*-g_OS3tSNI^yShGVi?4lqUA^ z2_MBU3Vh@Uif0HR8Zw+{aHZOOyzLcyRtPn72IUC4?25AqkaLjOE%G@c@$QCiC8RjT z!ckQQ0wA`);~&hD%kg}bm)9nB7fW=!-y!aC+z0|leMpFD(B~r&4`4~SYmX$V zf(Aws0bJx0;hzX~AEPRLi^R`D4X>{P&{9T9n<)cAt6wW}=btvBtoY=Gi7hMBjgeFa z=psNRg>Uftc5Ll#oo^J8(htJJ0`bk-mv&;K;PSswh@wD@lbI|HOUsjyRY|g!Vy4(( za$dADqB{M@g+}NgZ&wq?+q|*$SA3x`_@NZ$)M>2RhSeH^HsIZU zp3aBgH%1qLIE&$2yBr^p_jS^(kn7s_|R|b6S|(it&JhWf?Eoptgm8Fg--J{ z9r;6Q2th+EH@D?UY|7jUQkF)l7<&`!B7b2*52<33Swf$JtxfW6_K-u251q-J(H`Fa z{s(qa_RRXKjXP-WTutarikdb&Dw^k_;HKp(DpzzE)=bA2R!Y4`shqf4`WF#vIq?C9 zsJEI_GD>tX^@uXTD0J`PDdj5Cnsj)-n()R0S776KeL zY$67f+Mzl^$5dyR}io88$2ca)Cy)z3_~L!Q>b^&X6DB5f%8@jVbrwe9-PO(A)d@KNK^5iDb*HYjt2z@T>#|It3awL&)=fw(p;EJ3+6SJSE9}`BnM?||Vv!8oIxmWviQo}#-GWg-m9Y!mV>AXb2H5AfHq4r`v z{>Q(-zP)5Tf`c>3s6MjnmqcDT87hOQTr`3SiHr?qM##Y%-#~~dCDvG=cp;wbpecvs zu9SHyBi$eCu)>N_&GLD(vidkE?BAl4p!EO1;t51FSOSv~B!^;^j@!kS``{h` znL&^EE^}Z()vT#hMs$xvjf)U$@m7yH>AQi(glb{~ElLeJisDOjx@cS~!9^r~OFgZJ zxyd$*GlvRCL0W;w2mbYf0l~M-v8zS5xjyd3cV~g+kNp}x#ypSxE@wC2oO<5z?<2e5 z2w(2&S$wo_IWg(^e>k3fyVYuVPA8zfMpeViPwG#Wh*TpZo$~Ne%xf=Dw3XCnkm5un zbFR&u#3Sx?cCyM?6ws~VxOIny2a=Ki>PUEc|(fn(jvZ7JY^`{7e>ibliKi2$_SM7GLNEznhcF@#niX z&M52DgTr3Ejo4owk%>`74d8nMkZ8W8!=Hgd5Kee2S2}PllxhN0 z!~C5%f*$SU>**%zfFvtjc%X~|Mv^Uk{{%V*x*g@{x3Scw4oShpH5_y5(M%ko3q4&S z4H>$(^BMJpca;dLU4rcQQ?=wr2%E!AhNMt9{IFD0$z?!845tme*pNk{olg4)sc{vx z#UwVi8?!@P?l?X$js40uxk&tdpWs8PYc3boQ}fg4m<0KB++A(Myq>r zla;J9(*k_Ym^7|rEl>|bDmajJ7SpR+J=&`qZ7}|6x9fG}@P1o-=){}oy&JZV@lf#D z8`b>BW2siaAcs@(6sSqcU>i4Kk~o+kv|dn*Ql&C71Sz%tPHB@Hd{ z!jAHak)qcK#3bNC-<-do1{>M7%ZbAtjjV-ox6yDV%TiKGn2`7I%%}&$48$?91XYps zZ;D}XMZt|@(oXJE?7~Cc1>4$E!vYUH=)e-Z=>L#3n^5&;a2H&6+(E#oiqgVTyYM+|Or-Tk!i6PELpAk)3f6{9 zVE0~&b|z4@w0_splWEkS)u*G1YVZ+>tRps6Soa7eBWskMYi}&ZIWR6oy_r##0$7l& z<#>F$pNbV^n%)DADJEX z^=6K!^2!%7@grxY(gxYGDWH<{6cC4e8{8*99O9qg>5$y1Xxio=-Z4CtEYo3qIivCv z`-_?B1mbF!G=9r;#6$bG1fF3y>YmyzV4QoRj3SW%G%WlO_~DiKqVvDWAJ= ze``HYN)aiROAcV1d<;k5O?LlX8H5ImYrIfDWKgQ5PE_biFi%QLA#jp0GogWoDYJiO zwY-b$H)DbU1z^xLrgngJs0OT#5d)#SzQj`u=}avW1%i!XNyaExf6KiT3%StsA<~r> zkSDaZXwraz|AAqIGrH$mrn})PBe**)79dlbo9GOL<#oyd)5y@`%DwoiQj~cl~l__kNgh#wBf(!vj>pDRL5d=GR3MW zWS6C}y38mOel=Is#4B|F+=G=Wnf@dXEf64G>uD= zkYuo+dEb3C9iY^EoasmtWl9qwk;jMoT3ue`{0ElXKBnN&2G^S7d=}=Vc1=V`BVfvg zZ@FR9u?gDV9XCe5_0ISzLIS);4~q*ej}m@V#fo2FNI?o2SdUCm_mUUogOqvpL=lxL zxyaNVa@yS-TEUEE2FOAuVl`VPPXr1g@j+=ryQDbG^tPwHuAn=H^x-sD-j(5)!A2aWrU?mxGM9&wR{;fJ_ zHxR0y)+WV~v}6a8>zL%>4wB24-cpejLs_ct@#@1AvJ!+@#78DA+0^~3+xpRSK94d; zIRk#r^(Ci|Su^A4*5Y}0yt%3vewf3+>(57fzXR?UjuaN6cLFBr@Q1ajYq?{LGsc{^ zZyjjg?&WOteU(_ISB`EA{aG4q2CN4i`Q`r^}rA$*7TA*qXkWn zSekQ+z8ZeKZ5F$WAG!hFF_Gx|uW&F9Ld-_|Te}bfR*Z#86fk~1|dpH0ROKYI)Rj2|8wQ%25>k=}>|CztGROexrOHa6P_UG0tAqjhtrE(G4q5YzYH zopz(bR`q`?81)hJnwa7kjsVwMpoG1l&;_R zQt;x@oLmyr!I4$zAXMZEVQR||X8)R3v8-DS^AS9`4^F=5{WC zBwsy7iSJo17VDFxf18h}OIoBPo(jBbvFs>+-h~=cIr!(J5a6z%9`?&(`fTK5t@7S& zS-4&4Uh`MyvmRAHux=T{KWXFAuh5Rc+RmFkSmjY7vJ-FhR(GB|;(a!e)CQZh}v`QYW*DZ_E7SHOK;~8>x~&oPS~+0NDJ^)bfmo9 zliy(y-OX?ldt{+2xQbm=vTIOqw=n2H@fjQzajExRX6hlXU;urqN7%#R!d>#i(by=# z)Zs$aREObdF)Z#;e}^Fw&x19^Wdtc2ZuyYp(gXz+CgT0xwu*QVU9-<25|c}=p(iQ7 z0&{T!!Op&$p>+PSkE=#h+2Os3cFgi28&vdM1{GJ`$N{)!@Jc;}To~}BI&U-CM6+|y zpH?fuiI^enHJ^sy2=)n1^`q7RCCv01qUVJ%gt&BJOco3^Sshxe3TC`RnMh{v9QQX8 zo~ySV#lpr*E<{fIwkm4>=KV(^XsYvVo=&v?EJW~yX7s0NG-Lm(>VhNF14+Cdro0^$ ztYzeRpz6UvAn}&T#_!2es#~f_^1KkD2;of7_ba!+=ww)+u?5Gg;(fvsl>LHQFz41@ zofz2zBbMXK^p-*Z98&OZTL9Y)l+*>u>f55PLa#;m9Eabd_A;f$E9(KuHz94;>F6q{ zgWrWMn3WWgWoN1#1c?1o#Q6s!6G;J`GTL!l5@$jYgQd?sgqWHb%9be`8vg_n$(UP` zw2dSF)&@~JeA-2d6*UhK0ZfX~x`oF>!JpUb}+_vgALUcYzV zgMVk{{=kS_Aozp1>J4@kuF3sIuVPQlM2;zbvw=Sfj|D&YG`3A{*q)795hLz&`Uk6WgG2P#Ma8r=J(qDAYsnAZhFXIza%H-5I=$)jV~M zW?83o3F|nfiLi@YM-FT98ZIr0l7 z@qlzehzQW^hDSiYxh18J;;IUK<95M5u(V(E6C-fdKyTqf5OwQq^VDxQPR176#=18QP*(UQ@SC@mIOWhgy-Iylb63Clmx6GFjSD4e-`>WET_ z@o&+dCYM9rCP->wV4keueGuyc*b2Ej3v+hbg@HjLjWPgN+geE9Ppz?Y9C#UfO?{vT zaN3aV^F5Ps6P3m~U@10AnEOV?z`JkJ>P2Rt$qN;1o7Z9dLO*<9;Hi;^5Ba6P?aZOx zngT7F<21i$q&)$su`iCw=08Y~Pl&*hzcw~Y&2*)zgn^_RIh3!e!=+B^qPBcTvr>nf zw{U(hb_{B0HX5=2O;sZxwI8cHK?EDR_D)1{FVcMIT%#W^HV;2E-w;Fji zD(&=hYJC4M-7w>5Zp1b%#wc3K$IwvJNX89YOu-6?s&MQ|JmlEZi-Yxh#;72u`uU# zq7zKa$DCOyDRF+N;U0OS+f%+l1nF2Zvt3<+elv4?*S!%T6L^)eqkLk4L;d6>)}3}l z-0{>j5{khc7|m%fP`D+3cL*k&FBqez6!ejq3AzmoF8D|m5!hUIq7)3fZuAC5@Is`FigRpNA$0=Dk#pPCX)Yd{V$j;aR|`i1QO4k zjhHX4$?!r4ghRsE`_qo-Beak!Ip@89NwFElwqij!O00q&>`#^nUW86wnns@Q?>;w& zg)O7dx!3y^4cxU<2T-ZJbsvI@rYwg3#aC=n=FgF%-7>@uV}De-^AgTT3({K01~n6= z3|IH0aJeowrO(-r_ZKQF7pR-*Do+gF`tYw?;9$jiU>}|7b+O<_Q%I7<>hRf;?BS=(6zx8kKst2Nh}UQ zUv3yHq{7uCo+Z$^kowP&lj__?6Os|bW~i*jTF%eHQnY<@w1o>)pW?DZm^ap1J}6A+ z)XF|sh`Ezq47LF*CdPS3|3QjuE8)|e2|Gm0(4Hi0+Cy9AGqNj`bO^K@S&WP*5HGfo z+X-3g9%dZcOEs4C$wDUNy+*aHk_PnAhbLFXqzXPvm~v*t#Md=Th7ynwF3VQ0L$Q9P zfERj&B4k*!lI=Rcl5ITYynX>5a~y12v@-_`1ONj&fW$;CC}HdFu7qkGK)gsD3RZPg z&lmJVNR|^cR1-?GDqBSnMs-XX*!yj6Y90A<{j>Hq#WVtV^)*d1@WYcSbtJHH;8%xg z2f1#5r_olBUR!m=8aecDn6d0(rAILE-3e>6RdLF9WXn#2Xj5o)ksqU(^JD|eqw?K8 zZG=Gs?n0K{?}sKYc_gYp_>%shq~rR8Ne1toHfV0e*O`_F1)46Py`Dsvg&AxO96Omr zJhTWb(l?%b(9w&q_d5}mWBbMa!v0y6LAOM4UQTIr25HD@4r8hcwPhJ(5V)Zu%;2*G zx$h2mYS8#yRY4KBt1Fkf?}>|i+5(9)av*m1gMeHTgcQW#bQGQ&kPf@yV$T|^as;5l zaza=GLl4s5^v=BBMG^0YOuW7&h?tFic|E{cN@PVR&WG7=>^dF~wglJYoHU+69+rT@ z#(+(Ps zL`aZZ5II-WFYO*y?8%l{P{@CrS3PC?cW{1=3fChlHkqXxHcaPEH%HCKC8a6sO*-dU zO#}`nA|~KZnP-iGX1@U@V<9JBx&ez{`oHGX+UfaVKS}-(tJC!`6E!R!YkH&Hn09b= z!wq#$eu5{uwWc@+=^U`-w|XW8joTWs?70?69ZR?|^dDT_{(uqCcG%V_vMS6Z^2SI_ zZ8suyBjmQFNeA=T|1RGx7+-Pdf|Dkpk7H_-H{8kjDtSFEMfk6~Dv2Y{T&Cvz48q8) zF^3;6Qe}sTWGZz}*8B~I9+)Fl@15G4YxQeK-|AthTF<_>sjeue>U8oxe=Qedz~0vn z$T>DjE)z*uYM;f@Q>$&n)3~K{@2Uona4u96sScI0^2erd5Q3%p`O{9YrzP*RCC@^j zB_F4AbgZ|%pDfY2WT3xd0~(P%&b0*zBe)48Lk1XUA+tyhfzWTss+4@%0z^#=XIV#k zV$o%~Kvw_@td4X}lm{2sHLe}{PQO=h({%*mrJ{%l5mL-cQTVO3BGZ#&u0O~{mW3Xr zl<@Q4n#%mnrz*ylUJIDj`}-9WqoP^&7#$SP2^LP2I(nU(RSR1lt~^~$rU1Ew7SA=T z)h3o3>^)>CK30xbNt9d1`;h>4+caONv(1-17+_LO9iL;`1aB)rYA*2`?%uo$y8KTr z99SqlRnqiMzYC@q3w#8k_LK~%;BQU4J+!cRdALA<@PCp2fen=)EC&Umi@88&S!65G zCeC*+Gw013UAw+s9z9$oXQV6UGi#WUw*MVF{Uz&pfKb7!Q5 z3@6plM8SujO$@+0T6BUfQt*0a*RVDeBxX})?mNtNf98t=zhZmoP1a$V2ts!WNbs>} zbu|z*sd{p%m>c_y`kVwncE|*;P%)J+);se7^@+>;ZtPX%uJNwiixL$q{rcH*fi862WcVvYo-h6V4}jW?oIU$C-ZqYyEJ+0b@Wih;N;5ExFx; zhO}4hH#M=`VOkue3o@s~BLzytyNDm={GWR_P;dK)bLdu)*hEVWc2I%5#w4ut;1`&% z5N2VK!$&`VtNGGyB<{9$nh;1X5HL-XM|P4!sR@uq#Acc20as^*2M}>fEN}@7$lw~q z+!;chjl<#qdDi6g0}r#BXYsF-$NasnwWe*}`eR;6sqcnTYA6mljzYr|5!6$$F%=J^ z+94;gwd7R?^nvI1?RTk{`0dQKF@$jp}N4d|*_80j6bzvV%35Bn&AK0T`?+ z$O+~npIkK<=n($mk#izxoeBU=iJJ`izkia%Dv9Hv-1@Nz;xgch2Y1IO4X>(kv%EU= zy0iZGJF(-h)fm9nDvVlXcKfJBD2TcHq6}^R@~ED&-FZUAAKx+Y;W10|=<62E^fb85 z8}AP<3<;C<(`Mvo!#;OvLzh2e%O$1v?LauMF+h+2{iS~#GwF$>xwaH5o zM%0wFj7=CDG`e(pUyVv#JcvT_05MN7xR{10mFHse60yj_p&_ym;_L0QWx_3(KVvfE z&7(}&7W&dwIiUFQ zvfJlzq%NGxt}u4fU3iwxx&~OA8cBUsmpwA^>ikR&KTVL1N`I_Or2E5gHgKa& z^*K|{QH&VgBbGs!wF4YL39WBH4VOfw70{3uHCk^yXgb4%>wQE^J4nPFr> z6>sYJ>kbmiNFnqP(1LbbPd?;wK*p2Gmny+Rk}NwvfoS{F4E_)@tbs^6Hu&3A+zmcpvRi@SmnBVVel0%L#^e^(bV! z>qiK_hm(DXlau|uU`xu;RrUWHs5=UI&#SnCH?^!Xuzscutua$b!hq#Lc0*=Kp7Xru ziJPKEvs~MbiFl7yUcrl6*Pp98LPj35${B4K-+fq5ZA2aa>9G>E%7s!e5AVe#L%y7O#+bQTnQOI^lC{Ls{7Elb_Ki0#m;PwKLK7^-SzIA0G z_n>vpS2?)98T}&gHlg+j{I~J&H;WH-f`Nm*ySAOpjV#ea+L&5N1I=`8fP+y zjGw^3MLGMjlfq6sk*U!piA}M+HzpOfU!1Hvf$I>B?5z0EK_%T%2H!ND6E-zmK$g$I z5KO70lp@5q#kGJJ!&_a4|NaT{YPdMPV82A@iHWE!BD~p%hg|P@)-R&hZRu#1kV_=$ z*^2h5`|1ib`EmT0>~f3()oN38vhJtTw~OJ%f$%s;(r> zp?=&4-J>mi6ABucl=tYrxkNiVL}@{8oYAj0$69F@-db-ctGdSdIX_P@+w0ke!YtM{ z2OU^UHdQn?H72&v$}iwneVU`|`X+~r9025QvbW%SaG8gVR`JJoP}EWkxb>l-r?^e$ z@El>Di|B}xCg(Jt_bUsUOYcgTx80()#w;93$Cb*b4JHiXYLMJH!=f(|;U+Qaf-B|G z_Wn$=%%49&IyNnbAe^cG)MOtXRoAl9**?qn4!)y^RLugfD`yJfp_w;1YE8zGPgM`? z*KaMn7?}PRv$07R#+$+|DWo-l?Mfyv;9ic`IGXY;MH^YlkI%lN`jxGwD~7L9)M-^- z)zjCuMak)!GamO-fCaIHF?%OBZz}=FDk-x^?sotC*jBqG3HG=-iRnyHRR6p zW|LL#mNa$nP2Qm8TdQP+Hkn!P7Ai(VhjPG)ZVEh)yf=a164lBVRWtT~5WaioxA>?V zk?#H(Fk&P^t%*WbuDBE(o6DcQW$rpS)VIPAHz(zzE8kCLz`Px-BdslTp?s#3oakZR zFcSQzK&-)X622uMs2G=rk-Kds;mcvi_vOn&r3abGTGVZW8n#g>XWp;YfG%VSGHZvw z=MLh*M}IZf|7?NB!wKaUTPnq$>mQn(Yqo}-D_SK7^WIk;x6&a z)~!;yUrj>mCbVC-NA6Hj&ST+@I-m?Je@f9^hCe}6$P@ikSG^xvr^k-WM)yGKWzGTQ za$43eI6nV?oatw|&ktSgI)p!JQWWK+WuzIC;FOddo!N~jQ?Hx<_3=}X*&=_PM7wom z16Ih+h4~OK^og5^Lll80)Yx=~2d*JMM4=9K+HI4s>1^>+>{WbAG|VD_aVxYIX7mj= zXRk{yIZB!zLYgwQo|9<^`lq2ZV`!9GmpgAh9q3QU|Kd#ph;qnMabsOZfJ~CGGHXV5 zT8YMNi7xX`wy;won9;Y@&BC5L0#nQ^%Bs&@YXO-}PKNjInXKE#YtADJFnNx>d>7dl zbZtP&k7<*v?-remIzG9gC87JQB8?Bczsk>VQXa79>pjh|j}D2qVkTp;&gjZ!qqIND zYa6S?)QoiB%%YSVuMh_3w3bN?@`(XYRC*-}pVAU&N+J>wuq|B!e_cjtxwRDD!m|;^ z>mK>2`94{$i};j$+ve@;)3yoF->bhKyrGS|?`625rjn%aC65mSzXSa=R=W;KcW2pS zbIk`bjD1pXI=?dNc2m5>KMLqKSf=CHf!qPpc(Hz+shMQSJ{HZQhZwSEIj*A+mD6$}imYEqGa(T?*+SK|?KL_|vtNU5wgD==`QEvHZ zR_A=oCJeab{1WQ%UDX*I*ApBetOi$9Z?wB*do??Oo(p6%-q;=$b8^@`%Xuyp5Z>Ro z>NRqIX^B&C`D&EA|0+&q@KWV&>|+i-MjiKGGxqBHNxSNW-;3QQdR9tyR8|rdI|E)$ z`~u8#V~0#926K%Qclr*s#)NY|S5E{=xnpa#Xd#Qdn8pVx(e%{Ov|(5*k~odAv5RJh z$U>chQ)7{ogqQrj!eb-ZM4suEc1Z?7WxV1pi19K%)D66th~I#_lyZZ z@C{06i@c8XEc<>DF0oCrLm%eD2RehEf7?wo2 z^$b)do~6C`A;{$_t5u2|+zu<{n#ZMKzzB*{Vc7}A_CY$@4w4`BrxXFPKgb>HhF71AF|uu)FU}% zmrH`AF>&RtIa3I!5XoFLo_ZM@2Z$(aA0(H=@3~TgPjSCljR9q1-Dp}sm5=uL?f4%- zx&Fdp&={pY^4SgQoL+X{*;D2ho4mFtTP@zqFX=}Hy_(tC@h(JxunM0FQ{iHhJ-WA! zGpP34-LTJOv78SEK|e$EXim6iIakfwK=u@eulh?C3ubp%zaMf(`aan)!q_Wha>%k8 z*rX6Ybfh4Bsiddv(tsIBC?-OL8UGTAW{UJmDGb8^*x1jc922m9|p>dj+ zNs4nnOh=0I@8y!Z*&+|;uDg!CRrWZ3;JgpOj`l5eH5*&=nnXfWYLs|FzPs`P6hNKn zk92L-i)Jp@^E(fH@&R0DPR9(6{2sLZo~l!GZ&I^6dz460t448?yI#GK3!^vDKC9}L z0wAfw^w={WS0h;4RY`fSEDEbJ#?=LGMErcPbI3pkMM7yHTl%4e3P3jvoe=c4tTHOC zP4DVup|+QHY73C*U6zr!3nY{!mZkSr#!NW+QJ~R^(R@8QYq*@@M_Hl$uil%d#wd)7}$(6dX>z_0g{>XPm~ z(#P+quTBhHg(WDs?7*5No{`mlijwvTw{%>Uqrnz7o(gqmD(ZnkZxV32tfBLC7Qrc; zo;7h;ZPZ!mUQ0{0Y@Hs@3;Xn>6^qBmzv{GT5(+Pg@XKgUmJPXZyR`5&-+XC&tz9a+ zY%n7VvZG7U`KV907`HuLZHY3?@b`^$C0cGxRY*g-5Xz1N-M^@!G8QBo3tx-&9snN7 zvb>{-NgZ?13N&4b2EILteBi-UBj6pYKXL=(-7ov(_J-QO>P++4N3z=lhEV!Y7bU3& zYU>lN*$&{(Xj-uV0iQ2Z>Z2#gtE1$519;#Y_ZzVV?`P5tp3WivkCGSrT^Wg^KJVpQBuEM2RF{ z-T*=X`@vXeis6CBk&xM%3a9$=w+FZ%Td?_ii~>f~bPoUdK0TxJncwVtSRy z+oO>m-9oHfF{%_M=x$0_wIi>~li!@zxgT)@j_8Q7oFwlU+A9gbDF`CH?|whV%aJlu z`|xooDV|%eomiEA%OP)my7D9{@^QW4qX3KYZwcP(vA;GR5Pe#C0WQ0UHQnH~G##~d z*AoG6-WuhkPx~EWy!DG7dbtIsXGS6S)k5Mfo#8>C^;=;lVuyhjL`y0?+O_ZVOk3^^ zqhx1;zQqizLe_qcE*zrMx`WLeM_BMFe=sJZ7I=U4P)~UHsuEVV&XOSV;g>+AOjX!eRWHG>2?3^%(Y!4X{@7tM(dx~Zss{=ek? z_&YD}P)ZF5#*NhFM2QLoa+{;3uwL2>IL?T+eTbQk4g6=<>1RaPnY{Iy%8FKXV@U2o z%`r|s^d??;O)BGE#WWT6Hj$c;8VhwJIe`v*pO-Ns&Z2I=aIB7U6-G}NwMRqDL6Dk8 z)&Ws65VNPc=@&+4ayqcixtYew;1j>J(ons`)Kh~dsUj>nUEiAiTZ%=VhQ(ef)Q0Z*;cCXddtUqYys(4{*nP{Oz*m^=x3I z-ruPjI!Dx#>VM%K{(p-@S?+ebNW48;yvHs}Xp?Bj9$I(Z0=Ii?CKk9&xl%n}wd2D! zrak9~1Nvw+QKZ(OoijW!j{wM6{H*%Ot^#Csf)ez-KqV+qi@C?cq9X84-Ab5%HanRp zIiJrAr;0_R>aE)N38NAPJ9Gw3#WTjjb72d2o=m+G9>3U=T`og?HM;C)aXwwkwDOpZ z9KNY7<)<%Im}>L+z{N9Xkz}p5Nrv}i%cDr~x9Po&AbzY|x2Ug>#v2aGz&w8Qeg8>Q zx%=(*xjN1IeKHHD+4R*J(l71*0~GAsW1km%S6uWjp|`C5AK{;f$lkBPf%6k8HUZEs ztT!Nas-I!ExDBJ{Yx_?F2fmr{4m--Le5lIFzqYBzh;|U%5$`EfU zhVXKip;NQEkXXrq%HI!IiW0?klUQB`evxtm>2$GK&?r7L98q-6zhTE-a3YAcJqZ#Y z(5a>R`9e&wxGiIGy~E)p6I0&(wEK?koP&C&iGn&I+Qn*Ibgn+x&w_ddmC4LAL=sAQ zUl+LckZ+e0h(d+HaPcYi$Myhe-JvFP6!byA7s!;Z5?y04u#jjYohJ)WN};W8Zq?BtwLA)Bz@#`bUC)uF zv*juk>FOaA6}XCWp-yP$Po$KjQJ+r~A&gDLxt9k%+fquo&swu}c~o00JefxYx3i6p zj;fXUT;m70alk}>W+a9N^{_y~8V+}|8d)raYUbMC(WzmzmTrkUy0=A@11`F7^+7zwB9{9AX`!Z&@;G@RY4l2 z*WJY*pRkc3YZ7*KBfHIT@SF6odO9t0o`3#`g+qQ${4qK>TdS#QHrlD0nHg)8ypq$eI4#~HQ_fH- zP0#U+#av>SKRPrF6z^rZh$7_+PNZQH6zswgilefo1toL}H@dy4ZVzL?C@w!H&+%rT zf#Aae>AVUiBtyoxe1SfDmf$@zePQu!(5zLr;&YeoJvaNN(C8HiBYgTmDOrV_${=r+ zicZ?9YXrgluH3FiaK)xY-62&W0Wz@czJxTpC~z(E?i zOoc)zrf76_-tSb-hIs_RKGVmjw^CGXWJW|@*(qsrKNIsQ&^ zaf9(MWzD8;_wG5{*V=ExVy`VT3HT+wPy<>1aZwo|HYQ2p=GO4_w9@YD8!$>SS#lvC zs!+(Ls0+m{m^npE@o%G~c0;F=iG`PA4fIQbrtAX*yfbbPZynUtYfwbBFa1GDNmA2S zR%#HECA^jJRC($Wm4+3_BnrFj0(XHiSCmNSp)C@w{rh60hMNJgetmJ^|nJRKJe_@=k3 zmd*$MRCr>|aF|EuF|#iiiHoWCx%;aikx4JEQbbEY@f~d8kJY#5z>?F@4co8zE`J+1 ze$diz&DYESR(kc4@?V?tQXG8iKyDHwRMp+hBmf&wWldYjN+M^Jpwn^MBW4<8^BXW) zdL@E=#diKV0Kqr5sOE0q=V&PWfL%f_G~|GWkW9D`$OAqj3>BgBMBo+=W#AxQu=@*zi3Jx7 z9!+a_+qn2bnJ7$m`Rv%(`?Bcvjb$apjXA0^I_Hi-RlmQ{5!lI$_Sehq-wCSyl+z%i z)auYc8>D0u@4MG$YC3Bop>n0#;|U3_ObHR~N11GwfCT_yB@hb^7WE@H97~jLvY5!6 zcJ%|a!B>qQ6?>(FW;Dj@ThirBYbYxRKVQ7C>vz6Km6Fg!-D`TWBdfZR6KOcz@A8k+ z`JZV;{5-C!t1SXeBuQ7H0(T#;y8UeuA=d)Jh`*;&#t#0~+6^y19V#omDt3GXQ=QWM zBJC(Q+fcrKK7JhCt=gCYj(?^t{Z(rzP7o1ZDo+jbVRx76$H^h7&x33`h+6 z(et&)RLvmn<5_P8*JbZ3rn&$Cee6xndn@xNMIIHj2X;TdsBPUMEc>k<>%EpHjM6ZH zH~c@xl|1FFI`%jw+&CPS&oS0#N(yVHXUSG77cO;-#oo2k*TU&MfI7=8EIgPPA!;^v z+_`zBM_LRR>qx_xZ=P~^_@6)^T0QlMw_jQP=TW$c0elw$qV4wsS|tA(Rrb1RQI30c zBQC|kNG)3_E|-ZPZc`zUoslfW#kt$F@yI-@zxyWtCc3`luqDDp0X=@rt2}Nd z$RT#`3u_8XWr(C!*(i#*&V*7{_+|>#V%^@5Gx(EGrptrQ6h`W$f9X5RN`){!O_4jb z5~opE9*Qjfntt0&eY997?McPvXfm&6Q!5UKySlr?SN#u2k_ON;Uz+*IoqmFf571

W}f0fGbOLRP$hr*S_Y6ToD_%=*t}r5q)iG8FB@=hsiDA!M0@Rcp8G3%Z|!v z(Un}_iQF(C#%EKN$=|rq6w{^_Z{($?W!B`!MIN(Q00Dr2DRs zjl?TmbcVYtEO4E#p+;JB?_)2K&TiZUv*sdx!KsJb?d5HMO82l`lk+=q(D|cflIyG_ zn%U$Nu^&jE@iB-#5ZSi`0S~c}DbjWm;bC zCtgtwL;xnyBRc1sqq40VS3v4%mpG0H#`>tt^OXMsZu{LulIuUCK3OL@M*~f5&8DYB znHi%GEpGYg5LX8IDwV#{XO0vUju2}nT+fg@y@k!W)*7Z!fAfXs>ks9fL- z6~@9fs%_(#RX|XF&>4rXZ2xZ=03stNBhv(sT;lC5qP7fkHKuY=1i23#CN2}4)a^VO zhzU-N#%Lf%nq9vu(@*6wWjC^nKd>JefrB9T2kj#w@S*ZJ%L8&}8GE0XX0}a)_uUv! zpf1qSkkxks*Azd8eSjg@UGdy?hHM1WY$#@cds@7YqZs-_z0sNzmp` zS^;#et_Bc7`+pGJ@2?5{jr;Qz?MQMWvt#<#{LQAXS zQ;0bzt%Aq)jXrIPfSHWp8~*dyhdSRNVG@{%aDh)O)%*ZjM+9B!%FtU#^a{uvLH`s2 zns?ORKm<^Vx(sbd%pvRyS<#qEMhrt&=|^3_<`?F}Q^F8+0v29qcj)fRYHni-C8 zOSH`=X2Q?gxFJ@j66E7?zk>r9^VndOa^`*<6?xEl^DoP4O2IQ)AvRG9OL6GL97RnR zOc8y*LZPDj1Pi)V=`6x&Nn^fLj0v)mLQso`Jn>F1?c)8!{Wc-=od<{licfx~d{%yJ zR{R-ZU|dgZcxItp46qa@UlFV?$s6N57P=1^)G`qoX4ya}cbUC*SP^LM?56)z)tJ5& zm)Mf}M9891MQSi#%TQ4GFiJuPrPL1-=%g5_e_x{ERhrMBrO}QNElbZ3&-*lzE_+k^dSB@(>BiE!&rzYT#k043Yzwmja!laP z%G>wxDZJ-Kfj|RfeWIX9LUbuOn4tePhp!q66Ckv}DJb*2)oDMVBh zYs6}ms$I7M7Mq#Nl+f}v#2=D5aB?o8R9`GG9lvfI13fGnN2!2!2 zv4M_1dih2z4Y85(A0>=yQpG*042{-QetOxwwmb|;^(lFR?WAN%U@qKS+Nsw};D_Lo zIQFZG&1dLwkMJ}m_vkyDzucO$oDbm{{ncjO)G4u?(L%@W`$OYB&qCk#4!hgeUUOY5 zgk^3xCM$l2tua*DONQaG$k$YdA=VdWK>|5O z5J1L+wE8yNeJ~g+<@7-PLnLmmIrRDQ)no0cyN7?Oy3f>^1Pf3JQDQSF zRXF^9U03QcB#A`>P>-O;JsH~*P+$d7+^X#Pai=}Tv*T($eYm#EwC0a$tl|B<5^UVC z`AhRx@&`XNd*0kn%A+1zh<7_zzGHmwXFUbB9sIE<#Qu8DF|zPqyvxd&bu;)7fm-2+B-vy!UC|C<*AeMw6?Hxn z-J;K(QC^my6t?lRw5&3?mV=&aO-PjhY$J9ph80Rt^*k#VJW1=d7GE^E)wjHF50V`6Eo-{uC4}hL;w61AxsA#s@kL&`0^^9i(tJ-@WG+x4@ z7mR9^zGfCei3lwWv@|K$!YWtD0Gne~-U(jWqS0C)FKNmRjUainkb(%2(Ip6lk;Hyh z&yL0R`ST7Q>aE8~FK+q%T&1wAU%4>tI{(G0+eNQ<)6JvS_@Tu6gNV4=P@bf~*8_j7 z;a`^drtXB?beu3=7FHYA)CpNVdbPBk@3k=6YEz`cX32<4GMZ`L-_(3#_|jqDVZSif zbc@=#wr$2Q(bnW55|}X>`4A2iLX8)5*LvuWnL%QaX)MXgI{Ijy%rQZMPKHmn%L3o7 zYfd6!jNlJ%pwQZeq(Jx@N(p@#=a1K|zj&+08g6)7m)o6kZ@%@!>S}Ry1@ro;rU%wL412g#xz$jc$n1xR zf3Qe3LpgBU-WQ!uYkf4>yT1@oFUg{C4E7V3dB(H zHS3zX2uHnTIX7^}+UG;F`GS*si3!}Kn_*(NabN^?$$Oc;_KRR3*j0e)CPTo;pW)4F zd&HrlTK6Wz$vISm1Gp-Km*ll`sNIc=t^> z&*J(7@)fi6$AV%OMH8X~WS9vjnT3E3*9g;sZ*uv!oSK@4PYu)ue)lrgIJ@}oBnJY_ znc9OoQc{>LDMX3B2uv(&5CRgRXX1y+Hj^-{+<_!v#6HRty z276`d5Zz**PAwOeZ|fVn+(#ufb>HfCUWbG#C4JI z7y_M032`Vtx&{z1GZZ_O2&PHZ#`4G}mqU^DS?m4Cg|5)3V=ruuiEfN|5dc*F^4$;f zPdDa1#L_&17tdo>o-Q~J-s}2#ukT@m^=4ReZY0ySmq3P+!I(J;U)PT0$Pt7G5Z1z3 z;>LVlnfUT6ydP*PP3T}}w&a3=(JzE>`z^wJH!U8Kodj9m<;rzD+RB+WnV@6tat5yQ zvX!!$z$bu&f&G-=L332BVey}AZ8{|mlS^HAc|4vUDwf-xXyU^!9}kJa`wC|`I9PHs z(riy#M;1kHJxMCqfa#D89x_S6OB?hk_>T|uEi;O>j9lGZpbA5D3*}fg*Qa2C+OR`zZ z=6i}CojiVbtJFM{hs7a(i0hS>R9>>5nS3GO_`cQ#SM&V214fEcxms%8J#;*&e7$>R z_u^6doNS!X?L`JO`bbJ~m91|LB2*+JIoX7VU0cBzdmAT3`4FB=6a8v|tbGL= z50;oI$Pvw17DZA5#LPu~<4Z}7%g=P_NtUjFp#ZspjxPiWS+PF_4L#QD0h<1=zN=AjkcIf!) zu&3MLE?BKKje-_DnhcZTT>kzU>3muhv3WZS$@vu$4Kjh0BS5a9#1^N7u&16JuqaHL z{us%S&kxJSk0DV6Wi$m6Jj&1=pUwfpzy=cgf8-!GP2_5+wn6Z8I6PVzyu{g$*woMM zwl)l4?aKxni_Vj!E4~Wzr!F z!#JXeq+=jE?J%)RXB1JePK`?$xr-P`iRYD8rYF&2)JZ_+YZdVaqFq~xXbMPslsR2I zFN(>TldjSE>&Ot?ti@UU|6m8?&pW1Xpd7CjLV zJ>bV`(~xIwi8Kqf(n)Bum>Tmik#wR;>h0_=KX_;E`mCs3eW2Ta%#YY4scrFfh*sCC z%MXo}TdrK@re>B}4O@whPSw~oN;L3c_YXMm`cs@>;wQ;ACot%bw)C*Jc5E#1^Rjy{ z=kZ~~BP8j^)1%g6HU0jomyccsoM8FIi^cK|8vVkUoI$=cLKI5kUiGEhAEO(T$*j}d zFvfkA3~h|#57px`B6;|1dA?{lTrWA=p85rQNioBLlC9$uw%*$lhO@TY)Bg8S774olpsOhp~_Q0UUR zmgFO5DjFJ4$;lW2~w)_kDq- zC#xj8(!=2g{eMS3Lc_x>B`*SEF~x&bh6@MZU+k#wwH>bsd!)iN?$Hb*J`C2)5W|c= z*Lq)i#jeynNuK!_5`7sT;e7`{T{u*`A^;dteUA?kw{cM0awThAZA^zh^Kh9MgjCRL z^a&rheTw~^+5wLi-PMM)9>h&b+CFBS^e-f9y-M84gJ7qn;G&Xev3-!eAh{OpD%g*8}cU*038<97;}GVS>2=6PqF-z)Sg z=RNEitS}uP8mv-u1^)UQF?3&SMtG-eF73?ZPUm`MpDXQ6+Qj(2+_}=KwbnXZk@zTj zsao7rE_T2z2wCXTT7oUyR3=-l7_I|v`m2BSI`|u#Fuh1Zi3V3i#@PL-MTjv-6h~BS@?{JuPb)%`w&0a8K-=|2ZLQDiG_uLOt$#SK=Or4gra z;JH`dQ?h$g(Qn3>>}>Balc;;-)R&ioGZ`;Olej&%_x=Mo2zr(NXiP7iM&xVnrMbm{ zoMdR^dyt=xw4Up6>&x|K(ws+hjJ2flOB2t7Bji+no3oDsz|~ zzb@XG(HnquM#*Lz1q`HpgK->XzGP>(;u*Il;da8x;_@$0uU~vn8j0g|H8eCd;@0&b nij^Cq3VRQ?y0)cuZyq00T_z13bFtg7ytm~?E$>50Hgp2@bC!ma0m$S z2#AOXh{)*gkdcs(F;US_&~Y$vaj-G5vGG2V5#iyJ;$veI(GZi8Q&3S+;S$m^&{8sx zQBqO<1A#$AL_|hH#(4J*gAxxLkMjR_d+h;WBE#mv{Dyy zZ@K@~VBipuVBryv-@TEEVE%jif5@aA^euL% z&6F_lHSJ()xT1`t{*27=#*BFZm!!UGsYACdlhhQe|Ib{mANV&XYnD%lm>`rZqb;$E z2Pbl(V|>Kx#`Es`VSV%3(KA+KAv9N_JO|2$_Wv(-lo#RnXo>Ok$y5u!Ir*0oHZ4b^ z_|{SH(PFOIZKZ*M=9c*^UURki3l9i&K6M-4O4@4H{|q4+480_^_ZEy?NVSlX;1|rm z6BQtQ@bJtM+)^AT6KNXtCfu?r;%4W?ZL+A)lyaRE869<{`JXVlFV@*|igvPT_GN#? z7rHun3uZcJ6c?XdY?%0MZ=dhiM)QV&wAklBx^U*SQpxl4){PE17rQO=|07ChO07-h zVW|1VNoE0UOL&>faPYRZR59`K#5cWA^aeE%c3$r2y~#CBGf;$?8ADh5vfzY^sn_ND zpsSXu}u0gID^N&M~`vC%E>r>XiF)n^UM4vU<4v}cd#xZ)i*>c_lFFq zP!KQ{O8Q{(2=RthFRADK%SMah|GPk-J}G?pZMht`3&-t>3704cn&QxUD9coQtJk7H z4_y`0#I*Ndq1WvM3rKOkzJ(=mK}?hjOhj1QOA)`^r}0x(IXYS)rJk{Vy}i}qzlkS% zX}$!KOE3Svx;bidIqzO6KooIanHFxi1CXDFs^Pn3WnA$I?L{2|^|WfsyxgI1Y%ynp z8mLShwKH&-4APt&v&pBVHM?z{>i;)lcZh52cSKV*M~&9R7vE${utAJeN*5t*kE1S} zMzx-0j`q6QH3#&DOsKQmow@nJ8Z5Di3LMaNRCJ6R8tVJ>MGITEZFy`^Ydz~G?>~@8 zoK*UiIPb(y&oA-R2 z{t3KcA%}^Z+%M<-T(-0>5+A*+8T21Gxms^2XSMiC{0=I#oN=#)nlKVhRwyxKwRzWiS)3*sa?_-o7-hQvU@&8G%ni-U zep+!S2Ys`04w~csaxLWV{fxe~@Z~>%W{gk3As6kQVYh5U!b*bOq)rJ=7t{WPNum|?K=!+Q0nOx*3DV8(t7PkNq%Fsl=LX!MqT%; zq*P(*o9!@VZ3vh(85AVP$K9vx?VauYQ8i!*kKs8mX<5nx0MOyR--as?E|^ly?@n9| zU1a(CT|#%wwHP(*;lCTB0yi3>pV_!+has|>MMcqD>354e&D>CWo&@M!>y6_7sCUj5RMulfxos}!q0dOC!fYmO1 zS5I?KjV#IML@B>U4pzfV|2M=`R@%g!;RDr*n9qpzcORy`E~Q26kdyrqL)9w7eav`Bm)or_5DJDl`)0icn(?|NTcdAS8WsX2V>)ru|H%{pa0 zu=+73RvG4&(B7tBot8DS<;dJB=6XpSKELs_v7eDrcI#Z$wmDEoWu3#|>>K&nPHD@m zebEr}po6yc>pSSmFgy%^0TwF^6*Pn}o3-jRBT@svjB0-cL@OT!KZ&^tU$gf&`}=wF z5!a4}l^Bf8W?xhVMZhA_&1_wEoxTFHO*h5@%Ws>Km{gW8_rBN-&Hv#VQ6ZF&F;OOCu9? zHFaG=_j9>yZu0AO2gh-M=s_Z$AqjX42^eQ-jPCpx)_UgcF4^mBsQB(+uJ>Vuh1RBT zgMgiHa?{}!r1W?k7~fTPzL&eVG3s!-yD_udMRp7hqYue7A$5QG`4lqnV*PA2cHvty z|M?l)gpYXn7FZz~o7-W{I+E?rkrA9GHD_@(AsHkv1q(eGNibK??`}@ZSBehf!zu6O zi|G=1s4q-7K!RiAH`j_}${l-FZ8C8^Nw0sr^fhob*x66e>#BaDaeAm8T+4+9f|Z5I z4AX=eGeKTivngKIMOSOu{j+m@ue=&Rpqq~t&04+qchh6vs;s{`)|Hq;Cd9#8-QR)d$TkwtmA)b(z`K=r zbbsvq>|bRZ7IGrlnkSm$iFo;U800Vi%hGC@zhfkY*l1}xE8YGiF*T8r0NKp!Q(8GC z3b(GbR284s)z$ppl`l-Iz;C=#JNvNrqHXxlHl}^=R-$Mp5^eA+K<-{aZCA{IyiTOV zm5wszdEzpn{#uOo@kQ%dcli9l%a|?@5aI6>+Oxf1+vzl`z0IPq^x^8F$w!U8NUv-p zb=s>gY6-6xI%Zvs9-28{^sW7JI}{|$U~K@_6sM;wMWojM>oy3ARqCy>YWr$rHYd=w zZc=lae30#ZYw6F%=cE-qgVkOxHvJ-MdOxu+I#fI@Y#h$;q3dpW@RlsQxhwY-Al=w0 zHyP!o$d1f6eHU+1_vdcI9TcPOKUpouvag?mLt8pYTXH_)K;F~HUBGFUgnCe&$q#7FtF`+djWCT)_dWy|px2`xr#I4( zEo>g#J>P>kq796~adQvEs7SW1SlOTf-(0<899Boo1lD7zgxjuLt|Zwi46mi0iNPeh zqlbnEvhSPl9-@P>nUG9*9+^)Pvojuko2AiG>avGWGD?Afg>=aC2LjQrFbB6rpzuZ8RUhPMc?rQ7 z{^b4^dNbn_^M38F+?A2o3?AGmS|#~q_}dGo0bz`dM(uUBg;X+ zHv!$#0}xiVOnhzf=sh54)jRLEYSc34Y^+~hc`{d=!eMBwhrTo7>S}282@_LYp6R2a zi~~K0$I-IA)km(=w-G)-_lVE z0}w&}sS{M+khW{mewY)DBr1G3ep}9TCK>`x5!FqtPFx_cV}YFv!tL671#k#I4IX$3 zS^(e@3k?+pxmqAQp8C&XqT87sT0e%P?a`4rjYz0t)nVI44GG`wb!0^fdJOxEetr8Z z=Ps?=flu5Tt4D&yZk>LuY<7%QOCI$qpF}%bxgy6#7pdrv49F!FM0$__#Z~D zwmD&9ZBYY5Cxw)z>X`sD8*J!U5K3FNoh>Ggw6^q{(;!iJ;chtGk?m8`C;_PAuxVeR z!z+I}ovPimy=tF{ByBN7!O%becPZR^-|mQMHMN6b!!W+G@e%&?Z@(uw7n`?B$gUz> zHqcM6o7O05njwc#b8S(i1O&5EB9jNpwroR3O%&$c_e7WAF~YaSw=^p##d02)EM5Ty zkPhKSR@a)MJaxr?)|DGzeof>%G7X=HOsiAnY5J@tXL?Kd_$*H3J)(~%V@P4OjyZi6a0&T?x)FLGwd6nI+YuLnCsGrKXWm%KfpOz zE8Y(>ecR#gr-=iP+aMsh29|EU-}Cwx|E%JNtisD|8>_`@wg@iGcG`=Fm+f zLbEz=NhM584vg-L*X zx-Z6M7GQn#XgKnbjZUjJLsI&Eu43rHJyfAT89CX+wY@ysfO?=fMfV}`E(v_NAdFg0 z3@SlkfdRZzK&A-pHLKqb4{*wJ%Q+zj5Mqj(ofYkQx5{3eR(MjWGd#*UKC#kDOCy~r6YHS% zHQ+U$(fobwx+en6dwFdo@pxQRlzqx)4#-46%|3NT5DIxA(g#s%tw>5Ss>M#yOHz-q zha3eJtC3D z*rgD+(am>&-r#`9BAc z&SD9dL^7A|T*nIc>-ct^3EA+*B3JQa`UBofXbM4nkG?q43S7RdTlsEIPQcFAQz+jC! zfSanxSn&hL=H9@;RZLbkkJkcw6k>9-#WoJ!rGrdxQ?Ai}Vy84nl3dXdW^Ur)fnS%N z)o^GRl;L#3Y2|Vzwz|Hzem|=A#i!_DoNfA2tZYUo8G*qo1Fw^f!zToxWQLdY_gnPk za`z#77VOIo25}0Oi0@^8+{-+yz&K>F^(Vsflz)>2FpSb)W**KaJN|(*Bamug`pieD zZ6a`?w|W6Ri+It~W}!Z2q9mo~+P<%9D9SFUlcCectkrppHK3)z^DPL8gPx!8l$o0Y z!_C>D0%+;Fw6wV7>num0`Ib7BH+UR)p8OA)h+!l31O}tykoL#knEO_@hd(ci2d5%h zQA&&g#N`n?Cpl%a-!_N2OKQE&_MNU$O5S2eq%eVla$}r+e2t7A5(2EcCSEM~HpEFv=x1n2p~9>RMv_F%NKn}ndI>Q(FWB#sMe<>RDHOc~KDZRdocYk7!kF`x4K#xrSW<0C-5YJxcoj5=^d3;i_hevs_JE`^uBCJ%y zoFY$Vlh#7}4FHh$CcXIwb&5+x{-q{F`^8zfY-{o`9e>R|{rRQ>BI`-$wrqhey{hk@ z(de9n;}{4)n(9~9^+fTEk`_u2S78(rMo5_oSb_EYSlDqq2>>Jh2H5vy=mWQ0P`USn zo>4o>2|@2BCak(M8uen6_zmK@<2=Tyt`~&VJ)CE@U2ywM*my!mp)zU-tgnkGMJ3J< z1od>!#Q&E>0RT{7Q2+oqje3dk*hJZ=CKH~eLO!HFmm%B&%IRThj{d35?}&#k^;m4H zs9yn^mxmdAd?PKbVbG`4>kLNBRK{veY*5dhE_T$ql!im*jaUA5tpD)}u40Ts$TsovTEmsFJ@Hn|;ZT>d60eb5^mEDAY*R1bRj;@%3% zu$oFArPfG}qADoLsY^>pTOgu8s)5QwqxF~TGJ3U#3qiVwKfji#p2)k$O6{7|3W;GvIlMb(g1G=|A5}|03bf707HMV z+`!;gSLu1sucpEc@10Xj6%|Lrh>euq6}U;gKE~kGOX>!;m;k016P@#I?-yXg2*H* zO9B!Bb$ASUnSVIlecj#mHWn5ZpXPbcorjr*B8X?yrv(ZS>+EAkGiYe=?Dce8ui2;> zma2N(pj-Bfp*mB2&PK#WTU7jeBf-ezA(Y4z;a`Im7l(#^RoP`&g->u($+%T0&+@2z zPP5A(R1x@6k2%U4)9=aDkeyiRrc(dO-y~EH33Y6Ne`rjLLM2U{149ZM6IEFmabO@s z#rd1jr+Kie(I*QF2O@S12@uDx2ft-rbDKq8q|i_~p~Xhk1KZ`ntv8hsNupqEe}~xHx|G^1N{jX(&hi;Kb38fsw((QGZJjVEj|$ ze}4aU0dF}eyrdy53K<-YPnAIkIO;!O-iE>`OaIfk_?!C%|IZlS%p3uLgYX}c%-g|( z@bBV&~GJ=9c`7E3V~?C#A_Ft#0-;{wIyOORcuWm$>S8%j$EnS3rfru~c9=ho-L_fmBFNd#;TI*-U?-fU3M< ztA#tXvZ+vs4);$r8Y|zUW*#tYmb&lZ&C9S}P8~d~Tbd!A?)5y_fpSrl!6c%?lsu6t z-<^w=-4*%DZmv;9@Wze?sIjJJ`{>;$)`6+)AivQy*rfd#M6Vd^)|y0ghw0k^g0q65<2fyZsL0X9FS5tbh|h3h9isp#=hqLLz6ggwR9r78J{APkuW(| zzHy^72(}1IWuyaDgTHibJkA?=+4#+~GF`DSxEHu-hEJO^YVLIC)>i10p(f@}3pZft z#`g)WH@=Me%((Mi?FQh7H*2Nmk~s&z1Zpj?w|$w<_Ezz?6?op0oefJqR4j#gWGtsu znjOF0NxdCOgxZbwn7U!v)&3GPx2`NPiZAp7@h{I#Xs+nQe5Y0`{vH! zDJ}aoxF?r#0dp}-tnWKabxz?c_7BJPAe0_-IPEO0I`ulQ00rC!&60@O_G!8` z#;1H|d8SY%pJA>d(cCXLUx>eEjM`hZuf*r*t`nnQRZLgwZL{dT0-CI=Ta#wWm)A2X zyfn0`GKH^N(%mha5az$H7=~UF?v#M~K6_I&DRzl<01u6s=2MgF-nhsZ(K?v&-5~zQ z`j-}mWYU!93W1K_3>jAwxAzNd+-Tf)t);2tC1Y(^(w zEZ>G6&vyu3Wa%*}_?8qgp367xbh#7`&LPmhtYK6EPlrom9P)2-_ZT(f+X zqF5(5qpLqpGVpL+ZPR0(!%>Xja+$F_WxiwGpB_$~sn4%o6F7RVcm;IHR5+VJ?3#cO zm&kt3lO+S&U*{ItZr;x?A7T#!$t{BTfCjQ1h;!|y>p2OP4XVN?6qN^safFu?7Zr~^ z%2I?KU&7^^I_S8=EvuiVSmo@rTV6IUb)Jl{^ziccr}Md18-62P+O;OEN#jNL^XwGV z)loN2&eP9&WT0bZA#vhjHY3dv&T-FQ^ZQ!%#?(1)@MaUM*v;8NQr=9i->}wauDJtP z+0^R(d9;{mK_&BvPXq21z<{^!_97{{5dp!xYv1WHl3cW|Ap zbb-BFT}`qD6irepo&<4!u^r?9rO(!rbg&XjmbeFm#tWC(Qh_;9Jkd|8tyNg%H@-qB zCr&H`7Mta673Ug6Ye`~uH<5~`%AUnqTflvJ5xd!f>6Ve}>DtY?=u_Ql#W$rHCKZp` zPw8HnXBdN)hSxS>Yj)@EM|(6_7V0&9&9Fn2Q(bO+q>~?pM`qA2sHDr1Q_H+01Q)^l@^|C|~v?a@D^sBAP3ov+KR7KGm)CE>ya%Fa=}z%#fOZ)RJm= zbaU9)#=ZS`k8h&o)2#TtuNSmB_%N%Bu;4@6KlMhS+QuNUCfaoM$~n8l51w`R9%g9R zhC5ONvu0Kim=#(*xEtfOw}c`_R{jh?>1ktj`4sWLC-#&nZkOS8=-2=@{0xc8K=o6D zA=K`7fGPe)oYG~}1D~&$!e~Wt*vMwtH5toMxdCgkgsQ;~0hKyn#3L(Z{gQD$hLV&-%hUiNi_$KK z^6B!@G{2FP!5d7C&Ah$-oY?-#sUQDX*yOrtV}l&xznnwo5r3@{l{BOn56i$atcmRS zIXsEWt*XsQ(fA~=eEqHQyCSfKTeV~%v>-FQg{qqpjXlKzlyIo>f&2912Xl$$Go+5{ z-ldG#2rq{T?lQLu*M9RAyCz)6WJi3+x`1j^i@tZYb&N!4;&rxbA_*e?(EaaMNc;RFqFw z)Ji}LF@ z{!W_}n-z+@yJgSFbi1Z6d+^tUY~cMG7dP@m>6#=f zy8g(K=O=(HF*nk@g>Kfy#e#24kUh$z9f!_MRwMn&c>F{n6D4c2`S zZG&839hJJXSx$yU<-J%a!CXg1X!^Iaxp>4$E_>vLzjXS>i)VCvIJ1kbJrq*Jp-CKd zbLA)j)V^*F=YpLtV4}7I$0cFBL%qivpXri_#HQ)gqQeNFYqg=y#b?dyqt)nV5(K{u zHmzCQJhVs_z@O4qu~IF5Lzub7cXOv``4*a6eRAj=l;y)-vp!6v`UgsN zxluyorQmW(FkTkCe(AJ?duseZxODel8OM+O%cZSgk@wn5z;rY`R|ot_mW9g?OfX!O z@{>LyXklTp*I9nOh&gei@}-vuI3dzHcR<>52Ah*FD^SfM>9@3>EwIS3VYc4U_u-MC z7b&rP`8oircH|WhsCd0u-A}h(w|k?rS@$v*s7Q0D8uv2GN{QkMR651WtAucG!D%L= z)k3ucl$SR9Qm7v47LSIb4#2cmdFTOLW|JS|2-&Z~-x6xbM67U(Ti>l(aO1^%5as)( z*b<$8*z28r)2Ez9p#*YXq`f4`~eq|5nUYpeUWN<)4n=t*o?Ffrj~21 zfL&yFOYo7)x-|zEZ^LfJnA(jLf0HtT=)Kz%59!UIXZ-cLH}qb z1)%zGx0wFR5@@QDl0q@*AxMR*S!gK=w{SG?fuseQ z5u@vlg9z^+GW)nrXcgD@3Ew=3pz}d`(Pi~2GPY&tqR4F-pZ&1O0(Dc4KEqnz_G#l~ zJKTK_!33(JH3cv?8M}=Oh4J*2XltktNzi5W`N&3gXTR76f22>P-x9J}&!9Rh`4*$( zTsmqIaftzxZgdp=I}9%6{RJ!kgQDrH#x>|MZ=qWRRl-E4DZ zfhU-`lcA*jF@KcWN>@%{Xl7ln-T9-XizYltSvBJPRQ;A~H((TRZO{fLrCkS|X65kD zebvW?<#acDbj=pJf|TW%1WvE*L=|y=IB46BiHQfAdBPElcZIE(P>SHqW zybHg-#<32B1`XwKXGnO5?(R*4#KhUhV}$0WffD{Y7|QzMap4W^+mO4id($b}tv z61^D~AgB+;F1Hhq&vZ)6OhbyVh8W|uD!HxznYvQg3EZrz=N?YEq&(dwW zlu<|Q>=t@T->f3Ykh!=t#~UqmIu7HfJ&D7q$$a{n8**66D1DWvsm=J+Q(<4aI)ArvrQ-t%3mqVnLh*T?rjBOOTB$>0(oF*rk z;e-N1YJI|CbyR(b@=doS!US`MuGADiNT~xZxHf)SD!=3Otx8*mO%%$xL0%s6k-p6@ zcGTAo$+0~EN1?r2Q#*LUgO}I%T?@f&fH}^+`W4^_dG{Asr!bxW(=DpIKMJ+UPsS0s zbEi1Aitgi))jsx6HScG&TdPf0SbC?OK7{V0-@Ngg->9InHmQ9Gn@5?gz2Ox3Iv=Mc z#f^LlWo0hh;RY}06xKasX|o0is)QJD)Yrf;qu^T6*L=ooO7S*5dC_gdC;bwtn zU5DBq1Cv;lfnMB4G6};<(XXH^K+wd>aI}Sg9*Qoo^zQXNcG3MdSeuipTBOb>dqiXF{8(R^fwY3(I+Ud&KRX{0lZ<^tz{% z&&^TBfo$AL-@G{wncn0aLU|}b0UC4x1)}@sJ%N+g&m)cse0SlX;5hzDCX~Tm7Z(u{M`gBIeMHE4^z~u?kanX|=c;})~*I1S%)r;v?rmiP>9k%~k1gi3wGwl{K zez{bggoIfX_q{MWF5mTA$Zw+H89mfS!s4WX;dH8~PPPyDGTCvp&F_*`=r(NYmoZAC zcps|N5|cTZ9sdRrAD;D!Vpq0hR=R#cyM5`>58YWn9sh) zIL^4>oQ_A7JdA%r=wbgOaT40FSO)FpPQ`SPUygEiz_9yRnota%omyvX6K!G$JnryN ziFcb*7tb|k=lLnjC8NZ{$~v;M!2*Mg{{E|SD;swR37z#CKFUm3f<%Njv9FZ?;avD_ zt;~*)*<{#N$(m9gt3Dh<2LC3lOBemI+ymMaa$0EyWkImYC#sRw>>Z+S+jQ%Rlz0}C z+Mnb|`-hnlx<4(e%eCZ0QNf+RvuNDo?nx{TrU8qST~0?D1jjdNoC8HH@1?uK5E06x zH~m!9d(xa2SflJlbP(+;S5ISFl+|bfG76)dXYHb-RnIh~uYeT74wGuVin)WAoBDgD z`PeJd(&yc~DDdAqLZ`opjlLtJ7KYvt{JwizDq^;$@x6U-e(2Bu2)8Y3YdW8@z;B~= zn?_sq*m#LKEb>p_WxTC$gK{u?c#oDSQ{yI0VW0j%c~(8z%h3yb7uqXeq(vP83#Ga$ z@5PbId>Ylb_T0M=ZM7c!4mFUBF(Nx5@IPv}`A88Q?slFS@!q*|+mjPVf_G6yFCJYN zKAwoZ$qUz5mJ86ES8)z0!Ef!WpUs+Ksc_(F7>buZwb`c^w_Ua*QE#hRa?H|-jbLOC zrSYKaac<}!{PI0%CL4N1p%w!2(9uj+l2QC`f?xY|+0EC!jJq_%-i~zf6bC3Zy2do3 zs35v63u<227_81Vh452uH=Zc*0$vh+&t!z8m|rco@MytM2)+qi>epbN#;Aebn_sla zqg0eqEZMCiwO`M8mTfzCUeA&@n-l^-WsbxjFwODZC#Cu9zjH#?!qGJapd^Cs{Uetc520OK+kE$w?3LB! z`V)~v{U+m8C~M_9WMEwn%~(fqw)6XYnsN-vg2H?VDPjU;L|x`Y>we&Z-A~&G*Mvk^ zhml;jC_vV%ghrHNN9sP%teo?%S~k6&QC>RfB$414I=07+tU`$4m|sEm7^CO;3Rruq z%0CPm(mY#&o5ZU1MV@{7UjeTG3dU)%s^q)aLz)1(hp$>D>`{iBD_;@Lyi<9XW%qG$ zl9`mBa_#2}KVl8IeKr5;uWp}& z*}an|MV+|*q1t>iw2^75AOUlge~5bg1Mznz8SIZUEN;5f5a`pWcd=8MsTtYz;h^;6x-`Y-3qTUd)K}#O7Z&bUY=Dx1OD2)xR_EBZ0ZwU?ArU z!FK7{aQcO*W~*&ig6h)P`yjhQKxHKP1yg=h%Sfk)a|p0l-QR&fMDH!p`9J% ztpnDucRqYe8(MRz|Mb)=%*fG!yI{E)rIkB8m(&+6BY0=~H{}XWiKN)d#~=>4V?b+G z9*#ezH*#g328`z=Q9~1AoL^~FZC|djiE#016B~5oTCeGB>2<@Y7v*c$%RJDxCye+D? z<6cob#B-5SkSD4o28ojA+$59eRdPyG50cKnd~xP(#c|i>mP2Xlv@;B8#1tn&F%YtL z6{Xa>&-sJ$c1;_<%SUqI<3`iZKT29in4uA4Ds*ZfYi^%=)1@I2b2p{@78|;W)V)qyT?XsH?bw@C+vo zSX`==P@H`Qu!dhkdhV{_9ZJ}fOQcRXlH2Qav8FOr7xeHh>XKE*l1ONO6-H1*IJQ5O z|K=hQ*QA)?kWMBMr?^H!6#XO{Z`jY3^f)q$7B>JAGB1~s17^bUUd zV%Y#c6S5p7dbOZ$`#t=y9zw5zS)%LFxVEH$9VKg^DY@B}?8&H~t(h0HikP@M>vt3j z)d7F$@e(u%(gitdxuWE^w~HI!tq`u?a2_mP|tQVCn` zg?+F!GV20OGK%X|xU7Om?U*K06Q;9DnVFLOO(>0Ks5_{0p{m`A_&wX9@D9lhb#+Rw zeau5^IN}Zz(W)~IK3h1+qHE!C5=eS;B%V{>zOH@VZdXM}rPq2uVO{K?cf}GpdsO2n za?`CP`{RIk(VYkB$I~bBq1<-~X85pQX?IagZQ2#{4<$cue?FuWz#k@czxa93MYF4s z65hMV{CysTA48Xd1*v*?&XhO3 zULsj|h4rV(=bi@HLVi#$wT8@Ut8ZI+Asl5HSp6U0$&B)h{6IG*C39Z|1t zJ#*xga#u{7M1hxgC$ivV2+dYJ|Kyxs3RhSuI$J$yg4LxRu{}M~WEwywnAD%Qe}U_u zHbT2|Dz+8z$O0Q)w;#+tv$cyyJ#(oA=cq37$(1~n^`1!6V!!B450}B6c1O6^CVOok z6~MQ)%@;O2BmVNu3db4xO`4*#FKCn4GljTWbZXOPpk}?dR9-TI$*lw*FWNRnqvyW5 ziUn&v_hpu*ggVF$4(~;T+0U-?Y8KIuH{B9Szdp;lB$w)`IZuZ-3!7_vz{y zpL8p$C7v)`O!{(^mSK*NxgLa}Y_x*i7Y07^(e7pM0h zw0ByGBkXl z;4R8a6ZVMbSHR9KjidoBO>2HJk@{whJd8x*xPn80ZaH^H2sLmi>gVY&;c9K!?GG5t z?#Dmnyy)Nx_1Gj2^9B#{cWUi@S(vH5B>#!f1X2ptGlagKj8OKM@xzBu*#B5uja3`+ zFTps&FXv>fsHC`c2mv?W9#=gPC=;oyrx9Qf*98j_s#Dek9>il9U(yME;6C^OjK7nX zkZGxAY$_b4LENya>iYIeu=;pr$BsG;xmtzjf}mPo(|4&oMY~kWX8m#Ml)=Pn1`gC6 zE85O}c}Ym_IL7JAQFzSl+kjHLX1E!@!t*IL%Qm#R-|H3^Q*%^J4mJEldQ(oXVN3bg z_?ND{ycEfw87*F7%DayKN>hB+-@Ky^-q@?Nf0G)Ggmwz90m z1DuL)S&)$7aEBG8@U=7=CaYzGwku;jI*U*szA?NS3a$jN@K!&zrz$-``}eNoTfSVb z>TBJM39s2(hu>fsm$V_j%zuZCCRk$~7Nfmj44!--_LAyXA9YhK z&fBdQ%)FTIaUfVhXjLqE#}Eu!cBVPmn+6Hmy#m^o6E%X2 zX&?%e9Nrc+4PigFse#L;kk9(MxY6eNS_Qv>56gw0i;OU^u8Yytj03bb<5m(5?#hjb zJ*Z57e+#h#bEa{YaxUpl=^+Y>J33Hg0#1p&el*z!kZPn(IV3EHDCT(`C_2_TQ05b% zF=-GuEwGV_cEpa^em`epoe+qXBfIz*n`O(KQMBgTK5*BBpQ(Gvk(Q5Mz)5KOEb=@R zU_XHRQ8!I8mD+rb@SOE)u@jkJ>WFGwp)OdsYG0Q@7tA2~{;kl1$2CbJpz>3Lmy#D; zRbl7`F0wB|m)hneRM3JOWwPG@K$$f+vpWf*c4AqBqz=)WuDsIbyb-`4BBL{2FzDkFd4)1tEd zJ|Onv5#c;cB|7@io+G`Hybf_T=E41E>gU~`b^z}+`wE82SbVG$a~r+25_fLtLC*GQ zg$0;RbOr+LG{XwXB~-*4aC!#Qu?Q}kvMd#h2hmXR-(TXi*8P}zs#Fn^GIYbc$Y#?0 zN`li@sXPosr*}YaSYmB}v<&TRwMD530h07FQw5N5ovG>exgh>Kg{5FKWZwib#Wdd` zBv_(4s?&PINIApua|wSmzvd{(J4??BTXEJG-!$nHD{OdC|3Gx88FJCqP)zo+Er)E+ z_muo4%#>lW^MofHnqiC79ieh8-l3wkWwod+3!7=qgG`w0QJdi()QpSu#d3bItjI(7 zX&EET;GZQX_S8+}dVi9;*YT@hYOai+g!q~6X7YDO6;o>hF1N$Y2|xO6cP2#gwTj*9 zl9_cC)d7;RhN=p#d|oPFB_O5C%X1t>N(s|wHm`u)4_#G?r-X?qrm)x59f5YwrmZ&{ z5!ywjP1fLms-zs`5y;VB|7cPsfXR*6a3eUgp zEDqr5NLnL977LRs6qxPGNVSIAGi?&SR<<*SZDDE6S;SmfKb2YYt=hCBGQVg1%EJ3g z`41pw!6({7-`|6b*C6iT7Ic7!R@*|Q@7l5twI2w@O-nJOpyP?nK>(z8O)-!{`Q{%5rIMMaS${hh4Z}|`lp)+em3d|Z6#l2VO@|T8!nj5FRWUngM zuNd5_uiZ*xaTtz8Q-4ykOOk4W6_Xx){X7Odeb~ubO2~ymq#%!+n@CrKWj{-!D8H`kWS;)UCgNmdVshdkCJ=$ z1FHIu_Ll3H_-ESXdyH?Czf*ytuy@z$yv*lHXyjI3noU5!6IH0T;?->Os9Rp*bc-o1P8z1Fin{dCSy8EH`xeJ~u8i!qgR zGw?+zq{Pju&@NZRH>>*K2$-zUad20F-}u-+HtkJNtShh7bv2BX#?AL5crsG=LT8`r?R zx1B%j_c@)ZlG3dQ>a7Gh7D~~zCdWcF3)T48?Y|e!a8E`g&W0K2__bEF(wUhY)O`X# z+E?|Gxf=N+Ami*eK)&CHCB6=ZhayP(j9dH z)$*QX^+~bA>ippoFwS6jyHwv1(Ge+}Sp;V^?!{Al(Xpu~2Xo7P5LHc}p#XE$Wv=~l zQK(q}1s*=0|^49>*i$-@4YmNpwEWB0mDBSC- zhi%Yo;{Ux3H)Nw9)yv*|`+Cl-#1<3e0K7ll4VT|um z#dUe;5E_irs+3u?849G^E=A?%lD|qtQ*wFSRpX|;=RW})#j3Jg<>xbV6n3ps*ncTE zQ*eurUmM@wke-u9sTVO%HT1sdFUbba4m#@FWzP;$U4P3TYX3$s)g^-wOHiSbm0}Os z{7kD7UMv++zfopQt1!#bi6(1y=v|I8Pzmn*!&lYzEMm9-`Ykj9-7(A&YV+(7P_ckf z_YEjdF?4K(jW(TT28qTH1y*J%!0QSV#8JQmvCHwic2RS3v=I(5SLtZ|li8(9REmwidc zx3&2!Y*{VDAuR7%@tB9myY&$%wfFKJlnj>Niy)E~64FQFZDun5=Cl7O5_DF8QVg#I z9u>@9!UDLrFj+;U^t(qF}zha&UYnHEVbx}KTu7;SW_osvkj$;EpNI7K=I z@4qF-=P@wvt4sTd>By|cVX0NIXed}GGIx_Fx1-F@#b1neL<*_J3JX7U|4Z3x%Yobz zO*D>4CmQIEw#oleqYj_J6XjRmsV#ICMh}W&zb1a^YgVZYE8h5VmmSa&J17XOW=GdMk~`s)ke%@zL!Nuxdu1f4-+mZ@$JL)|Fl3AAnsTH{{erR|F`*{M7Q}> z^!?(OCBFD&aByfy1V{*IXt4jl<}ZR7l>`FiJCl$CF{yzABeSsL7p+{=J-vMeiDu|1 z=yXjcuM|+*gU%xIH-Bcw$k{*e|1r#n0$&XC&8k7f(tNW=RnxqWG!60P`s>doy2^mJ zNwJzyGN{`7d+dUcWQ8!TAC2Qa6ps?Dx^>PYt9j|zM;NsgE9#i3v=@#Cc%J~rPry)t zs+lZvNv?sCd>LhaWeE;SX9R<6bL<-LCfj<^czJpc^#{sz$#}mZ6H)9y!mzGvh-rDP z7N&waS+tkD#+8s^#3)1!5)1R2zDU%CTam&vmRf5?B&5OR#z^h9n4r!CJZk)#di!lz zuOM+iv^a1Jxg%^%0qzyELA-Abozw02F6%amAKEBCK019>>cR?*)%F^w!}cCFge`z3 zP2y*HnA{l~;rElAz9m28q=w%=HJFYin*3=F^6-gPjV4nA@j6|V&HQteHnlv2`XAWJS zA}4_nKV88x-EkZe&#&;aPz~h=5#J15nG1PjH*H*=Z%4|g3+trkPtG=i%O+?)BxZPJ z?|=8}TTdKq*XQd)05BWDVB1O<^5bhaQ1&_C>M#`HS^4R2fZQu9;WNdZ7h4x4=m5A( z*X`c+?gCb@I1pI;H5?K|UfeZhO1<+mEQOyF0#8CFH<>t$yBs3%C*ZyXMq%{XPvzGN zjh2VrN{Kk{VGjKr7%h=tTlr)mS?NvVElm4-cU}!%`X=j!7A~E0JfJgD!tIxG)AdtR~(HOJGmp` z=iM5{+_-Z7%Jv9$bC} z9XW9OPLs2KHgDG`|D610r@co?wo%$pkdeN-wJ$76lwfDnO0V5Y_hx!QlOlWz@sdv= zevNG_JyC#6L~hnagt2WkEZmi2W|&tPT@mD2#?eQ#7ogwpRuLM0CQZ6Ich<@?m2m9c zK7SBhZ!lPx=zeG8q`lGm<03=gx9rY44Bh+^+n{XN10g0Gzil;{l_7TX*yUE~7&;>D zC2<%}gZyJDV|!57sz$m-{MDHC{xD_0}nXdEJlyv5q^ zPFeF#k$hF#f2kU|*E3ve#aiP{**pT>X&RtK{L9SlILQ4ZycksE5F8uFm}ZUN#YTpo?JV+nZ@i zyGW`u6C^3tDBGw^`nuB9cIZ)w1-z0S4oR0hZ!hKf20FY>oP^a$Szdl7=lQuYwU~c-UHh7R8}*Yq=U3! z3=4KsA814G^5FR&?TeHYMca=0s7cDNo!AjOhStai?)0Q#JaZQj_`1s3X;vGU_Ee&O zN^!`-y?<;qxJ(K^M+f~V8Bbr8^m1u;x0EE^C_sjiwi`w*ggS{E(2mLsk76h&Tw(t5 z`}vEHR=ApSpQ*;f@@G4MId7@7RA*p@R(WU2N(`y0j-vo7nMh$4;clw;| zO3p_%d;e|=r;bEGA6x+kjm#fTJ3Us*tuITDftOKDufY@q3;c|!+wTYt~s z$@d#5bo3)J3N3(iQ54vP&`{ZuIo&+3#*2(P?rB7@X~Jg=*uQ;uS9SzXQH*bkp?Z5F z@{vrOfIir1&NXP^P<3lEjqOuNLAWJ|S8##P9?m$2z2oxcN(iNv|5l&FC;@?8;C;D~ zXF4nWBN(T^cJ$v;>I)YOs<~(xJY54`l;On?3DBy8|9l?fDi<1oqrmCvv8jeo874Le z?P=hz!v+ZZZ9tZ}PeqD7x;fY@5Yn379R3Fdq21rUY4}z(Rs)^Rb6z%o&)70rB!w_C z@!=rU!)t=sfT8$b)6IKnWwb*sWUuT#1@qi$q6DF$Tw|c)9=Mpy8HME6RY<$pOF1Tr zPT~0N`sl--L%oqFp+AHndTYR(vg~Sjm%R*(yEe%MU)i~OApz_kd5lWyqw!GeszPZZ zahw-7!Y4nkvpU?4;Kcppx628yR2X{wJv)>fsBzJ4&(XI*`7{R30*})!U{mPoK_Zod)l$1gY7ye;y{H86DCv9yk_lA=o}G;wzEJ;i31S;2k%#!@jmchl zr@?Jn+d{z@f)7!(R^^&Rvopo?w||`DZgX`iMtt(FM0eWiUYT{;VoBnt(HtUQ(<>fz z+orb$hSLqWmzR6%f|@>(9x;YNSn{Vu>)FU&AiwzL9n^Z9Xy`7c!{~iQ<={=N8;PLpM~mJP|`>6k2te zsBOo`{E@cRM^Q>*{rlcsE9$9z#Kg`*(+Cj3=+VMi>nprP<3)K9UjWK49A{zJNM;#p zV%0@a)q@eFP|YGt0%IY*>cBpEGy|q%JhT)~HjQxMJyXe`fGB(kM=T%eVO4NW3~Yr? zx?ogrW*TB1Gjs-P7cb)&aGjCphYU0V^^yS!>xKS62TCWQ^bg12FS5cfJqqtt_~-(b zkd2e?NSD)InCQDV7KwPfFmH1FkIS7}BgevG^R@8)DLsW~!Ek(^jTSA}3fq&C1AKeA zaKur@SVLdxVOa;6OY!?5V(Fh|69YhUbqsVD!msUVcURK$)-c#ep#3q6P=_lm>m10% zkBKp~qdxPzAcoTT`cupbG5in0{jY>qo`d6uGuV9~4j;N7P?@;JwKxRHfHot`pvA zlkypYYzn3tYiD|fg2h#vUQ{a9RbjhU2s%Q_TS^NmU{40zD&?}&#x`oohE<_#t#ip3 z)BVhxW_*DsDpr55kxJ!Q$q^ zXjI&QF$ET?S#=fbllXGv+q%Sg;db&q6CXhj(CmEz90Y}#{87h^UQMgUEUmZjdC@X2 z?g-%WD@2|Db@cUm7VcV++|$RBPwzEBJyg~BWCPFc^(=0+V$+Ycml8*`C@ir`7L(!a z&G{lYh}fza_Vu(3W9Y0g{s!4W;+9GaV?WHvOfBUpA;*?^bx1m&U>ba!EW3-v;Z>El zNT^h{XDaZPRK&v)azg)aH1c5q!r_BANXNI6)77l$Ptim4NS3|r1MUKXcn{{viQj5J;PgAQOc`(uY&zN5vQ{cBYp!$-qP2nAfdXaZ{@tl^9^Pq z^_A&G2beV8rpQ)6S$^o-P9TiqTjux;l%2O^xoP3Eq=fZep}`t;iVsP~FjcD;QI(ei z5pO;P!fSE5NIA!6`;(LaPKB7;+-oyUi=JU{P4;$YNpM6jJKMLZea1YhxIdvI1)UX) zf?xrRP|Hx?v^1tbgp?cbu|7$bOySpp=C)!pTFHXSzX%FK(B&@lC_r%2&MNU*W`J6s zZ9U`7g96gq?3p3#ICM9=BRha#01anOJN)@)}c$M64Im`d� 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

s0jUz)uIr^+=!kTTGGW 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-07-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-07-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2753ad68d7d52511ada562aee1bee38d431f5e90 GIT binary patch literal 2076 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

TjNaq~i@oSx>S3t6z7EInpRJVrjBjM7E^? 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 ax;cA|gzn5;K*o&RGx9&r+JBJ$e-i+nE_|W@ literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-08-02.jpg b/src/assets/images/apps/ecommerce/products/watch-08-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..335fbb48758d3d53a3b6604f925a96110278fe35 GIT binary patch literal 51869 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 V`;XAHhK9SAkjR#MkN)<*|Jh__SrY&N literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-08-03.jpg b/src/assets/images/apps/ecommerce/products/watch-08-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e3162b46f4583e5c1fac7138224cad7bc0ad6f9 GIT binary patch literal 63582 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

^lkySKl++slxj`&wH*$(wv<-H+fEgbkT@N6 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 M9DRM-na-X38|B}}F8}}l literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-09-01.jpg b/src/assets/images/apps/ecommerce/products/watch-09-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eba97a1c45608fdc8a8c9f0f30a89bc23087809e GIT binary patch literal 31325 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�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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-09-03.jpg b/src/assets/images/apps/ecommerce/products/watch-09-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd17083e949061e07f06e9dd10a2cb348a2d359d GIT binary patch literal 30309 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 IoKRxaVR3gB4YshjLxA8OT$A7gP0$1ql1uXD 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-10-02.jpg b/src/assets/images/apps/ecommerce/products/watch-10-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7105693c6e017f70d2c36f5262b03131ccab1ffe GIT binary patch literal 35374 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

G-Ai`%4u#6d?z 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 RoF}pha4%1!SV!D%|Jg(XgiQbd literal 0 HcmV?d00001 diff --git a/src/assets/images/apps/ecommerce/products/watch-10-thumb.jpg b/src/assets/images/apps/ecommerce/products/watch-10-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a5ce1b10bfc7302d8dd5626610d2d394810099a GIT binary patch literal 1738 zcmb7^Yfw|y9>vc|LK2NaP7ov*5)x1pC>O989tju_NNl3Dv~Z%#1>z7;dFm(#V!1GKKsp1ca>^G)5nb)hBO(wvhjC>AC<23mgO(NDu-L z5Qv08T{mC`00;yU{M7fq!lE%C5~YXO0FSrAlmDH;Z$Jc6_ZrxQ1OWsdiH9#zB%hqO zs8P8)SEm4=?VYgulGbqKYjDDoSAJd)>KW;p0P^w(;|;1Hd`bdU#^rnViJ7RrhD!Zn!!sadh&{wU0$5 z_8b`z33uCrhpQt%Bm#v*;Xe0=tD*EDG(ezY9I$vp7A=@-?#Mg4#mLyiV!Qor&z#G3 zaCI#FA%dIYchwSJrTUGk!>_Ccj%#jR_*5@kwRF|7$@{DRW16rNz`bqyIli`+OA`%R-k z1Ew87sm)G#-%`0pSaH&#+jo;=_Va4ttRv5(j-NXY}IzPVYtCKH-}{l9&P_*NKQlY zZRQ%iv~za!_Yg~wt>|9N31WCA{&ewx0^QsDRuN_0d=jT}>ZmDSj(o9Mu$~dU7Q~m@ zM7Lto3$IsX6n@2O3^_g*UScROSs5V!iy!>7esmR){yu%T9l~XN-r<+fnX3K+d*?V# z_vk{c%vE{MCvL;#d?;XR-8s;#w|F!n!>}z+$pu3mNz!#Cy zf47LQ2G3k!E3FE4QHeh4dqnqjB7bPlvv_`3WQ&k|;o*Uv5|gZjoJF-@=HTRS&yMSW zK~XgFiwu!TA2Hu6{^33YQ|p@J9?x$}W5rrOUK?*v+6p?P<$29L???aS)2>*~=t;Q~ z%r-LfUCfP{m`E+EloSMfg|m~p=ki0a-j>a!{5x-j??)_b=UwF@{#Z$`jd8_0Yw*?L zn02Fg38|VLw<_mw`y*Bnb__xRt^1BDJR(n)nQPVcZSq}j2Ny;Xwf3*gK#6Si__DqZ z2=Uma@p71;REF&FX~cX!OkOi!;sah^d6Yje!C&Z6bo0 zL+8!;7q?1rsLe$$+3}S7;Z@VIjw>SeSK=i_At+ zC09Bs!SR30KNg;_A0>#Zaz5H9|3P!JDK`2hLt~bG+FbGD=yTJs|E!ncYiw0+PSGAd zP85O7uAsfHmWC_$ACJ$J7N-YK1s2!X+Pas{HHXi=EVEvo6>4$9;aYuUy@yl6;Z66K|R||Iy-)yE>1xe)KzJF zfrJ}!OTMz*^X3!Y?AY&j-CkFa{kR`Ln&o`|zSPBxcCPRVM*F0mKgZxt*V~6rG7